drm/i915: Allow internal page allocations to fail
authorChris Wilson <chris@chris-wilson.co.uk>
Fri, 15 Dec 2017 10:17:53 +0000 (10:17 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Fri, 15 Dec 2017 11:35:43 +0000 (11:35 +0000)
Internal objects consistent of scratch pages not subject to the
persistence guarantees of user facing objects. They are used for
example, in ring buffers where they are only required for temporary
storage of commands that will be rewritten every time. As they are
temporary constructs, quietly report -ENOMEM back along the callchain
rather than subject the system to oomkiller if an allocation fails.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Cc: Matthew Auld <matthew.auld@intel.com>
Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20171215101753.1519-1-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/i915_gem_internal.c

index ee83ec838ee75ecf79f3a0514c0cc6678546df98..a1d6956734f75ede865dbd98fa03bd8555b207a2 100644 (file)
@@ -27,6 +27,7 @@
 #include "i915_drv.h"
 
 #define QUIET (__GFP_NORETRY | __GFP_NOWARN)
+#define MAYFAIL (__GFP_RETRY_MAYFAIL | __GFP_NOWARN)
 
 /* convert swiotlb segment size into sensible units (pages)! */
 #define IO_TLB_SEGPAGES (IO_TLB_SEGSIZE << IO_TLB_SHIFT >> PAGE_SHIFT)
@@ -95,7 +96,8 @@ create_st:
                struct page *page;
 
                do {
-                       page = alloc_pages(gfp | (order ? QUIET : 0), order);
+                       page = alloc_pages(gfp | (order ? QUIET : MAYFAIL),
+                                          order);
                        if (page)
                                break;
                        if (!order--)