mirror of
https://github.com/torvalds/linux.git
synced 2026-05-28 17:13:52 +02:00
drm/i915/gt: Clear the buffer pool age before use
If we create a new node, it is possible for the slab allocator to return us a recently freed node. If that node was just retired, it will retain the current jiffy as its node->age. There is then a miniscule window, where as that node is retired, it will appear on the free list with an incorrect age and be eligible for reuse by one thread, and then by a second thread as the correct node->age is written. Fixes:06b73c2d0b("drm/i915/gt: Delay taking the spinlock for grabbing from the buffer pool") 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/20200915091417.4086-3-chris@chris-wilson.co.uk (cherry picked from commit9bb34ff25c) Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
This commit is contained in:
parent
ba2ebf605d
commit
922d369b29
|
|
@ -134,6 +134,7 @@ static void pool_retire(struct i915_active *ref)
|
|||
/* Return this object to the shrinker pool */
|
||||
i915_gem_object_make_purgeable(node->obj);
|
||||
|
||||
GEM_BUG_ON(node->age);
|
||||
spin_lock_irqsave(&pool->lock, flags);
|
||||
list_add_rcu(&node->link, list);
|
||||
WRITE_ONCE(node->age, jiffies ?: 1); /* 0 reserved for active nodes */
|
||||
|
|
@ -155,6 +156,7 @@ node_create(struct intel_gt_buffer_pool *pool, size_t sz)
|
|||
if (!node)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
node->age = 0;
|
||||
node->pool = pool;
|
||||
i915_active_init(&node->active, pool_active, pool_retire);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user