[Intel-gfx] [PATCH] drm/i915/gem: Remove shared locking on freeing objects

Das, Nirmoy nirmoy.das at linux.intel.com
Wed Aug 3 09:06:48 UTC 2022


On 8/3/2022 10:56 AM, Matthew Auld wrote:
> On 26/07/2022 15:48, Nirmoy Das wrote:
>> From: Chris Wilson <chris at chris-wilson.co.uk>
>>
>> The obj->base.resv may be shared across many objects, some of which may
>> still be live and locked, preventing objects from being freed
>> indefintely. We could individualise the lock during the free, or rely on
>> a freed object having no contention and being able to immediately free
>> th pages it owns.
>>
>> References: https://gitlab.freedesktop.org/drm/intel/-/issues/6469
>> Fixes: be7612fd6665 ("drm/i915: Require object lock when freeing 
>> pages during destruction")
>> Fixes: 6cb12fbda1c2 ("drm/i915: Use trylock instead of blocking lock 
>> for __i915_gem_free_objects.")
>> Cc: <stable at vger.kernel.org> # v5.17+
>> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
>
> Looks to be missing your sob.

True, I missed that.


Signed-off-by: Nirmoy Das <nirmoy.das at intel.com>

Tested-and-acked-by: Nirmoy Das <nirmoy.das at intel.com>

Nirmoy

>
> Reviewed-by: Matthew Auld <matthew.auld at intel.com>
>
>> ---
>>   drivers/gpu/drm/i915/gem/i915_gem_object.c | 16 ++++------------
>>   drivers/gpu/drm/i915/i915_drv.h            |  4 ++--
>>   2 files changed, 6 insertions(+), 14 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object.c 
>> b/drivers/gpu/drm/i915/gem/i915_gem_object.c
>> index ccec4055fde3..389e9f157ca5 100644
>> --- a/drivers/gpu/drm/i915/gem/i915_gem_object.c
>> +++ b/drivers/gpu/drm/i915/gem/i915_gem_object.c
>> @@ -268,7 +268,7 @@ static void __i915_gem_object_free_mmaps(struct 
>> drm_i915_gem_object *obj)
>>    */
>>   void __i915_gem_object_pages_fini(struct drm_i915_gem_object *obj)
>>   {
>> -    assert_object_held(obj);
>> +    assert_object_held_shared(obj);
>>         if (!list_empty(&obj->vma.list)) {
>>           struct i915_vma *vma;
>> @@ -331,15 +331,7 @@ static void __i915_gem_free_objects(struct 
>> drm_i915_private *i915,
>>               continue;
>>           }
>>   -        if (!i915_gem_object_trylock(obj, NULL)) {
>> -            /* busy, toss it back to the pile */
>> -            if (llist_add(&obj->freed, &i915->mm.free_list))
>> -                queue_delayed_work(i915->wq, &i915->mm.free_work, 
>> msecs_to_jiffies(10));
>> -            continue;
>> -        }
>> -
>>           __i915_gem_object_pages_fini(obj);
>> -        i915_gem_object_unlock(obj);
>>           __i915_gem_free_object(obj);
>>             /* But keep the pointer alive for RCU-protected lookups */
>> @@ -359,7 +351,7 @@ void i915_gem_flush_free_objects(struct 
>> drm_i915_private *i915)
>>   static void __i915_gem_free_work(struct work_struct *work)
>>   {
>>       struct drm_i915_private *i915 =
>> -        container_of(work, struct drm_i915_private, mm.free_work.work);
>> +        container_of(work, struct drm_i915_private, mm.free_work);
>>         i915_gem_flush_free_objects(i915);
>>   }
>> @@ -391,7 +383,7 @@ static void i915_gem_free_object(struct 
>> drm_gem_object *gem_obj)
>>        */
>>         if (llist_add(&obj->freed, &i915->mm.free_list))
>> -        queue_delayed_work(i915->wq, &i915->mm.free_work, 0);
>> +        queue_work(i915->wq, &i915->mm.free_work);
>>   }
>>     void __i915_gem_object_flush_frontbuffer(struct 
>> drm_i915_gem_object *obj,
>> @@ -745,7 +737,7 @@ bool i915_gem_object_needs_ccs_pages(struct 
>> drm_i915_gem_object *obj)
>>     void i915_gem_init__objects(struct drm_i915_private *i915)
>>   {
>> -    INIT_DELAYED_WORK(&i915->mm.free_work, __i915_gem_free_work);
>> +    INIT_WORK(&i915->mm.free_work, __i915_gem_free_work);
>>   }
>>     void i915_objects_module_exit(void)
>> diff --git a/drivers/gpu/drm/i915/i915_drv.h 
>> b/drivers/gpu/drm/i915/i915_drv.h
>> index d25647be25d1..086bbe8945d6 100644
>> --- a/drivers/gpu/drm/i915/i915_drv.h
>> +++ b/drivers/gpu/drm/i915/i915_drv.h
>> @@ -247,7 +247,7 @@ struct i915_gem_mm {
>>        * List of objects which are pending destruction.
>>        */
>>       struct llist_head free_list;
>> -    struct delayed_work free_work;
>> +    struct work_struct free_work;
>>       /**
>>        * Count of objects pending destructions. Used to skip needlessly
>>        * waiting on an RCU barrier if no objects are waiting to be 
>> freed.
>> @@ -1378,7 +1378,7 @@ static inline void 
>> i915_gem_drain_freed_objects(struct drm_i915_private *i915)
>>        * armed the work again.
>>        */
>>       while (atomic_read(&i915->mm.free_count)) {
>> -        flush_delayed_work(&i915->mm.free_work);
>> +        flush_work(&i915->mm.free_work);
>>           flush_delayed_work(&i915->bdev.wq);
>>           rcu_barrier();
>>       }


More information about the Intel-gfx mailing list