diff options
author | Naoya Horiguchi <[email protected]> | 2013-02-22 16:34:05 -0800 |
---|---|---|
committer | Linus Torvalds <[email protected]> | 2013-02-23 17:50:15 -0800 |
commit | 4db0e950c5b78586bea9e1b027be849631f89a17 (patch) | |
tree | 5a61c3ebe9274fdd744c59b0d078bb1a18e392b6 | |
parent | af8fae7c08862bb85c5cf445bf9b36314b82111f (diff) |
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).
[[email protected]: tweak comment]
Signed-off-by: Naoya Horiguchi <[email protected]>
Cc: Andi Kleen <[email protected]>
Cc: Tony Luck <[email protected]>
Cc: Wu Fengguang <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
-rw-r--r-- | mm/memory-failure.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/mm/memory-failure.c b/mm/memory-failure.c index 9cab165fd668..1a56d63adf9c 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 measured in hugepage units, + * so nr_pages should be 1 << compound_order. OTOH when errors are on + * transparent hugepages, they are supposed to be split and error + * measurement is done in normal page units. 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); /* |