blob: 6e35e563bf50b660ac30a8808c9942e6083c9657 [file] [log] [blame]
Andi Kleencae681f2009-09-16 11:50:17 +02001/* 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
Wu Fengguang847ce402009-12-16 12:19:58 +01007static struct dentry *hwpoison_dir;
Andi Kleencae681f2009-09-16 11:50:17 +02008
9static 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
Wu Fengguang847ce402009-12-16 12:19:58 +010017static int hwpoison_unpoison(void *data, u64 val)
18{
19 if (!capable(CAP_SYS_ADMIN))
20 return -EPERM;
21
22 return unpoison_memory(val);
23}
24
Andi Kleencae681f2009-09-16 11:50:17 +020025DEFINE_SIMPLE_ATTRIBUTE(hwpoison_fops, NULL, hwpoison_inject, "%lli\n");
Wu Fengguang847ce402009-12-16 12:19:58 +010026DEFINE_SIMPLE_ATTRIBUTE(unpoison_fops, NULL, hwpoison_unpoison, "%lli\n");
Andi Kleencae681f2009-09-16 11:50:17 +020027
28static void pfn_inject_exit(void)
29{
30 if (hwpoison_dir)
31 debugfs_remove_recursive(hwpoison_dir);
32}
33
34static int pfn_inject_init(void)
35{
Wu Fengguang847ce402009-12-16 12:19:58 +010036 struct dentry *dentry;
37
Andi Kleencae681f2009-09-16 11:50:17 +020038 hwpoison_dir = debugfs_create_dir("hwpoison", NULL);
39 if (hwpoison_dir == NULL)
40 return -ENOMEM;
Wu Fengguang847ce402009-12-16 12:19:58 +010041
42 /*
43 * Note that the below poison/unpoison interfaces do not involve
44 * hardware status change, hence do not require hardware support.
45 * They are mainly for testing hwpoison in software level.
46 */
47 dentry = debugfs_create_file("corrupt-pfn", 0600, hwpoison_dir,
Andi Kleencae681f2009-09-16 11:50:17 +020048 NULL, &hwpoison_fops);
Wu Fengguang847ce402009-12-16 12:19:58 +010049 if (!dentry)
50 goto fail;
51
52 dentry = debugfs_create_file("unpoison-pfn", 0600, hwpoison_dir,
53 NULL, &unpoison_fops);
54 if (!dentry)
55 goto fail;
56
Andi Kleencae681f2009-09-16 11:50:17 +020057 return 0;
Wu Fengguang847ce402009-12-16 12:19:58 +010058fail:
59 pfn_inject_exit();
60 return -ENOMEM;
Andi Kleencae681f2009-09-16 11:50:17 +020061}
62
63module_init(pfn_inject_init);
64module_exit(pfn_inject_exit);
65MODULE_LICENSE("GPL");