diff options
author | Peter Chubb <peterc@gelato.unsw.edu.au> | 2005-06-24 00:14:00 -0400 |
---|---|---|
committer | Tony Luck <tony.luck@intel.com> | 2005-06-28 13:01:19 -0400 |
commit | a68db763af9b676590c3fe9ec3f17bf18015eb2f (patch) | |
tree | 9862af81932797f0e68f7053d253e6b6b581ea3d | |
parent | 819c67e69c4e0062787e27dd989f5f9d00d4834e (diff) |
[IA64] Fix another IA64 preemption problem
There's another problem shown up by Ingo's recent patch to make
smp_processor_id() complain if it's called with preemption enabled.
local_finish_flush_tlb_mm() calls activate_context() in a situation
where it could be rescheduled to another processor. This patch
disables preemption around the call.
Signed-off-by: Peter Chubb <peterc@gelato.unsw.edu.au>
Signed-off-by: Tony Luck <tony.luck@intel.com>
-rw-r--r-- | arch/ia64/kernel/smp.c | 3 | ||||
-rw-r--r-- | include/asm-ia64/mmu_context.h | 3 |
2 files changed, 6 insertions, 0 deletions
diff --git a/arch/ia64/kernel/smp.c b/arch/ia64/kernel/smp.c index b49d4ddaab93..0166a9847095 100644 --- a/arch/ia64/kernel/smp.c +++ b/arch/ia64/kernel/smp.c | |||
@@ -231,13 +231,16 @@ smp_flush_tlb_all (void) | |||
231 | void | 231 | void |
232 | smp_flush_tlb_mm (struct mm_struct *mm) | 232 | smp_flush_tlb_mm (struct mm_struct *mm) |
233 | { | 233 | { |
234 | preempt_disable(); | ||
234 | /* this happens for the common case of a single-threaded fork(): */ | 235 | /* this happens for the common case of a single-threaded fork(): */ |
235 | if (likely(mm == current->active_mm && atomic_read(&mm->mm_users) == 1)) | 236 | if (likely(mm == current->active_mm && atomic_read(&mm->mm_users) == 1)) |
236 | { | 237 | { |
237 | local_finish_flush_tlb_mm(mm); | 238 | local_finish_flush_tlb_mm(mm); |
239 | preempt_enable(); | ||
238 | return; | 240 | return; |
239 | } | 241 | } |
240 | 242 | ||
243 | preempt_enable(); | ||
241 | /* | 244 | /* |
242 | * We could optimize this further by using mm->cpu_vm_mask to track which CPUs | 245 | * We could optimize this further by using mm->cpu_vm_mask to track which CPUs |
243 | * have been running in the address space. It's not clear that this is worth the | 246 | * have been running in the address space. It's not clear that this is worth the |
diff --git a/include/asm-ia64/mmu_context.h b/include/asm-ia64/mmu_context.h index 0096e7e05012..e3e5fededb04 100644 --- a/include/asm-ia64/mmu_context.h +++ b/include/asm-ia64/mmu_context.h | |||
@@ -132,6 +132,9 @@ reload_context (mm_context_t context) | |||
132 | ia64_srlz_i(); /* srlz.i implies srlz.d */ | 132 | ia64_srlz_i(); /* srlz.i implies srlz.d */ |
133 | } | 133 | } |
134 | 134 | ||
135 | /* | ||
136 | * Must be called with preemption off | ||
137 | */ | ||
135 | static inline void | 138 | static inline void |
136 | activate_context (struct mm_struct *mm) | 139 | activate_context (struct mm_struct *mm) |
137 | { | 140 | { |