hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/mm/hwpoison-inject.c
....@@ -1,3 +1,4 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /* Inject a hwpoison memory failure on a arbitrary pfn */
23 #include <linux/module.h>
34 #include <linux/debugfs.h>
....@@ -25,11 +26,6 @@
2526
2627 p = pfn_to_page(pfn);
2728 hpage = compound_head(p);
28
- /*
29
- * This implies unable to support free buddy pages.
30
- */
31
- if (!get_hwpoison_page(p))
32
- return 0;
3329
3430 if (!hwpoison_filter_enable)
3531 goto inject;
....@@ -39,23 +35,20 @@
3935 * This implies unable to support non-LRU pages.
4036 */
4137 if (!PageLRU(hpage) && !PageHuge(p))
42
- goto put_out;
38
+ return 0;
4339
4440 /*
45
- * do a racy check with elevated page count, to make sure PG_hwpoison
46
- * will only be set for the targeted owner (or on a free page).
41
+ * do a racy check to make sure PG_hwpoison will only be set for
42
+ * the targeted owner (or on a free page).
4743 * memory_failure() will redo the check reliably inside page lock.
4844 */
4945 err = hwpoison_filter(hpage);
5046 if (err)
51
- goto put_out;
47
+ return 0;
5248
5349 inject:
5450 pr_info("Injecting memory failure at pfn %#lx\n", pfn);
55
- return memory_failure(pfn, MF_COUNT_INCREASED);
56
-put_out:
57
- put_hwpoison_page(p);
58
- return 0;
51
+ return memory_failure(pfn, 0);
5952 }
6053
6154 static int hwpoison_unpoison(void *data, u64 val)
....@@ -66,8 +59,8 @@
6659 return unpoison_memory(val);
6760 }
6861
69
-DEFINE_SIMPLE_ATTRIBUTE(hwpoison_fops, NULL, hwpoison_inject, "%lli\n");
70
-DEFINE_SIMPLE_ATTRIBUTE(unpoison_fops, NULL, hwpoison_unpoison, "%lli\n");
62
+DEFINE_DEBUGFS_ATTRIBUTE(hwpoison_fops, NULL, hwpoison_inject, "%lli\n");
63
+DEFINE_DEBUGFS_ATTRIBUTE(unpoison_fops, NULL, hwpoison_unpoison, "%lli\n");
7164
7265 static void pfn_inject_exit(void)
7366 {
....@@ -76,63 +69,40 @@
7669
7770 static int pfn_inject_init(void)
7871 {
79
- struct dentry *dentry;
80
-
8172 hwpoison_dir = debugfs_create_dir("hwpoison", NULL);
82
- if (hwpoison_dir == NULL)
83
- return -ENOMEM;
8473
8574 /*
8675 * Note that the below poison/unpoison interfaces do not involve
8776 * hardware status change, hence do not require hardware support.
8877 * They are mainly for testing hwpoison in software level.
8978 */
90
- dentry = debugfs_create_file("corrupt-pfn", 0200, hwpoison_dir,
91
- NULL, &hwpoison_fops);
92
- if (!dentry)
93
- goto fail;
79
+ debugfs_create_file("corrupt-pfn", 0200, hwpoison_dir, NULL,
80
+ &hwpoison_fops);
9481
95
- dentry = debugfs_create_file("unpoison-pfn", 0200, hwpoison_dir,
96
- NULL, &unpoison_fops);
97
- if (!dentry)
98
- goto fail;
82
+ debugfs_create_file("unpoison-pfn", 0200, hwpoison_dir, NULL,
83
+ &unpoison_fops);
9984
100
- dentry = debugfs_create_u32("corrupt-filter-enable", 0600,
101
- hwpoison_dir, &hwpoison_filter_enable);
102
- if (!dentry)
103
- goto fail;
85
+ debugfs_create_u32("corrupt-filter-enable", 0600, hwpoison_dir,
86
+ &hwpoison_filter_enable);
10487
105
- dentry = debugfs_create_u32("corrupt-filter-dev-major", 0600,
106
- hwpoison_dir, &hwpoison_filter_dev_major);
107
- if (!dentry)
108
- goto fail;
88
+ debugfs_create_u32("corrupt-filter-dev-major", 0600, hwpoison_dir,
89
+ &hwpoison_filter_dev_major);
10990
110
- dentry = debugfs_create_u32("corrupt-filter-dev-minor", 0600,
111
- hwpoison_dir, &hwpoison_filter_dev_minor);
112
- if (!dentry)
113
- goto fail;
91
+ debugfs_create_u32("corrupt-filter-dev-minor", 0600, hwpoison_dir,
92
+ &hwpoison_filter_dev_minor);
11493
115
- dentry = debugfs_create_u64("corrupt-filter-flags-mask", 0600,
116
- hwpoison_dir, &hwpoison_filter_flags_mask);
117
- if (!dentry)
118
- goto fail;
94
+ debugfs_create_u64("corrupt-filter-flags-mask", 0600, hwpoison_dir,
95
+ &hwpoison_filter_flags_mask);
11996
120
- dentry = debugfs_create_u64("corrupt-filter-flags-value", 0600,
121
- hwpoison_dir, &hwpoison_filter_flags_value);
122
- if (!dentry)
123
- goto fail;
97
+ debugfs_create_u64("corrupt-filter-flags-value", 0600, hwpoison_dir,
98
+ &hwpoison_filter_flags_value);
12499
125100 #ifdef CONFIG_MEMCG
126
- dentry = debugfs_create_u64("corrupt-filter-memcg", 0600,
127
- hwpoison_dir, &hwpoison_filter_memcg);
128
- if (!dentry)
129
- goto fail;
101
+ debugfs_create_u64("corrupt-filter-memcg", 0600, hwpoison_dir,
102
+ &hwpoison_filter_memcg);
130103 #endif
131104
132105 return 0;
133
-fail:
134
- pfn_inject_exit();
135
- return -ENOMEM;
136106 }
137107
138108 module_init(pfn_inject_init);