Commit 52144db1 authored by José Roberto de Souza's avatar José Roberto de Souza Committed by Jani Nikula
Browse files

drm/i915: Fix preallocated barrier list append



Only the first and the last nodes were being added to
ref->preallocated_barriers.

Renaming variables to make it more easy to read.

Fixes: 84135022 ("drm/i915/gt: Drop mutex serialisation between context pin/unpin")
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Signed-off-by: default avatarJosé Roberto de Souza <jose.souza@intel.com>
Reviewed-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Link: https://patchwork.freedesktop.org/patch/msgid/20200129232345.84512-1-jose.souza@intel.com


(cherry picked from commit d4c3c0b8)
Signed-off-by: default avatarJani Nikula <jani.nikula@intel.com>
parent 5b92415e
Loading
Loading
Loading
Loading
+10 −9
Original line number Diff line number Diff line
@@ -607,7 +607,7 @@ int i915_active_acquire_preallocate_barrier(struct i915_active *ref,
					    struct intel_engine_cs *engine)
{
	intel_engine_mask_t tmp, mask = engine->mask;
	struct llist_node *pos = NULL, *next;
	struct llist_node *first = NULL, *last = NULL;
	struct intel_gt *gt = engine->gt;
	int err;

@@ -625,6 +625,7 @@ int i915_active_acquire_preallocate_barrier(struct i915_active *ref,
	 */
	for_each_engine_masked(engine, gt, mask, tmp) {
		u64 idx = engine->kernel_context->timeline->fence_context;
		struct llist_node *prev = first;
		struct active_node *node;

		node = reuse_idle_barrier(ref, idx);
@@ -658,23 +659,23 @@ int i915_active_acquire_preallocate_barrier(struct i915_active *ref,
		GEM_BUG_ON(rcu_access_pointer(node->base.fence) != ERR_PTR(-EAGAIN));

		GEM_BUG_ON(barrier_to_engine(node) != engine);
		next = barrier_to_ll(node);
		next->next = pos;
		if (!pos)
			pos = next;
		first = barrier_to_ll(node);
		first->next = prev;
		if (!last)
			last = first;
		intel_engine_pm_get(engine);
	}

	GEM_BUG_ON(!llist_empty(&ref->preallocated_barriers));
	llist_add_batch(next, pos, &ref->preallocated_barriers);
	llist_add_batch(first, last, &ref->preallocated_barriers);

	return 0;

unwind:
	while (pos) {
		struct active_node *node = barrier_from_ll(pos);
	while (first) {
		struct active_node *node = barrier_from_ll(first);

		pos = pos->next;
		first = first->next;

		atomic_dec(&ref->count);
		intel_engine_pm_put(barrier_to_engine(node));