drm/i915: Limit number of capture objects
authorChris Wilson <chris@chris-wilson.co.uk>
Tue, 11 Sep 2018 11:57:47 +0000 (12:57 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Fri, 14 Sep 2018 20:21:38 +0000 (21:21 +0100)
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
drivers/gpu/drm/i915/i915_gpu_error.c

index 8c81cf3aa182e0a2d5d1bee8353342c4a4654a5c..1175fec08fe194b88e18075d790e94068763d5b1 100644 (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;