Merge tag 'omap-for-v4.20/omap1-fix-signed' of git://git.kernel.org/pub/scm/linux...
[linux-2.6-block.git] / mm / debug.c
index bd10aad8539a42bf5a1263518534946eeac6e050..cdacba12e09aeebdcd4c2e5c904a59d8e940aaeb 100644 (file)
@@ -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 */