drm/i915: Serialise read/write of the barrier's engine
authorChris Wilson <chris@chris-wilson.co.uk>
Tue, 13 Aug 2019 20:09:05 +0000 (21:09 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Wed, 14 Aug 2019 09:09:21 +0000 (10:09 +0100)
commitf130b712ff259f03feaf7a245e3464e3faad89ae
tree7f6cc7fdd70ab2aca778d5fcd441f1340ec6ab55
parentb26496ae786d5f352a546ebdd4e54dc416e74f6e
drm/i915: Serialise read/write of the barrier's engine

We use the request pointer inside the i915_active_node as the indicator
of the barrier's status; we mark it as used during
i915_request_add_active_barriers(), and search for an available barrier
in reuse_idle_barrier(). That check must be carefully serialised to
ensure we do use an engine for the barrier and not just a random
pointer. (Along the other reuse path, we are fully serialised by the
timeline->mutex.) The acquisition of the barrier itself is ordered through
the strong memory barrier in llist_del_all().

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=111397
Fixes: d8af05ff38ae ("drm/i915: Allow sharing the idle-barrier from other kernel requests")
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190813200905.11369-1-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/i915_active.c