|
@@ -900,11 +900,13 @@ static struct fail_page_alloc_attr {
|
|
|
|
|
|
u32 ignore_gfp_highmem;
|
|
|
u32 ignore_gfp_wait;
|
|
|
+ u32 min_order;
|
|
|
|
|
|
#ifdef CONFIG_FAULT_INJECTION_DEBUG_FS
|
|
|
|
|
|
struct dentry *ignore_gfp_highmem_file;
|
|
|
struct dentry *ignore_gfp_wait_file;
|
|
|
+ struct dentry *min_order_file;
|
|
|
|
|
|
#endif /* CONFIG_FAULT_INJECTION_DEBUG_FS */
|
|
|
|
|
@@ -912,6 +914,7 @@ static struct fail_page_alloc_attr {
|
|
|
.attr = FAULT_ATTR_INITIALIZER,
|
|
|
.ignore_gfp_wait = 1,
|
|
|
.ignore_gfp_highmem = 1,
|
|
|
+ .min_order = 1,
|
|
|
};
|
|
|
|
|
|
static int __init setup_fail_page_alloc(char *str)
|
|
@@ -922,6 +925,8 @@ __setup("fail_page_alloc=", setup_fail_page_alloc);
|
|
|
|
|
|
static int should_fail_alloc_page(gfp_t gfp_mask, unsigned int order)
|
|
|
{
|
|
|
+ if (order < fail_page_alloc.min_order)
|
|
|
+ return 0;
|
|
|
if (gfp_mask & __GFP_NOFAIL)
|
|
|
return 0;
|
|
|
if (fail_page_alloc.ignore_gfp_highmem && (gfp_mask & __GFP_HIGHMEM))
|
|
@@ -953,12 +958,17 @@ static int __init fail_page_alloc_debugfs(void)
|
|
|
fail_page_alloc.ignore_gfp_highmem_file =
|
|
|
debugfs_create_bool("ignore-gfp-highmem", mode, dir,
|
|
|
&fail_page_alloc.ignore_gfp_highmem);
|
|
|
+ fail_page_alloc.min_order_file =
|
|
|
+ debugfs_create_u32("min-order", mode, dir,
|
|
|
+ &fail_page_alloc.min_order);
|
|
|
|
|
|
if (!fail_page_alloc.ignore_gfp_wait_file ||
|
|
|
- !fail_page_alloc.ignore_gfp_highmem_file) {
|
|
|
+ !fail_page_alloc.ignore_gfp_highmem_file ||
|
|
|
+ !fail_page_alloc.min_order_file) {
|
|
|
err = -ENOMEM;
|
|
|
debugfs_remove(fail_page_alloc.ignore_gfp_wait_file);
|
|
|
debugfs_remove(fail_page_alloc.ignore_gfp_highmem_file);
|
|
|
+ debugfs_remove(fail_page_alloc.min_order_file);
|
|
|
cleanup_fault_attr_dentries(&fail_page_alloc.attr);
|
|
|
}
|
|
|
|