[Intel-gfx] [PATCH 2/6] drm/i915: Remove walk over obj->vma_list for the shrinker

Joonas Lahtinen joonas.lahtinen at linux.intel.com
Tue Aug 15 14:56:07 UTC 2017


On Sat, 2017-08-12 at 12:51 +0100, Chris Wilson wrote:
> In the next patch, we want to reduce the lock coverage within the
> shrinker, and one of the dangerous walks we have is over obj->vma_list.
> We are only walking the obj->vma_list in order to check whether it has
> been permanently pinned by HW access, typically via use on the scanout.
> But we have a couple of other long term pins, the context objects for
> which we currently have to check the individual vma pin_count. If we
> instead mark these using obj->pin_display, we can forgo the dangerous
> and sometimes slow list iteration.

s/pin_display/pin_permanent/g

> 
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

<SNIP>

>  static bool swap_available(void)
>  {
>  	return get_nr_swap_pages() > 0;
> @@ -115,7 +96,13 @@ static bool can_release_pages(struct drm_i915_gem_object *obj)
>  	if (atomic_read(&obj->mm.pages_pin_count) > obj->bind_count)
>  		return false;
>  
> -	if (any_vma_pinned(obj))
> +	/* If any vma are permanently pinned, it will prevent us from reclaiming

Oh, it sounds so much better here when the variable is 'pin_permanent'.

> +	 * the obj->mm.pages. We only allow scanout objects to claim a permanent
> +	 * pin, along with a few others like the reserved context object. To
> +	 * simplify the scan, and to avoid walking the list of vma under the
> +	 * object, we just check the count of its permanently pinned.
> +	 */
> +	if (obj->pin_display)
>  		return false;
>  
>  	/* We can only return physical pages to the system if we can either
> diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c
> index b0738d2b2a7f..874562bd59ae 100644
> --- a/drivers/gpu/drm/i915/intel_lrc.c
> +++ b/drivers/gpu/drm/i915/intel_lrc.c
> @@ -866,6 +866,7 @@ execlists_context_pin(struct intel_engine_cs *engine,
>  		i915_ggtt_offset(ce->ring->vma);
>  
>  	ce->state->obj->mm.dirty = true;
> +	ce->state->obj->pin_display++;

This should be closer to intel_ring_pin (my preference).

>  
>  	i915_gem_context_get(ctx);
>  out:
> @@ -892,6 +893,7 @@ static void execlists_context_unpin(struct intel_engine_cs *engine,
>  		return;
>  
>  	intel_ring_unpin(ce->ring);
> +	ce->state->obj->pin_display--;

Or this should be closer to i915_gem_context_put. Just make it
symmetrict.
 
> @@ -1515,6 +1517,7 @@ intel_ring_context_pin(struct intel_engine_cs *engine,
>  		if (ret)
>  			goto err;
>  
> +		ce->state->obj->pin_display++;
>  		ce->state->obj->mm.dirty = true;

This is rather symmetric, the above can have mm.dirty after it, too.

As 'pin_permanent', this is;

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

Regards, Joonas
-- 
Joonas Lahtinen
Open Source Technology Center
Intel Corporation


More information about the Intel-gfx mailing list