From 4a5d19acff821f386a908c4dfd65995f17df26c3 Mon Sep 17 00:00:00 2001 From: Naoya Horiguchi Date: Fri, 22 Feb 2013 16:34:05 -0800 Subject: [PATCH] --- yaml --- r: 356550 b: refs/heads/master c: 4db0e950c5b78586bea9e1b027be849631f89a17 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/mm/memory-failure.c | 12 +++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index c5e75d70fe60..292ad6c6ad30 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: af8fae7c08862bb85c5cf445bf9b36314b82111f +refs/heads/master: 4db0e950c5b78586bea9e1b027be849631f89a17 diff --git a/trunk/mm/memory-failure.c b/trunk/mm/memory-failure.c index 9cab165fd668..1a56d63adf9c 100644 --- a/trunk/mm/memory-failure.c +++ b/trunk/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); /*