drm/i915/selftests: Limit live_gtt allocation test to fit within RAM
authorChris Wilson <chris@chris-wilson.co.uk>
Fri, 6 Jul 2018 12:53:38 +0000 (13:53 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Fri, 6 Jul 2018 15:44:59 +0000 (16:44 +0100)
Limit the GTT size we try and allocate to ensure that it fits within RAM
and does not trigger the oomkiller indiscriminately.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Matthew Auld <matthew.auld@intel.com>
Reviewed-by: Matthew Auld <matthew.auld@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20180706125338.24432-1-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/selftests/i915_gem_gtt.c

index e108fe4e0fd94e5490014413dcffbd521b3dd36a..600a3bcbd3d6ebf7fa14f2b9f29520a82ddcc675 100644 (file)
@@ -148,7 +148,7 @@ static int igt_ppgtt_alloc(void *arg)
 {
        struct drm_i915_private *dev_priv = arg;
        struct i915_hw_ppgtt *ppgtt;
-       u64 size, last;
+       u64 size, last, limit;
        int err = 0;
 
        /* Allocate a ppggt and try to fill the entire range */
@@ -163,10 +163,18 @@ static int igt_ppgtt_alloc(void *arg)
        if (!ppgtt->vm.allocate_va_range)
                goto err_ppgtt_cleanup;
 
+       /*
+        * While we only allocate the page tables here and so we could
+        * address a much larger GTT than we could actually fit into
+        * RAM, a practical limit is the amount of physical pages in the system.
+        * This should ensure that we do not run into the oomkiller during
+        * the test and take down the machine wilfully.
+        */
+       limit = totalram_pages << PAGE_SHIFT;
+       limit = min(ppgtt->vm.total, limit);
+
        /* Check we can allocate the entire range */
-       for (size = 4096;
-            size <= ppgtt->vm.total;
-            size <<= 2) {
+       for (size = 4096; size <= limit; size <<= 2) {
                err = ppgtt->vm.allocate_va_range(&ppgtt->vm, 0, size);
                if (err) {
                        if (err == -ENOMEM) {
@@ -183,9 +191,7 @@ static int igt_ppgtt_alloc(void *arg)
        }
 
        /* Check we can incrementally allocate the entire range */
-       for (last = 0, size = 4096;
-            size <= ppgtt->vm.total;
-            last = size, size <<= 2) {
+       for (last = 0, size = 4096; size <= limit; last = size, size <<= 2) {
                err = ppgtt->vm.allocate_va_range(&ppgtt->vm,
                                                  last, size - last);
                if (err) {