[linux-yocto] [PATCH 19/23] mm: hugetlb: fix copy_hugetlb_page_range()
Yang Shi
yang.shi at windriver.com
Wed Jul 30 19:16:23 PDT 2014
From: Naoya Horiguchi <n-horiguchi at ah.jp.nec.com>
commit 0253d634e0803a8376a0d88efee0bf523d8673f9 upstream
Commit 4a705fef9862 ("hugetlb: fix copy_hugetlb_page_range() to handle
migration/hwpoisoned entry") changed the order of
huge_ptep_set_wrprotect() and huge_ptep_get(), which leads to breakage
in some workloads like hugepage-backed heap allocation via libhugetlbfs.
This patch fixes it.
The test program for the problem is shown below:
$ cat heap.c
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#define HPS 0x200000
int main() {
int i;
char *p = malloc(HPS);
memset(p, '1', HPS);
for (i = 0; i < 5; i++) {
if (!fork()) {
memset(p, '2', HPS);
p = malloc(HPS);
memset(p, '3', HPS);
free(p);
return 0;
}
}
sleep(1);
free(p);
return 0;
}
$ export HUGETLB_MORECORE=yes ; export HUGETLB_NO_PREFAULT= ; hugectl --heap ./heap
Fixes 4a705fef9862 ("hugetlb: fix copy_hugetlb_page_range() to handle
migration/hwpoisoned entry"), so is applicable to -stable kernels which
include it.
Signed-off-by: Naoya Horiguchi <n-horiguchi at ah.jp.nec.com>
Reported-by: Guillaume Morin <guillaume at morinfr.org>
Suggested-by: Guillaume Morin <guillaume at morinfr.org>
Acked-by: Hugh Dickins <hughd at google.com>
Cc: <stable at vger.kernel.org> [2.6.37+]
Signed-off-by: Andrew Morton <akpm at linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>
Signed-off-by: Yang Shi <yang.shi at windriver.com>
---
mm/hugetlb.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/mm/hugetlb.c b/mm/hugetlb.c
index ba04a58..4901fc9 100644
--- a/mm/hugetlb.c
+++ b/mm/hugetlb.c
@@ -2603,6 +2603,7 @@ int copy_hugetlb_page_range(struct mm_struct *dst, struct mm_struct *src,
} else {
if (cow)
huge_ptep_set_wrprotect(src, addr, src_pte);
+ entry = huge_ptep_get(src_pte);
ptepage = pte_page(entry);
get_page(ptepage);
page_dup_rmap(ptepage);
--
2.0.2
More information about the linux-yocto
mailing list