• Chris Wilson's avatar
    drm/i915: Do not overwrite the request with zero on reallocation · 5a198b8c
    Chris Wilson authored
    When using RCU lookup for the request, commit 0eafec6d ("drm/i915:
    Enable lockless lookup of request tracking via RCU"), we acknowledge that
    we may race with another thread that could have reallocated the request.
    In order for the first thread not to blow up, the second thread must not
    clear the request completed before overwriting it. In the RCU lookup, we
    allow for the engine/seqno to be replaced but we do not allow for it to
    be zeroed.
    
    The choice we make is to either add extra checking to the RCU lookup, or
    embrace the inherent races (as intended). It is more complicated as we
    need to manually clear everything we depend upon being zero initialised,
    but we benefit from not emiting the memset() to clear the entire
    frequently allocated structure (that memset turns up in throughput
    profiles). And at the same time, the lookup remains flexible for future
    adjustments.
    
    v2: Old style LRC requires another variable to be initialize. (The
    danger inherent in not zeroing everything.)
    v3: request->batch also needs to be cleared
    v4: signaling.tsk is no long used unset, but pid still exists
    
    Fixes: 0eafec6d ("drm/i915: Enable lockless lookup of request...")
    Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
    Cc: "Goel, Akash" <akash.goel@intel.com>
    Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
    Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
    Reviewed-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
    Link: http://patchwork.freedesktop.org/patch/msgid/1470731014-6894-2-git-send-email-chris@chris-wilson.co.uk
    5a198b8c
i915_gem_request.c 23.4 KB