mm: introduce __GFP_MEMALLOC to allow access to emergency reserves
[linux-3.10.git] / mm / page_alloc.c
index 38e5be6..8f65abe 100644 (file)
@@ -1513,7 +1513,6 @@ failed:
 #define ALLOC_HARDER           0x10 /* try to alloc harder */
 #define ALLOC_HIGH             0x20 /* __GFP_HIGH set */
 #define ALLOC_CPUSET           0x40 /* check for correct cpuset */
-#define ALLOC_PFMEMALLOC       0x80 /* Caller has PF_MEMALLOC set */
 
 #ifdef CONFIG_FAIL_PAGE_ALLOC
 
@@ -2294,11 +2293,10 @@ gfp_to_alloc_flags(gfp_t gfp_mask)
        } else if (unlikely(rt_task(current)) && !in_interrupt())
                alloc_flags |= ALLOC_HARDER;
 
-       if ((current->flags & PF_MEMALLOC) ||
-                       unlikely(test_thread_flag(TIF_MEMDIE))) {
-               alloc_flags |= ALLOC_PFMEMALLOC;
-
-               if (likely(!(gfp_mask & __GFP_NOMEMALLOC)) && !in_interrupt())
+       if (likely(!(gfp_mask & __GFP_NOMEMALLOC))) {
+               if (gfp_mask & __GFP_MEMALLOC)
+                       alloc_flags |= ALLOC_NO_WATERMARKS;
+               else if (likely(!(gfp_mask & __GFP_NOMEMALLOC)) && !in_interrupt())
                        alloc_flags |= ALLOC_NO_WATERMARKS;
        }
 
@@ -2307,7 +2305,7 @@ gfp_to_alloc_flags(gfp_t gfp_mask)
 
 bool gfp_pfmemalloc_allowed(gfp_t gfp_mask)
 {
-       return !!(gfp_to_alloc_flags(gfp_mask) & ALLOC_PFMEMALLOC);
+       return !!(gfp_to_alloc_flags(gfp_mask) & ALLOC_NO_WATERMARKS);
 }
 
 static inline struct page *
@@ -2498,12 +2496,12 @@ nopage:
        return page;
 got_pg:
        /*
-        * page->pfmemalloc is set when the caller had PFMEMALLOC set or is
-        * been OOM killed. The expectation is that the caller is taking
-        * steps that will free more memory. The caller should avoid the
-        * page being used for !PFMEMALLOC purposes.
+        * page->pfmemalloc is set when the caller had PFMEMALLOC set, is
+        * been OOM killed or specified __GFP_MEMALLOC. The expectation is
+        * that the caller is taking steps that will free more memory. The
+        * caller should avoid the page being used for !PFMEMALLOC purposes.
         */
-       page->pfmemalloc = !!(alloc_flags & ALLOC_PFMEMALLOC);
+       page->pfmemalloc = !!(alloc_flags & ALLOC_NO_WATERMARKS);
 
        if (kmemcheck_enabled)
                kmemcheck_pagealloc_alloc(page, order, gfp_mask);