From: David S. Miller Date: Mon, 1 May 2006 05:54:27 +0000 (-0700) Subject: [SPARC64]: Disable preemption during flush_tlb_pending(). X-Git-Tag: v2.6.17-rc4~102^2 X-Git-Url: http://ftp.safe.ca/?a=commitdiff_plain;h=c9f2946fbec88d4baa3a6d47eb3a8e6b08b05cd9;p=safe%2Fjmp%2Flinux-2.6 [SPARC64]: Disable preemption during flush_tlb_pending(). A context switch will force a call to flush_tlb_pending() (via switch_to()), so if we test tlb_nr to be non-zero, then sleep, it would become zero and later back at the original context we'll pass zero down into the TLB flushing code which should never see a nr argument of zero. Signed-off-by: David S. Miller --- diff --git a/arch/sparc64/mm/tlb.c b/arch/sparc64/mm/tlb.c index a079cf4..3f10fc9 100644 --- a/arch/sparc64/mm/tlb.c +++ b/arch/sparc64/mm/tlb.c @@ -8,6 +8,7 @@ #include #include #include +#include #include #include @@ -24,6 +25,8 @@ void flush_tlb_pending(void) { struct mmu_gather *mp = &__get_cpu_var(mmu_gathers); + preempt_disable(); + if (mp->tlb_nr) { flush_tsb_user(mp); @@ -38,6 +41,8 @@ void flush_tlb_pending(void) } mp->tlb_nr = 0; } + + preempt_enable(); } void tlb_batch_add(struct mm_struct *mm, unsigned long vaddr, pte_t *ptep, pte_t orig)