diff options
Diffstat (limited to 'mm/debug.c')
| -rw-r--r-- | mm/debug.c | 46 | 
1 files changed, 46 insertions, 0 deletions
diff --git a/mm/debug.c b/mm/debug.c index bd10aad8539a..cdacba12e09a 100644 --- a/mm/debug.c +++ b/mm/debug.c @@ -13,6 +13,7 @@  #include <trace/events/mmflags.h>  #include <linux/migrate.h>  #include <linux/page_owner.h> +#include <linux/ctype.h>  #include "internal.h" @@ -175,4 +176,49 @@ void dump_mm(const struct mm_struct *mm)  	);  } +static bool page_init_poisoning __read_mostly = true; + +static int __init setup_vm_debug(char *str) +{ +	bool __page_init_poisoning = true; + +	/* +	 * Calling vm_debug with no arguments is equivalent to requesting +	 * to enable all debugging options we can control. +	 */ +	if (*str++ != '=' || !*str) +		goto out; + +	__page_init_poisoning = false; +	if (*str == '-') +		goto out; + +	while (*str) { +		switch (tolower(*str)) { +		case'p': +			__page_init_poisoning = true; +			break; +		default: +			pr_err("vm_debug option '%c' unknown. skipped\n", +			       *str); +		} + +		str++; +	} +out: +	if (page_init_poisoning && !__page_init_poisoning) +		pr_warn("Page struct poisoning disabled by kernel command line option 'vm_debug'\n"); + +	page_init_poisoning = __page_init_poisoning; + +	return 1; +} +__setup("vm_debug", setup_vm_debug); + +void page_init_poison(struct page *page, size_t size) +{ +	if (page_init_poisoning) +		memset(page, PAGE_POISON_PATTERN, size); +} +EXPORT_SYMBOL_GPL(page_init_poison);  #endif		/* CONFIG_DEBUG_VM */  | 
