drm/i915: Limit number of capture objects

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@chris-wilson.co.uk>
Reviewed-by: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20180911115810.8917-3-chris@chris-wilson.co.uk
This commit is contained in:
Chris Wilson 2018-09-11 12:57:47 +01:00
parent 8db601f091
commit 8e3ffa8d02
1 changed files with 13 additions and 7 deletions

View File

@ -1391,15 +1391,20 @@ static void request_record_user_bo(struct i915_request *request,
{ {
struct i915_capture_list *c; struct i915_capture_list *c;
struct drm_i915_error_object **bo; struct drm_i915_error_object **bo;
long count; long count, max;
count = 0; max = 0;
for (c = request->capture_list; c; c = c->next) for (c = request->capture_list; c; c = c->next)
count++; max++;
if (!max)
return;
bo = NULL; bo = kmalloc_array(max, sizeof(*bo), GFP_ATOMIC);
if (count) if (!bo) {
bo = kcalloc(count, sizeof(*bo), GFP_ATOMIC); /* If we can't capture everything, try to capture something. */
max = min_t(long, max, PAGE_SIZE / sizeof(*bo));
bo = kmalloc_array(max, sizeof(*bo), GFP_ATOMIC);
}
if (!bo) if (!bo)
return; return;
@ -1408,7 +1413,8 @@ static void request_record_user_bo(struct i915_request *request,
bo[count] = i915_error_object_create(request->i915, c->vma); bo[count] = i915_error_object_create(request->i915, c->vma);
if (!bo[count]) if (!bo[count])
break; break;
count++; if (++count == max)
break;
} }
ee->user_bo = bo; ee->user_bo = bo;