From b7d7f0c984e45a9429882c1fbd9dd377a275e31f Mon Sep 17 00:00:00 2001 From: Naoya Horiguchi Date: Thu, 7 Feb 2013 12:26:44 +1100 Subject: [PATCH] mm/memory-failure.c: fix wrong num_poisoned_pages in handling memory error on thp 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 Cc: Andi Kleen Cc: Tony Luck Cc: Wu Fengguang Signed-off-by: Andrew Morton --- mm/memory-failure.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/mm/memory-failure.c b/mm/memory-failure.c index 9cab165fd668..9b1e5e7078a1 100644 --- a/mm/memory-failure.c +++ b/mm/memory-failure.c @@ -1039,7 +1039,17 @@ int memory_failure(unsigned long pfn, int trapno, int flags) 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); /* -- 2.39.5