[Intel-gfx] [PATCH v2 2/3] drm/i915/shrinker: Report "unevictable" pages

Joonas Lahtinen joonas.lahtinen at linux.intel.com
Wed Apr 20 12:02:45 UTC 2016


On ke, 2016-04-20 at 12:04 +0100, Chris Wilson wrote:
> Inside the shrinker we call can_release_pages() to indicate whether or
> not we can make forward progress in freeing up memory by unbinding that
> object. When adding our report to oom, we should be using the same
> logic.
> 
> Whilst here, change the reporting from bytes to pages so that it looks
> smaller to the user!, is consistent with the neighbouring oom report
> itself which displays counts in pages, and makes the unsigned long
> overflow less likely.

Makes sense as that is the smallest pinning unit, too.

> 
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> Cc: Joonas Lahtinen <joonas.lahtinen at linux.intel.com>
> ---
>  drivers/gpu/drm/i915/i915_gem_shrinker.c | 22 +++++++++++-----------
>  1 file changed, 11 insertions(+), 11 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/i915_gem_shrinker.c b/drivers/gpu/drm/i915/i915_gem_shrinker.c
> index 4e4fcfa76b4c..cb225e039d48 100644
> --- a/drivers/gpu/drm/i915/i915_gem_shrinker.c
> +++ b/drivers/gpu/drm/i915/i915_gem_shrinker.c
> @@ -336,7 +336,7 @@ i915_gem_shrinker_oom(struct notifier_block *nb, unsigned long event, void *ptr)
>  		container_of(nb, struct drm_i915_private, mm.oom_notifier);
>  	struct shrinker_lock_uninterruptible slu;
>  	struct drm_i915_gem_object *obj;
> -	unsigned long pinned, bound, unbound, freed_pages;
> +	unsigned long unevictable, bound, unbound, freed_pages;
>  
>  	if (!i915_gem_shrinker_lock_uninterruptible(dev_priv, &slu, 5000))
>  		return NOTIFY_DONE;
> @@ -347,33 +347,33 @@ i915_gem_shrinker_oom(struct notifier_block *nb, unsigned long event, void *ptr)
>  	 * assert that there are no objects with pinned pages that are not
>  	 * being pointed to by hardware.
>  	 */
> -	unbound = bound = pinned = 0;
> +	unbound = bound = unevictable = 0;
>  	list_for_each_entry(obj, &dev_priv->mm.unbound_list, global_list) {
>  		if (!obj->base.filp) /* not backed by a freeable object */
>  			continue;
>  
> -		if (obj->pages_pin_count)
> -			pinned += obj->base.size;
> +		if (!can_release_pages(obj))
> +			unevictable += obj->base.size >> PAGE_SHIFT;
>  		else
> -			unbound += obj->base.size;
> +			unbound += obj->base.size >> PAGE_SHIFT;
>  	}
>  	list_for_each_entry(obj, &dev_priv->mm.bound_list, global_list) {
>  		if (!obj->base.filp)
>  			continue;
>  
> -		if (obj->pages_pin_count > num_vma_bound(obj))
> -			pinned += obj->base.size;
> +		if (!can_release_pages(obj))
> +			unevictable += obj->base.size >> PAGE_SHIFT;
>  		else
> -			bound += obj->base.size;
> +			bound += obj->base.size >> PAGE_SHIFT;
>  	}
>  
>  	i915_gem_shrinker_unlock_uninterruptible(dev_priv, &slu);
>  
>  	if (freed_pages || unbound || bound)
> -		pr_info("Purging GPU memory, %lu bytes freed, %lu bytes still pinned.\n",
> -			freed_pages << PAGE_SHIFT, pinned);
> +		pr_info("Purging GPU memory, %lu pages freed, %lu pages still pinned.\n",
> +			freed_pages, unevictable);

My code checker senses are tingling, this looks very much like
oversized line, mind cutting it down?

With that addressed,

Reviewed-by: Joonas Lahtinen <joonas.lahtinen at linux.intel.com>

>  	if (unbound || bound)
> -		pr_err("%lu and %lu bytes still available in the "
> +		pr_err("%lu and %lu pages still available in the "
>  		       "bound and unbound GPU page lists.\n",
>  		       bound, unbound);
>  
-- 
Joonas Lahtinen
Open Source Technology Center
Intel Corporation


More information about the Intel-gfx mailing list