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 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);
if (!bo) {
/* 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)
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);
if (!bo[count])
break;
count++;
if (++count == max)
break;
}
ee->user_bo = bo;