|
@@ -160,7 +160,18 @@ static int gup_pmd_range(pud_t pud, unsigned long addr, unsigned long end,
|
|
|
pmd_t pmd = *pmdp;
|
|
|
|
|
|
next = pmd_addr_end(addr, end);
|
|
|
- if (pmd_none(pmd))
|
|
|
+ /*
|
|
|
+ * The pmd_trans_splitting() check below explains why
|
|
|
+ * pmdp_splitting_flush has to flush the tlb, to stop
|
|
|
+ * this gup-fast code from running while we set the
|
|
|
+ * splitting bit in the pmd. Returning zero will take
|
|
|
+ * the slow path that will call wait_split_huge_page()
|
|
|
+ * if the pmd is still in splitting state. gup-fast
|
|
|
+ * can't because it has irq disabled and
|
|
|
+ * wait_split_huge_page() would never return as the
|
|
|
+ * tlb flush IPI wouldn't run.
|
|
|
+ */
|
|
|
+ if (pmd_none(pmd) || pmd_trans_splitting(pmd))
|
|
|
return 0;
|
|
|
if (unlikely(pmd_large(pmd))) {
|
|
|
if (!gup_huge_pmd(pmd, addr, next, write, pages, nr))
|