From 7afd8259f3258a7d55eb7beef7c6dbd05167521b Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Wed, 9 Jan 2013 08:36:54 -0800 Subject: [PATCH] --- yaml --- r: 348502 b: refs/heads/master c: e53289c0c5e5a24e29e571eba7af05c845c10890 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/mm/memory.c | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 3ee532adbfca..53cdabae0d21 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 08c097fc3bb283299a6915a6a3795edab85979b1 +refs/heads/master: e53289c0c5e5a24e29e571eba7af05c845c10890 diff --git a/trunk/mm/memory.c b/trunk/mm/memory.c index 49fb1cf08611..bb1369f7b9b4 100644 --- a/trunk/mm/memory.c +++ b/trunk/mm/memory.c @@ -3711,6 +3711,14 @@ int handle_mm_fault(struct mm_struct *mm, struct vm_area_struct *vma, if (pmd_trans_huge(orig_pmd)) { unsigned int dirty = flags & FAULT_FLAG_WRITE; + /* + * If the pmd is splitting, return and retry the + * the fault. Alternative: wait until the split + * is done, and goto retry. + */ + if (pmd_trans_splitting(orig_pmd)) + return 0; + if (pmd_numa(orig_pmd)) return do_huge_pmd_numa_page(mm, vma, address, orig_pmd, pmd);