|
@@ -771,6 +771,27 @@ out:
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+#ifdef CONFIG_MEMORY_FAILURE
|
|
|
+static void clear_hwpoisoned_pages(struct page *memmap, int nr_pages)
|
|
|
+{
|
|
|
+ int i;
|
|
|
+
|
|
|
+ if (!memmap)
|
|
|
+ return;
|
|
|
+
|
|
|
+ for (i = 0; i < PAGES_PER_SECTION; i++) {
|
|
|
+ if (PageHWPoison(&memmap[i])) {
|
|
|
+ atomic_long_sub(1, &mce_bad_pages);
|
|
|
+ ClearPageHWPoison(&memmap[i]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+#else
|
|
|
+static inline void clear_hwpoisoned_pages(struct page *memmap, int nr_pages)
|
|
|
+{
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
void sparse_remove_one_section(struct zone *zone, struct mem_section *ms)
|
|
|
{
|
|
|
struct page *memmap = NULL;
|
|
@@ -784,6 +805,7 @@ void sparse_remove_one_section(struct zone *zone, struct mem_section *ms)
|
|
|
ms->pageblock_flags = NULL;
|
|
|
}
|
|
|
|
|
|
+ clear_hwpoisoned_pages(memmap, PAGES_PER_SECTION);
|
|
|
free_section_usemap(memmap, usemap);
|
|
|
}
|
|
|
#endif
|