Commit c9fbdd5f131440981b124883656ea21fb12cde4a
Committed by
Andi Kleen
1 parent
7013febc89
Exists in
master
and in
4 other branches
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
mm/memory-failure.c
... | ... | @@ -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)) |