Commit c9fbdd5f131440981b124883656ea21fb12cde4a

Authored by Naoya Horiguchi
Committed by Andi Kleen
1 parent 7013febc89

HWPOISON, hugetlb: maintain mce_bad_pages in handling hugepage error

For now all pages in the error hugepage are considered as hwpoisoned,
so count all of them in mce_bad_pages.

Dependency:
  "HWPOISON, hugetlb: enable error handling path for hugepage"

Signed-off-by: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Acked-by: Fengguang Wu <fengguang.wu@intel.com>
Signed-off-by: Andi Kleen <ak@linux.intel.com>

Showing 1 changed file with 10 additions and 5 deletions Side-by-side Diff

... ... @@ -942,6 +942,7 @@
942 942 struct page *p;
943 943 struct page *hpage;
944 944 int res;
  945 + unsigned int nr_pages;
945 946  
946 947 if (!sysctl_memory_failure_recovery)
947 948 panic("Memory failure from trap %d on page %lx", trapno, pfn);
... ... @@ -960,7 +961,8 @@
960 961 return 0;
961 962 }
962 963  
963   - atomic_long_add(1, &mce_bad_pages);
  964 + nr_pages = 1 << compound_order(hpage);
  965 + atomic_long_add(nr_pages, &mce_bad_pages);
964 966  
965 967 /*
966 968 * We need/can do nothing about count=0 pages.
... ... @@ -1024,7 +1026,7 @@
1024 1026 }
1025 1027 if (hwpoison_filter(p)) {
1026 1028 if (TestClearPageHWPoison(p))
1027   - atomic_long_dec(&mce_bad_pages);
  1029 + atomic_long_sub(nr_pages, &mce_bad_pages);
1028 1030 unlock_page(hpage);
1029 1031 put_page(hpage);
1030 1032 return 0;
... ... @@ -1123,6 +1125,7 @@
1123 1125 struct page *page;
1124 1126 struct page *p;
1125 1127 int freeit = 0;
  1128 + unsigned int nr_pages;
1126 1129  
1127 1130 if (!pfn_valid(pfn))
1128 1131 return -ENXIO;
1129 1132  
... ... @@ -1135,9 +1138,11 @@
1135 1138 return 0;
1136 1139 }
1137 1140  
  1141 + nr_pages = 1 << compound_order(page);
  1142 +
1138 1143 if (!get_page_unless_zero(page)) {
1139 1144 if (TestClearPageHWPoison(p))
1140   - atomic_long_dec(&mce_bad_pages);
  1145 + atomic_long_sub(nr_pages, &mce_bad_pages);
1141 1146 pr_debug("MCE: Software-unpoisoned free page %#lx\n", pfn);
1142 1147 return 0;
1143 1148 }
1144 1149  
... ... @@ -1149,9 +1154,9 @@
1149 1154 * the PG_hwpoison page will be caught and isolated on the entrance to
1150 1155 * the free buddy page pool.
1151 1156 */
1152   - if (TestClearPageHWPoison(p)) {
  1157 + if (TestClearPageHWPoison(page)) {
1153 1158 pr_debug("MCE: Software-unpoisoned page %#lx\n", pfn);
1154   - atomic_long_dec(&mce_bad_pages);
  1159 + atomic_long_sub(nr_pages, &mce_bad_pages);
1155 1160 freeit = 1;
1156 1161 }
1157 1162 if (PageHuge(p))