mm: disable preemption in apply_to_pte_range
authorJeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Thu, 12 Feb 2009 21:45:34 +0000 (13:45 -0800)
committerJeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Mon, 30 Mar 2009 06:29:15 +0000 (23:29 -0700)
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 baa999e87cd21d2f9e67c8e3b1093bb6831513fb..b80cc31292b1e78199db38644c85f296426ba3a0 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);