[Intel-gfx] [PATCH 3/6] drm/i915: Limit number of capture objects

Mika Kuoppala mika.kuoppala at linux.intel.com
Mon Sep 10 13:14:56 UTC 2018


Chris Wilson <chris at chris-wilson.co.uk> writes:

> If we fail to allocate an array for a large number of user requested
> capture objects, reduce the array size and try to grab at least some of
> the objects!
>
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> ---
>  drivers/gpu/drm/i915/i915_gpu_error.c | 20 +++++++++++++-------
>  1 file changed, 13 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_gpu_error.c b/drivers/gpu/drm/i915/i915_gpu_error.c
> index f7f2aa71d8d9..2835cacd0d08 100644
> --- a/drivers/gpu/drm/i915/i915_gpu_error.c
> +++ b/drivers/gpu/drm/i915/i915_gpu_error.c
> @@ -1365,15 +1365,20 @@ static void request_record_user_bo(struct i915_request *request,
>  {
>  	struct i915_capture_list *c;
>  	struct drm_i915_error_object **bo;
> -	long count;
> +	long count, max;
>  
> -	count = 0;
> +	max = 0;
>  	for (c = request->capture_list; c; c = c->next)
> -		count++;
> +		max++;
> +	if (!max)
> +		return;
>  
> -	bo = NULL;
> -	if (count)
> -		bo = kcalloc(count, sizeof(*bo), GFP_ATOMIC);
> +	bo = kmalloc_array(max, sizeof(*bo), GFP_ATOMIC);

There seems to be no need to zero the array.

> +	if (!bo) {
> +		/* If we can't capture everything, try to capture something. */
> +		max = min_t(long, max, PAGE_SIZE / sizeof(*bo));

Perhaps there is some bookkeeping in slab so this would spill to 2
pages eventually?

Reviewed-by: Mika Kuoppala <mika.kuoppala at linux.intel.com>

> +		bo = kmalloc_array(max, sizeof(*bo), GFP_ATOMIC);
> +	}
>  	if (!bo)
>  		return;
>  
> @@ -1382,7 +1387,8 @@ static void request_record_user_bo(struct i915_request *request,
>  		bo[count] = i915_error_object_create(request->i915, c->vma);
>  		if (!bo[count])
>  			break;
> -		count++;
> +		if (++count == max)
> +			break;
>  	}
>  
>  	ee->user_bo = bo;
> -- 
> 2.19.0.rc2


More information about the Intel-gfx mailing list