[Intel-gfx] [PATCH 02/26] drm/i915: Skip shrinking already freed pages
Mika Kuoppala
mika.kuoppala at linux.intel.com
Tue Jun 18 16:06:36 UTC 2019
Chris Wilson <chris at chris-wilson.co.uk> writes:
> Previously, we want to shrink the pages of freed objects before they
> were RCU collected. However, by removing the struct_mutex serialisation
> around the active reference, we need to acquire an extra reference
> around the wait. Unfortunately this means that we have to skip objects
> that are waiting RCU collection.
>
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> ---
> drivers/gpu/drm/i915/gem/i915_gem_object.c | 47 +-------------------
> drivers/gpu/drm/i915/gem/i915_gem_shrinker.c | 5 +++
> 2 files changed, 6 insertions(+), 46 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object.c b/drivers/gpu/drm/i915/gem/i915_gem_object.c
> index 272ce30ce1d3..1b571fd26ed4 100644
> --- a/drivers/gpu/drm/i915/gem/i915_gem_object.c
> +++ b/drivers/gpu/drm/i915/gem/i915_gem_object.c
> @@ -149,33 +149,6 @@ void i915_gem_close_object(struct drm_gem_object *gem, struct drm_file *file)
> }
> }
>
> -static bool discard_backing_storage(struct drm_i915_gem_object *obj)
> -{
> - /*
> - * If we are the last user of the backing storage (be it shmemfs
> - * pages or stolen etc), we know that the pages are going to be
> - * immediately released. In this case, we can then skip copying
> - * back the contents from the GPU.
> - */
> - if (!i915_gem_object_is_shrinkable(obj))
> - return false;
> -
> - if (obj->mm.madv != I915_MADV_WILLNEED)
> - return false;
> -
> - if (!obj->base.filp)
> - return true;
> -
> - /* At first glance, this looks racy, but then again so would be
> - * userspace racing mmap against close. However, the first external
> - * reference to the filp can only be obtained through the
> - * i915_gem_mmap_ioctl() which safeguards us against the user
> - * acquiring such a reference whilst we are in the middle of
> - * freeing the object.
> - */
> - return file_count(obj->base.filp) == 1;
> -}
> -
> static void __i915_gem_free_objects(struct drm_i915_private *i915,
> struct llist_node *freed)
> {
> @@ -225,8 +198,7 @@ static void __i915_gem_free_objects(struct drm_i915_private *i915,
> if (obj->ops->release)
> obj->ops->release(obj);
>
> - if (WARN_ON(i915_gem_object_has_pinned_pages(obj)))
> - atomic_set(&obj->mm.pages_pin_count, 0);
> + atomic_set(&obj->mm.pages_pin_count, 0);
> __i915_gem_object_put_pages(obj, I915_MM_NORMAL);
> GEM_BUG_ON(i915_gem_object_has_pages(obj));
>
> @@ -324,23 +296,6 @@ void i915_gem_free_object(struct drm_gem_object *gem_obj)
> {
> struct drm_i915_gem_object *obj = to_intel_bo(gem_obj);
>
> - if (obj->mm.quirked)
> - __i915_gem_object_unpin_pages(obj);
> -
> - if (discard_backing_storage(obj)) {
> - struct drm_i915_private *i915 = to_i915(obj->base.dev);
> -
> - obj->mm.madv = I915_MADV_DONTNEED;
> -
> - if (i915_gem_object_has_pages(obj)) {
> - unsigned long flags;
> -
> - spin_lock_irqsave(&i915->mm.obj_lock, flags);
> - list_move_tail(&obj->mm.link, &i915->mm.purge_list);
> - spin_unlock_irqrestore(&i915->mm.obj_lock, flags);
> - }
> - }
> -
> /*
> * Before we free the object, make sure any pure RCU-only
> * read-side critical sections are complete, e.g.
> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_shrinker.c b/drivers/gpu/drm/i915/gem/i915_gem_shrinker.c
> index c851c4029597..3a926a8755c6 100644
> --- a/drivers/gpu/drm/i915/gem/i915_gem_shrinker.c
> +++ b/drivers/gpu/drm/i915/gem/i915_gem_shrinker.c
> @@ -241,6 +241,9 @@ i915_gem_shrink(struct drm_i915_private *i915,
> if (!can_release_pages(obj))
> continue;
>
> + if (!kref_get_unless_zero(&obj->base.refcount))
> + continue;
> +
The comment above, in this function, seems a little bit
stale on talking about struct mutex. Straighten it up.
Reviewed-by: Mika Kuoppala <mika.kuoppala at linux.intel.com>
> spin_unlock_irqrestore(&i915->mm.obj_lock, flags);
>
> if (unsafe_drop_pages(obj)) {
> @@ -253,7 +256,9 @@ i915_gem_shrink(struct drm_i915_private *i915,
> }
> mutex_unlock(&obj->mm.lock);
> }
> +
> scanned += obj->base.size >> PAGE_SHIFT;
> + i915_gem_object_put(obj);
>
> spin_lock_irqsave(&i915->mm.obj_lock, flags);
> }
> --
> 2.20.1
More information about the Intel-gfx
mailing list