]> bbs.cooldavid.org Git - net-next-2.6.git/blame - mm/hwpoison-inject.c
HWPOISON: return 0 to indicate success reliably
[net-next-2.6.git] / mm / hwpoison-inject.c
CommitLineData
cae681fc
AK
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
847ce401 7static struct dentry *hwpoison_dir;
cae681fc
AK
8
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
847ce401
WF
17static 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
cae681fc 25DEFINE_SIMPLE_ATTRIBUTE(hwpoison_fops, NULL, hwpoison_inject, "%lli\n");
847ce401 26DEFINE_SIMPLE_ATTRIBUTE(unpoison_fops, NULL, hwpoison_unpoison, "%lli\n");
cae681fc
AK
27
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{
847ce401
WF
36 struct dentry *dentry;
37
cae681fc
AK
38 hwpoison_dir = debugfs_create_dir("hwpoison", NULL);
39 if (hwpoison_dir == NULL)
40 return -ENOMEM;
847ce401
WF
41
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,
cae681fc 48 NULL, &hwpoison_fops);
847ce401
WF
49 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
cae681fc 57 return 0;
847ce401
WF
58fail:
59 pfn_inject_exit();
60 return -ENOMEM;
cae681fc
AK
61}
62
63module_init(pfn_inject_init);
64module_exit(pfn_inject_exit);
65MODULE_LICENSE("GPL");