diff options
author | Randolph Chung <tausq@debian.org> | 2006-12-11 16:07:51 -0800 |
---|---|---|
committer | Kyle McMartin <kyle@athena.road.mcmartin.ca> | 2007-02-17 00:41:27 -0500 |
commit | 592ac93a607109e0643da6c23ae07ac749e973b1 (patch) | |
tree | cddb6ef701a2e76e8e38daf592745065f65aa4e4 | |
parent | e7b3ca08549caccf5d6e1cf066780bf4f0ae77a7 (diff) | |
download | op-kernel-dev-592ac93a607109e0643da6c23ae07ac749e973b1.zip op-kernel-dev-592ac93a607109e0643da6c23ae07ac749e973b1.tar.gz |
[PARISC] Optimize TLB flush on SMP systems
Signed-off-by: Randolph Chung <tausq@debian.org>
Signed-off-by: Kyle McMartin <kyle@parisc-linux.org>
-rw-r--r-- | include/asm-parisc/tlbflush.h | 24 |
1 files changed, 11 insertions, 13 deletions
diff --git a/include/asm-parisc/tlbflush.h b/include/asm-parisc/tlbflush.h index f662e83..67b3814 100644 --- a/include/asm-parisc/tlbflush.h +++ b/include/asm-parisc/tlbflush.h @@ -39,21 +39,19 @@ extern void flush_tlb_all_local(void *); * etc. do not do that). */ -static inline void flush_tlb_mm(struct mm_struct *mm) +static inline void __flush_tlb_mm(void *mmv) { - BUG_ON(mm == &init_mm); /* Should never happen */ + struct mm_struct *mm = (struct mm_struct *)mmv; + if (mm == current->active_mm) + load_context(mm->context); +} -#ifdef CONFIG_SMP - flush_tlb_all(); -#else - if (mm) { - if (mm->context != 0) - free_sid(mm->context); - mm->context = alloc_sid(); - if (mm == current->active_mm) - load_context(mm->context); - } -#endif +static inline void flush_tlb_mm(struct mm_struct *mm) +{ + if (mm->context != 0) + free_sid(mm->context); + mm->context = alloc_sid(); + on_each_cpu(__flush_tlb_mm, mm, 1, 1); } extern __inline__ void flush_tlb_pgtables(struct mm_struct *mm, unsigned long start, unsigned long end) |