Skip to content

Commit 3f913fc

Browse files
Qi Zhengakpm00
authored andcommitted
mm: fix missing handler for __GFP_NOWARN
We expect no warnings to be issued when we specify __GFP_NOWARN, but currently in paths like alloc_pages() and kmalloc(), there are still some warnings printed, fix it. But for some warnings that report usage problems, we don't deal with them. If such warnings are printed, then we should fix the usage problems. Such as the following case: WARN_ON_ONCE((gfp_flags & __GFP_NOFAIL) && (order > 1)); [zhengqi.arch@bytedance.com: v2] Link: https://lkml.kernel.org/r/20220511061951.1114-1-zhengqi.arch@bytedance.com Link: https://lkml.kernel.org/r/20220510113809.80626-1-zhengqi.arch@bytedance.com Signed-off-by: Qi Zheng <zhengqi.arch@bytedance.com> Cc: Akinobu Mita <akinobu.mita@gmail.com> Cc: Vlastimil Babka <vbabka@suse.cz> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Cc: Jiri Slaby <jirislaby@kernel.org> Cc: Steven Rostedt (Google) <rostedt@goodmis.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
1 parent 10e0f75 commit 3f913fc

5 files changed

Lines changed: 33 additions & 8 deletions

File tree

include/linux/fault-inject.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ struct fault_attr {
2020
atomic_t space;
2121
unsigned long verbose;
2222
bool task_filter;
23+
bool no_warn;
2324
unsigned long stacktrace_depth;
2425
unsigned long require_start;
2526
unsigned long require_end;
@@ -39,6 +40,7 @@ struct fault_attr {
3940
.ratelimit_state = RATELIMIT_STATE_INIT_DISABLED, \
4041
.verbose = 2, \
4142
.dname = NULL, \
43+
.no_warn = false, \
4244
}
4345

4446
#define DECLARE_FAULT_ATTR(name) struct fault_attr name = FAULT_ATTR_INITIALIZER

lib/fault-inject.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,9 @@ EXPORT_SYMBOL_GPL(setup_fault_attr);
4141

4242
static void fail_dump(struct fault_attr *attr)
4343
{
44+
if (attr->no_warn)
45+
return;
46+
4447
if (attr->verbose > 0 && __ratelimit(&attr->ratelimit_state)) {
4548
printk(KERN_NOTICE "FAULT_INJECTION: forcing a failure.\n"
4649
"name %pd, interval %lu, probability %lu, "

mm/failslab.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ bool __should_failslab(struct kmem_cache *s, gfp_t gfpflags)
3030
if (failslab.cache_filter && !(s->flags & SLAB_FAILSLAB))
3131
return false;
3232

33+
if (gfpflags & __GFP_NOWARN)
34+
failslab.attr.no_warn = true;
35+
3336
return should_fail(&failslab.attr, s->object_size);
3437
}
3538

mm/internal.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,21 @@ struct folio_batch;
3535
/* Do not use these with a slab allocator */
3636
#define GFP_SLAB_BUG_MASK (__GFP_DMA32|__GFP_HIGHMEM|~__GFP_BITS_MASK)
3737

38+
/*
39+
* Different from WARN_ON_ONCE(), no warning will be issued
40+
* when we specify __GFP_NOWARN.
41+
*/
42+
#define WARN_ON_ONCE_GFP(cond, gfp) ({ \
43+
static bool __section(".data.once") __warned; \
44+
int __ret_warn_once = !!(cond); \
45+
\
46+
if (unlikely(!(gfp & __GFP_NOWARN) && __ret_warn_once && !__warned)) { \
47+
__warned = true; \
48+
WARN_ON(1); \
49+
} \
50+
unlikely(__ret_warn_once); \
51+
})
52+
3853
void page_writeback_init(void);
3954

4055
static inline void *folio_raw_mapping(struct folio *folio)

mm/page_alloc.c

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3786,6 +3786,9 @@ static bool __should_fail_alloc_page(gfp_t gfp_mask, unsigned int order)
37863786
(gfp_mask & __GFP_DIRECT_RECLAIM))
37873787
return false;
37883788

3789+
if (gfp_mask & __GFP_NOWARN)
3790+
fail_page_alloc.attr.no_warn = true;
3791+
37893792
return should_fail(&fail_page_alloc.attr, 1 << order);
37903793
}
37913794

@@ -4334,7 +4337,8 @@ __alloc_pages_may_oom(gfp_t gfp_mask, unsigned int order,
43344337
*/
43354338

43364339
/* Exhausted what can be done so it's blame time */
4337-
if (out_of_memory(&oc) || WARN_ON_ONCE(gfp_mask & __GFP_NOFAIL)) {
4340+
if (out_of_memory(&oc) ||
4341+
WARN_ON_ONCE_GFP(gfp_mask & __GFP_NOFAIL, gfp_mask)) {
43384342
*did_some_progress = 1;
43394343

43404344
/*
@@ -5108,23 +5112,23 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order,
51085112
* All existing users of the __GFP_NOFAIL are blockable, so warn
51095113
* of any new users that actually require GFP_NOWAIT
51105114
*/
5111-
if (WARN_ON_ONCE(!can_direct_reclaim))
5115+
if (WARN_ON_ONCE_GFP(!can_direct_reclaim, gfp_mask))
51125116
goto fail;
51135117

51145118
/*
51155119
* PF_MEMALLOC request from this context is rather bizarre
51165120
* because we cannot reclaim anything and only can loop waiting
51175121
* for somebody to do a work for us
51185122
*/
5119-
WARN_ON_ONCE(current->flags & PF_MEMALLOC);
5123+
WARN_ON_ONCE_GFP(current->flags & PF_MEMALLOC, gfp_mask);
51205124

51215125
/*
51225126
* non failing costly orders are a hard requirement which we
51235127
* are not prepared for much so let's warn about these users
51245128
* so that we can identify them and convert them to something
51255129
* else.
51265130
*/
5127-
WARN_ON_ONCE(order > PAGE_ALLOC_COSTLY_ORDER);
5131+
WARN_ON_ONCE_GFP(order > PAGE_ALLOC_COSTLY_ORDER, gfp_mask);
51285132

51295133
/*
51305134
* Help non-failing allocations by giving them access to memory
@@ -5370,10 +5374,8 @@ struct page *__alloc_pages(gfp_t gfp, unsigned int order, int preferred_nid,
53705374
* There are several places where we assume that the order value is sane
53715375
* so bail out early if the request is out of bound.
53725376
*/
5373-
if (unlikely(order >= MAX_ORDER)) {
5374-
WARN_ON_ONCE(!(gfp & __GFP_NOWARN));
5377+
if (WARN_ON_ONCE_GFP(order >= MAX_ORDER, gfp))
53755378
return NULL;
5376-
}
53775379

53785380
gfp &= gfp_allowed_mask;
53795381
/*
@@ -9025,7 +9027,7 @@ int __alloc_contig_migrate_range(struct compact_control *cc,
90259027

90269028
lru_cache_enable();
90279029
if (ret < 0) {
9028-
if (ret == -EBUSY)
9030+
if (!(cc->gfp_mask & __GFP_NOWARN) && ret == -EBUSY)
90299031
alloc_contig_dump_pages(&cc->migratepages);
90309032
putback_movable_pages(&cc->migratepages);
90319033
return ret;

0 commit comments

Comments
 (0)