mm: page_alloc: split out FAIL_PAGE_ALLOC
... to a single file to reduce a bit of page_alloc.c. Link: https://lkml.kernel.org/r/20230516063821.121844-8-wangkefeng.wang@huawei.com Signed-off-by: Kefeng Wang <wangkefeng.wang@huawei.com> Cc: David Hildenbrand <david@redhat.com> Cc: "Huang, Ying" <ying.huang@intel.com> Cc: Iurii Zaikin <yzaikin@google.com> Cc: Kees Cook <keescook@chromium.org> Cc: Len Brown <len.brown@intel.com> Cc: Luis Chamberlain <mcgrof@kernel.org> Cc: Mike Rapoport (IBM) <rppt@kernel.org> Cc: Oscar Salvador <osalvador@suse.de> Cc: Pavel Machek <pavel@ucw.cz> Cc: Rafael J. Wysocki <rafael@kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
parent
e9f2b529e1
commit
0866e82e40
|
@ -93,6 +93,15 @@ struct kmem_cache;
|
||||||
|
|
||||||
bool should_fail_alloc_page(gfp_t gfp_mask, unsigned int order);
|
bool should_fail_alloc_page(gfp_t gfp_mask, unsigned int order);
|
||||||
|
|
||||||
|
#ifdef CONFIG_FAIL_PAGE_ALLOC
|
||||||
|
bool __should_fail_alloc_page(gfp_t gfp_mask, unsigned int order);
|
||||||
|
#else
|
||||||
|
static inline bool __should_fail_alloc_page(gfp_t gfp_mask, unsigned int order)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_FAIL_PAGE_ALLOC */
|
||||||
|
|
||||||
int should_failslab(struct kmem_cache *s, gfp_t gfpflags);
|
int should_failslab(struct kmem_cache *s, gfp_t gfpflags);
|
||||||
#ifdef CONFIG_FAILSLAB
|
#ifdef CONFIG_FAILSLAB
|
||||||
extern bool __should_failslab(struct kmem_cache *s, gfp_t gfpflags);
|
extern bool __should_failslab(struct kmem_cache *s, gfp_t gfpflags);
|
||||||
|
|
|
@ -89,6 +89,7 @@ obj-$(CONFIG_KASAN) += kasan/
|
||||||
obj-$(CONFIG_KFENCE) += kfence/
|
obj-$(CONFIG_KFENCE) += kfence/
|
||||||
obj-$(CONFIG_KMSAN) += kmsan/
|
obj-$(CONFIG_KMSAN) += kmsan/
|
||||||
obj-$(CONFIG_FAILSLAB) += failslab.o
|
obj-$(CONFIG_FAILSLAB) += failslab.o
|
||||||
|
obj-$(CONFIG_FAIL_PAGE_ALLOC) += fail_page_alloc.o
|
||||||
obj-$(CONFIG_MEMTEST) += memtest.o
|
obj-$(CONFIG_MEMTEST) += memtest.o
|
||||||
obj-$(CONFIG_MIGRATION) += migrate.o
|
obj-$(CONFIG_MIGRATION) += migrate.o
|
||||||
obj-$(CONFIG_NUMA) += memory-tiers.o
|
obj-$(CONFIG_NUMA) += memory-tiers.o
|
||||||
|
|
|
@ -0,0 +1,66 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
|
#include <linux/fault-inject.h>
|
||||||
|
#include <linux/mm.h>
|
||||||
|
|
||||||
|
static struct {
|
||||||
|
struct fault_attr attr;
|
||||||
|
|
||||||
|
bool ignore_gfp_highmem;
|
||||||
|
bool ignore_gfp_reclaim;
|
||||||
|
u32 min_order;
|
||||||
|
} fail_page_alloc = {
|
||||||
|
.attr = FAULT_ATTR_INITIALIZER,
|
||||||
|
.ignore_gfp_reclaim = true,
|
||||||
|
.ignore_gfp_highmem = true,
|
||||||
|
.min_order = 1,
|
||||||
|
};
|
||||||
|
|
||||||
|
static int __init setup_fail_page_alloc(char *str)
|
||||||
|
{
|
||||||
|
return setup_fault_attr(&fail_page_alloc.attr, str);
|
||||||
|
}
|
||||||
|
__setup("fail_page_alloc=", setup_fail_page_alloc);
|
||||||
|
|
||||||
|
bool __should_fail_alloc_page(gfp_t gfp_mask, unsigned int order)
|
||||||
|
{
|
||||||
|
int flags = 0;
|
||||||
|
|
||||||
|
if (order < fail_page_alloc.min_order)
|
||||||
|
return false;
|
||||||
|
if (gfp_mask & __GFP_NOFAIL)
|
||||||
|
return false;
|
||||||
|
if (fail_page_alloc.ignore_gfp_highmem && (gfp_mask & __GFP_HIGHMEM))
|
||||||
|
return false;
|
||||||
|
if (fail_page_alloc.ignore_gfp_reclaim &&
|
||||||
|
(gfp_mask & __GFP_DIRECT_RECLAIM))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
/* See comment in __should_failslab() */
|
||||||
|
if (gfp_mask & __GFP_NOWARN)
|
||||||
|
flags |= FAULT_NOWARN;
|
||||||
|
|
||||||
|
return should_fail_ex(&fail_page_alloc.attr, 1 << order, flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_FAULT_INJECTION_DEBUG_FS
|
||||||
|
|
||||||
|
static int __init fail_page_alloc_debugfs(void)
|
||||||
|
{
|
||||||
|
umode_t mode = S_IFREG | 0600;
|
||||||
|
struct dentry *dir;
|
||||||
|
|
||||||
|
dir = fault_create_debugfs_attr("fail_page_alloc", NULL,
|
||||||
|
&fail_page_alloc.attr);
|
||||||
|
|
||||||
|
debugfs_create_bool("ignore-gfp-wait", mode, dir,
|
||||||
|
&fail_page_alloc.ignore_gfp_reclaim);
|
||||||
|
debugfs_create_bool("ignore-gfp-highmem", mode, dir,
|
||||||
|
&fail_page_alloc.ignore_gfp_highmem);
|
||||||
|
debugfs_create_u32("min-order", mode, dir, &fail_page_alloc.min_order);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
late_initcall(fail_page_alloc_debugfs);
|
||||||
|
|
||||||
|
#endif /* CONFIG_FAULT_INJECTION_DEBUG_FS */
|
|
@ -2994,80 +2994,6 @@ out:
|
||||||
return page;
|
return page;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_FAIL_PAGE_ALLOC
|
|
||||||
|
|
||||||
static struct {
|
|
||||||
struct fault_attr attr;
|
|
||||||
|
|
||||||
bool ignore_gfp_highmem;
|
|
||||||
bool ignore_gfp_reclaim;
|
|
||||||
u32 min_order;
|
|
||||||
} fail_page_alloc = {
|
|
||||||
.attr = FAULT_ATTR_INITIALIZER,
|
|
||||||
.ignore_gfp_reclaim = true,
|
|
||||||
.ignore_gfp_highmem = true,
|
|
||||||
.min_order = 1,
|
|
||||||
};
|
|
||||||
|
|
||||||
static int __init setup_fail_page_alloc(char *str)
|
|
||||||
{
|
|
||||||
return setup_fault_attr(&fail_page_alloc.attr, str);
|
|
||||||
}
|
|
||||||
__setup("fail_page_alloc=", setup_fail_page_alloc);
|
|
||||||
|
|
||||||
static bool __should_fail_alloc_page(gfp_t gfp_mask, unsigned int order)
|
|
||||||
{
|
|
||||||
int flags = 0;
|
|
||||||
|
|
||||||
if (order < fail_page_alloc.min_order)
|
|
||||||
return false;
|
|
||||||
if (gfp_mask & __GFP_NOFAIL)
|
|
||||||
return false;
|
|
||||||
if (fail_page_alloc.ignore_gfp_highmem && (gfp_mask & __GFP_HIGHMEM))
|
|
||||||
return false;
|
|
||||||
if (fail_page_alloc.ignore_gfp_reclaim &&
|
|
||||||
(gfp_mask & __GFP_DIRECT_RECLAIM))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
/* See comment in __should_failslab() */
|
|
||||||
if (gfp_mask & __GFP_NOWARN)
|
|
||||||
flags |= FAULT_NOWARN;
|
|
||||||
|
|
||||||
return should_fail_ex(&fail_page_alloc.attr, 1 << order, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef CONFIG_FAULT_INJECTION_DEBUG_FS
|
|
||||||
|
|
||||||
static int __init fail_page_alloc_debugfs(void)
|
|
||||||
{
|
|
||||||
umode_t mode = S_IFREG | 0600;
|
|
||||||
struct dentry *dir;
|
|
||||||
|
|
||||||
dir = fault_create_debugfs_attr("fail_page_alloc", NULL,
|
|
||||||
&fail_page_alloc.attr);
|
|
||||||
|
|
||||||
debugfs_create_bool("ignore-gfp-wait", mode, dir,
|
|
||||||
&fail_page_alloc.ignore_gfp_reclaim);
|
|
||||||
debugfs_create_bool("ignore-gfp-highmem", mode, dir,
|
|
||||||
&fail_page_alloc.ignore_gfp_highmem);
|
|
||||||
debugfs_create_u32("min-order", mode, dir, &fail_page_alloc.min_order);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
late_initcall(fail_page_alloc_debugfs);
|
|
||||||
|
|
||||||
#endif /* CONFIG_FAULT_INJECTION_DEBUG_FS */
|
|
||||||
|
|
||||||
#else /* CONFIG_FAIL_PAGE_ALLOC */
|
|
||||||
|
|
||||||
static inline bool __should_fail_alloc_page(gfp_t gfp_mask, unsigned int order)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* CONFIG_FAIL_PAGE_ALLOC */
|
|
||||||
|
|
||||||
noinline bool should_fail_alloc_page(gfp_t gfp_mask, unsigned int order)
|
noinline bool should_fail_alloc_page(gfp_t gfp_mask, unsigned int order)
|
||||||
{
|
{
|
||||||
return __should_fail_alloc_page(gfp_mask, order);
|
return __should_fail_alloc_page(gfp_mask, order);
|
||||||
|
|
Loading…
Reference in New Issue