[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 <davem@davemloft.net>
This commit is contained in:
parent
1241140f51
commit
c9f2946fbe
1 changed files with 5 additions and 0 deletions
|
@ -8,6 +8,7 @@
|
|||
#include <linux/percpu.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/swap.h>
|
||||
#include <linux/preempt.h>
|
||||
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/pgalloc.h>
|
||||
|
@ -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)
|
||||
|
|
Loading…
Reference in a new issue