diff options
Diffstat (limited to 'mm/hwpoison-inject.c')
-rw-r--r-- | mm/hwpoison-inject.c | 36 |
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 | ||
7 | static struct dentry *hwpoison_dir, *corrupt_pfn; | 7 | static struct dentry *hwpoison_dir; |
8 | 8 | ||
9 | static int hwpoison_inject(void *data, u64 val) | 9 | static 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 | ||
17 | static 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 | |||
17 | DEFINE_SIMPLE_ATTRIBUTE(hwpoison_fops, NULL, hwpoison_inject, "%lli\n"); | 25 | DEFINE_SIMPLE_ATTRIBUTE(hwpoison_fops, NULL, hwpoison_inject, "%lli\n"); |
26 | DEFINE_SIMPLE_ATTRIBUTE(unpoison_fops, NULL, hwpoison_unpoison, "%lli\n"); | ||
18 | 27 | ||
19 | static void pfn_inject_exit(void) | 28 | static void pfn_inject_exit(void) |
20 | { | 29 | { |
@@ -24,16 +33,31 @@ static void pfn_inject_exit(void) | |||
24 | 33 | ||
25 | static int pfn_inject_init(void) | 34 | static 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; |
58 | fail: | ||
59 | pfn_inject_exit(); | ||
60 | return -ENOMEM; | ||
37 | } | 61 | } |
38 | 62 | ||
39 | module_init(pfn_inject_init); | 63 | module_init(pfn_inject_init); |