brintos

brintos / linux-shallow public Read only

0
0
Text · 1.7 KiB · 7647096 Raw
70 lines · c
1// SPDX-License-Identifier: GPL-2.02#include <linux/fault-inject.h>3#include <linux/debugfs.h>4#include <linux/error-injection.h>5#include <linux/mm.h>6 7static struct {8	struct fault_attr attr;9 10	bool ignore_gfp_highmem;11	bool ignore_gfp_reclaim;12	u32 min_order;13} fail_page_alloc = {14	.attr = FAULT_ATTR_INITIALIZER,15	.ignore_gfp_reclaim = true,16	.ignore_gfp_highmem = true,17	.min_order = 1,18};19 20static int __init setup_fail_page_alloc(char *str)21{22	return setup_fault_attr(&fail_page_alloc.attr, str);23}24__setup("fail_page_alloc=", setup_fail_page_alloc);25 26bool should_fail_alloc_page(gfp_t gfp_mask, unsigned int order)27{28	int flags = 0;29 30	if (order < fail_page_alloc.min_order)31		return false;32	if (gfp_mask & __GFP_NOFAIL)33		return false;34	if (fail_page_alloc.ignore_gfp_highmem && (gfp_mask & __GFP_HIGHMEM))35		return false;36	if (fail_page_alloc.ignore_gfp_reclaim &&37			(gfp_mask & __GFP_DIRECT_RECLAIM))38		return false;39 40	/* See comment in __should_failslab() */41	if (gfp_mask & __GFP_NOWARN)42		flags |= FAULT_NOWARN;43 44	return should_fail_ex(&fail_page_alloc.attr, 1 << order, flags);45}46ALLOW_ERROR_INJECTION(should_fail_alloc_page, TRUE);47 48#ifdef CONFIG_FAULT_INJECTION_DEBUG_FS49 50static int __init fail_page_alloc_debugfs(void)51{52	umode_t mode = S_IFREG | 0600;53	struct dentry *dir;54 55	dir = fault_create_debugfs_attr("fail_page_alloc", NULL,56					&fail_page_alloc.attr);57 58	debugfs_create_bool("ignore-gfp-wait", mode, dir,59			    &fail_page_alloc.ignore_gfp_reclaim);60	debugfs_create_bool("ignore-gfp-highmem", mode, dir,61			    &fail_page_alloc.ignore_gfp_highmem);62	debugfs_create_u32("min-order", mode, dir, &fail_page_alloc.min_order);63 64	return 0;65}66 67late_initcall(fail_page_alloc_debugfs);68 69#endif /* CONFIG_FAULT_INJECTION_DEBUG_FS */70