mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-30 08:02:30 +00:00
drm/i915/gt: Pull release of node->age under the spinlock
We need to ensure that the list is valid prior to marking the node as retrievable, otherwise we may see two threads compete over the same node in intel_gt_get_buffer_pool(). If the first thread acquires and releases the node in the same jiffie, the second thread may then acquire it (as the jiffie now again matches the expected value) and claim the node before it is put back into the list. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Reviewed-by: Matthew Auld <matthew.auld@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20200730134049.8822-1-chris@chris-wilson.co.uk Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com> Signed-off-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
This commit is contained in:
parent
d1bf5dd8f6
commit
13106019f7
1 changed files with 1 additions and 1 deletions
|
@ -134,9 +134,9 @@ static void pool_retire(struct i915_active *ref)
|
|||
/* Return this object to the shrinker pool */
|
||||
i915_gem_object_make_purgeable(node->obj);
|
||||
|
||||
WRITE_ONCE(node->age, jiffies ?: 1); /* 0 reserved for active nodes */
|
||||
spin_lock_irqsave(&pool->lock, flags);
|
||||
list_add_rcu(&node->link, list);
|
||||
WRITE_ONCE(node->age, jiffies ?: 1); /* 0 reserved for active nodes */
|
||||
spin_unlock_irqrestore(&pool->lock, flags);
|
||||
|
||||
schedule_delayed_work(&pool->work,
|
||||
|
|
Loading…
Reference in a new issue