Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> 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@xxxxxxxxxxxxxxxxxx> > --- > 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@xxxxxxxxxxxxxxx> > + 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 _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx