mm: disable preemption in apply_to_pte_range
Jeremy Fitzhardinge [Thu, 12 Feb 2009 21:45:34 +0000 (13:45 -0800)]
Impact: bugfix

Lazy mmu mode needs preemption disabled, so if we're apply to
init_mm (which doesn't require any pte locks), then explicitly
disable preemption.  (Do it unconditionally after checking we've
successfully done the allocation to simplify the error handling.)

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>

mm/memory.c

index baa999e..b80cc31 100644 (file)
@@ -1718,6 +1718,7 @@ static int apply_to_pte_range(struct mm_struct *mm, pmd_t *pmd,
 
        BUG_ON(pmd_huge(*pmd));
 
+       preempt_disable();
        arch_enter_lazy_mmu_mode();
 
        token = pmd_pgtable(*pmd);
@@ -1729,6 +1730,7 @@ static int apply_to_pte_range(struct mm_struct *mm, pmd_t *pmd,
        } while (pte++, addr += PAGE_SIZE, addr != end);
 
        arch_leave_lazy_mmu_mode();
+       preempt_enable();
 
        if (mm != &init_mm)
                pte_unmap_unlock(pte-1, ptl);