mm: introduce PF_MEMALLOC_NORECLAIM, PF_MEMALLOC_NOWARN
authorKent Overstreet <kent.overstreet@linux.dev>
Fri, 26 Jan 2024 00:00:24 +0000 (19:00 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 10 Mar 2024 19:34:09 +0000 (15:34 -0400)
Introduce PF_MEMALLOC_* equivalents of some GFP_ flags:

PF_MEMALLOC_NORECLAIM -> GFP_NOWAIT
PF_MEMALLOC_NOWARN -> __GFP_NOWARN

Cc: Vlastimil Babka <vbabka@suse.cz>
Cc: Matthew Wilcox <willy@infradead.org>
Cc: Michal Hocko <mhocko@kernel.org>
Cc: Darrick J. Wong <djwong@kernel.org>
Cc: linux-mm@kvack.org
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
include/linux/sched.h
include/linux/sched/mm.h

index ffe8f618ab869729bd6c888a8a05e45d46a6c7c2..192e2c892040030068577a8bb0db55baf6f3b5d0 100644 (file)
@@ -1636,8 +1636,8 @@ extern struct pid *cad_pid;
                                                 * I am cleaning dirty pages from some other bdi. */
 #define PF_KTHREAD             0x00200000      /* I am a kernel thread */
 #define PF_RANDOMIZE           0x00400000      /* Randomize virtual address space */
-#define PF__HOLE__00800000     0x00800000
-#define PF__HOLE__01000000     0x01000000
+#define PF_MEMALLOC_NORECLAIM  0x00800000      /* All allocation requests will clear __GFP_DIRECT_RECLAIM */
+#define PF_MEMALLOC_NOWARN     0x01000000      /* All allocation requests will inherit __GFP_NOWARN */
 #define PF__HOLE__02000000     0x02000000
 #define PF_NO_SETAFFINITY      0x04000000      /* Userland is not allowed to meddle with cpus_mask */
 #define PF_MCE_EARLY           0x08000000      /* Early kill for mce process policy */
index f00d7ecc2adf51cf5678e68f687f73a0d1508f23..c29059a760525868d555bf020e5e150c58fac94c 100644 (file)
@@ -236,16 +236,25 @@ static inline gfp_t current_gfp_context(gfp_t flags)
 {
        unsigned int pflags = READ_ONCE(current->flags);
 
-       if (unlikely(pflags & (PF_MEMALLOC_NOIO | PF_MEMALLOC_NOFS | PF_MEMALLOC_PIN))) {
+       if (unlikely(pflags & (PF_MEMALLOC_NOIO |
+                              PF_MEMALLOC_NOFS |
+                              PF_MEMALLOC_NORECLAIM |
+                              PF_MEMALLOC_NOWARN |
+                              PF_MEMALLOC_PIN))) {
                /*
-                * NOIO implies both NOIO and NOFS and it is a weaker context
-                * so always make sure it makes precedence
+                * Stronger flags before weaker flags:
+                * NORECLAIM implies NOIO, which in turn implies NOFS
                 */
-               if (pflags & PF_MEMALLOC_NOIO)
+               if (pflags & PF_MEMALLOC_NORECLAIM)
+                       flags &= ~__GFP_DIRECT_RECLAIM;
+               else if (pflags & PF_MEMALLOC_NOIO)
                        flags &= ~(__GFP_IO | __GFP_FS);
                else if (pflags & PF_MEMALLOC_NOFS)
                        flags &= ~__GFP_FS;
 
+               if (pflags & PF_MEMALLOC_NOWARN)
+                       flags |= __GFP_NOWARN;
+
                if (pflags & PF_MEMALLOC_PIN)
                        flags &= ~__GFP_MOVABLE;
        }