• C
    drm/i915: Refactor activity tracking for requests · fa545cbf
    Chris Wilson 提交于
    With the introduction of requests, we amplified the number of atomic
    refcounted objects we use and update every execbuffer; from none to
    several references, and a set of references that need to be changed. We
    also introduced interesting side-effects in the order of retiring
    requests and objects.
    
    Instead of independently tracking the last request for an object, track
    the active objects for each request. The object will reside in the
    buffer list of its most recent active request and so we reduce the kref
    interchange to a list_move. Now retirements are entirely driven by the
    request, dramatically simplifying activity tracking on the object
    themselves, and removing the ambiguity between retiring objects and
    retiring requests.
    
    Furthermore with the consolidation of managing the activity tracking
    centrally, we can look forward to using RCU to enable lockless lookup of
    the current active requests for an object. In the future, we will be
    able to query the status or wait upon rendering to an object without
    even touching the struct_mutex BKL.
    
    All told, less code, simpler and faster, and more extensible.
    
    v2: Add a typedef for the function pointer for convenience later.
    v3: Make the noop retirement callback explicit. Allow passing NULL to
    the init_request_active() which is expanded to a common noop function.
    Signed-off-by: NChris Wilson <chris@chris-wilson.co.uk>
    Reviewed-by: NJoonas Lahtinen <joonas.lahtinen@linux.intel.com>
    Link: http://patchwork.freedesktop.org/patch/msgid/1470293567-10811-16-git-send-email-chris@chris-wilson.co.uk
    fa545cbf
i915_gem.c 123.3 KB