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); /*