aboutsummaryrefslogtreecommitdiffstats
path: root/mm/hwpoison-inject.c
diff options
context:
space:
mode:
Diffstat (limited to 'mm/hwpoison-inject.c')
-rw-r--r--mm/hwpoison-inject.c36
1 files changed, 30 insertions, 6 deletions
diff --git a/mm/hwpoison-inject.c b/mm/hwpoison-inject.c
index e1d85137f086..6e35e563bf50 100644
--- a/mm/hwpoison-inject.c
+++ b/mm/hwpoison-inject.c
@@ -4,7 +4,7 @@
4#include <linux/kernel.h> 4#include <linux/kernel.h>
5#include <linux/mm.h> 5#include <linux/mm.h>
6 6
7static struct dentry *hwpoison_dir, *corrupt_pfn; 7static struct dentry *hwpoison_dir;
8 8
9static int hwpoison_inject(void *data, u64 val) 9static int hwpoison_inject(void *data, u64 val)
10{ 10{
@@ -14,7 +14,16 @@ static int hwpoison_inject(void *data, u64 val)
14 return __memory_failure(val, 18, 0); 14 return __memory_failure(val, 18, 0);
15} 15}
16 16
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
17DEFINE_SIMPLE_ATTRIBUTE(hwpoison_fops, NULL, hwpoison_inject, "%lli\n"); 25DEFINE_SIMPLE_ATTRIBUTE(hwpoison_fops, NULL, hwpoison_inject, "%lli\n");
26DEFINE_SIMPLE_ATTRIBUTE(unpoison_fops, NULL, hwpoison_unpoison, "%lli\n");
18 27
19static void pfn_inject_exit(void) 28static void pfn_inject_exit(void)
20{ 29{
@@ -24,16 +33,31 @@ static void pfn_inject_exit(void)
24 33
25static int pfn_inject_init(void) 34static int pfn_inject_init(void)
26{ 35{
36 struct dentry *dentry;
37
27 hwpoison_dir = debugfs_create_dir("hwpoison", NULL); 38 hwpoison_dir = debugfs_create_dir("hwpoison", NULL);
28 if (hwpoison_dir == NULL) 39 if (hwpoison_dir == NULL)
29 return -ENOMEM; 40 return -ENOMEM;
30 corrupt_pfn = debugfs_create_file("corrupt-pfn", 0600, hwpoison_dir, 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,
31 NULL, &hwpoison_fops); 48 NULL, &hwpoison_fops);
32 if (corrupt_pfn == NULL) { 49 if (!dentry)
33 pfn_inject_exit(); 50 goto fail;
34 return -ENOMEM; 51
35 } 52 dentry = debugfs_create_file("unpoison-pfn", 0600, hwpoison_dir,
53 NULL, &unpoison_fops);
54 if (!dentry)
55 goto fail;
56
36 return 0; 57 return 0;
58fail:
59 pfn_inject_exit();
60 return -ENOMEM;
37} 61}
38 62
39module_init(pfn_inject_init); 63module_init(pfn_inject_init);