diff options
Diffstat (limited to 'mm/hwpoison-inject.c')
-rw-r--r-- | mm/hwpoison-inject.c | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/mm/hwpoison-inject.c b/mm/hwpoison-inject.c new file mode 100644 index 000000000000..e1d85137f086 --- /dev/null +++ b/mm/hwpoison-inject.c | |||
@@ -0,0 +1,41 @@ | |||
1 | /* Inject a hwpoison memory failure on a arbitary pfn */ | ||
2 | #include <linux/module.h> | ||
3 | #include <linux/debugfs.h> | ||
4 | #include <linux/kernel.h> | ||
5 | #include <linux/mm.h> | ||
6 | |||
7 | static struct dentry *hwpoison_dir, *corrupt_pfn; | ||
8 | |||
9 | static int hwpoison_inject(void *data, u64 val) | ||
10 | { | ||
11 | if (!capable(CAP_SYS_ADMIN)) | ||
12 | return -EPERM; | ||
13 | printk(KERN_INFO "Injecting memory failure at pfn %Lx\n", val); | ||
14 | return __memory_failure(val, 18, 0); | ||
15 | } | ||
16 | |||
17 | DEFINE_SIMPLE_ATTRIBUTE(hwpoison_fops, NULL, hwpoison_inject, "%lli\n"); | ||
18 | |||
19 | static void pfn_inject_exit(void) | ||
20 | { | ||
21 | if (hwpoison_dir) | ||
22 | debugfs_remove_recursive(hwpoison_dir); | ||
23 | } | ||
24 | |||
25 | static int pfn_inject_init(void) | ||
26 | { | ||
27 | hwpoison_dir = debugfs_create_dir("hwpoison", NULL); | ||
28 | if (hwpoison_dir == NULL) | ||
29 | return -ENOMEM; | ||
30 | corrupt_pfn = debugfs_create_file("corrupt-pfn", 0600, hwpoison_dir, | ||
31 | NULL, &hwpoison_fops); | ||
32 | if (corrupt_pfn == NULL) { | ||
33 | pfn_inject_exit(); | ||
34 | return -ENOMEM; | ||
35 | } | ||
36 | return 0; | ||
37 | } | ||
38 | |||
39 | module_init(pfn_inject_init); | ||
40 | module_exit(pfn_inject_exit); | ||
41 | MODULE_LICENSE("GPL"); | ||