num_poisoned_pages counts up the number of pages isolated by memory
errors. But for thp, only one subpage is isolated because memory error
handler splits it, so it's wrong to add (1 << compound_trans_order).
Signed-off-by: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
Cc: Andi Kleen <andi@firstfloor.org>
Cc: Tony Luck <tony.luck@intel.com>
Cc: Wu Fengguang <fengguang.wu@intel.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
return 0;
}
- nr_pages = 1 << compound_trans_order(hpage);
+ /*
+ * Currently errors on hugetlbfs pages are contained in hugepage
+ * unit, so nr_pages should be 1 << compound_order. OTOH when
+ * errors are on transparent hugepages, they are supposed to be
+ * split and error containment is done in normal page unit.
+ * So nr_pages should be one in this case.
+ */
+ if (PageHuge(p))
+ nr_pages = 1 << compound_order(hpage);
+ else /* normal page or thp */
+ nr_pages = 1;
atomic_long_add(nr_pages, &num_poisoned_pages);
/*