[Intel-gfx] [PATCH] drm/i915: Rewrite some comments around RCU-deferred object free
Tvrtko Ursulin
tvrtko.ursulin at linux.intel.com
Tue Jan 16 09:36:22 UTC 2018
On 15/01/2018 20:57, Chris Wilson wrote:
> Tvrtko noticed that the comments describing the interaction of RCU and
> the deferred worker for freeing drm_i915_gem_object were a little
> confusing, so attempt to bring some sense to them.
>
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> Cc: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
> Cc: Joonas Lahtinen <joonas.lahtinen at linux.intel.com>
> ---
> drivers/gpu/drm/i915/i915_gem.c | 19 +++++++++++++------
> 1 file changed, 13 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
> index 87937c4f9dff..98bacaee2720 100644
> --- a/drivers/gpu/drm/i915/i915_gem.c
> +++ b/drivers/gpu/drm/i915/i915_gem.c
> @@ -4699,7 +4699,8 @@ static void __i915_gem_free_work(struct work_struct *work)
> container_of(work, struct drm_i915_private, mm.free_work);
> struct llist_node *freed;
>
> - /* All file-owned VMA should have been released by this point through
> + /*
> + * All file-owned VMA should have been released by this point through
> * i915_gem_close_object(), or earlier by i915_gem_context_close().
> * However, the object may also be bound into the global GTT (e.g.
> * older GPUs without per-process support, or for direct access through
> @@ -4726,10 +4727,15 @@ static void __i915_gem_free_object_rcu(struct rcu_head *head)
> container_of(head, typeof(*obj), rcu);
> struct drm_i915_private *i915 = to_i915(obj->base.dev);
>
> - /* We can't simply use call_rcu() from i915_gem_free_object()
> - * as we need to block whilst unbinding, and the call_rcu
> - * task may be called from softirq context. So we take a
> - * detour through a worker.
> + /*
> + * Since we require blocking on struct_mutex to unbind the freed
> + * object from the GPU before releasing resources back to the
> + * system, we can not do that directly from the RCU callback (which may
> + * be a softirq context), but must intend then defer that work onto a
> + * kthread. We use the RCU callback rather than move the freed object
> + * directly onto the work queue so that we can mix between using the
> + * worker and performing frees directly from subsequent allocations for
> + * crude but effective memory throttling.
> */
> if (llist_add(&obj->freed, &i915->mm.free_list))
> queue_work(i915->wq, &i915->mm.free_work);
> @@ -4745,7 +4751,8 @@ void i915_gem_free_object(struct drm_gem_object *gem_obj)
> if (discard_backing_storage(obj))
> obj->mm.madv = I915_MADV_DONTNEED;
>
> - /* Before we free the object, make sure any pure RCU-only
> + /*
> + * Before we free the object, make sure any pure RCU-only
> * read-side critical sections are complete, e.g.
> * i915_gem_busy_ioctl(). For the corresponding synchronized
> * lookup see i915_gem_object_lookup_rcu().
>
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
Regards,
Tvrtko
More information about the Intel-gfx
mailing list