aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuillaume Autran <gautran@mrv.com>2005-07-13 01:10:45 -0700
committerLinus Torvalds <torvalds@g5.osdl.org>2005-07-13 11:25:24 -0700
commitddca3b80cef36cc668f924ef5154a79acb19ebd7 (patch)
tree2cfb8ac6837682d975a1cb761360977ac54a6aef
parent88bd5121d635136e01369141367f315665534b3c (diff)
[PATCH] ppc32: fix destroy_context() race condition
Fix for a race condition when a task gets preempted by another task while executing the destroy_context(...) in a FEW_CONTEXTS environment. mm->context == NO_CONTEXT but the context_map may indicate all contexts are in use. The solution to this problem is to disable kernel preemption while destroying a MMU context. Signed-off-by: Guillaume Autran <gautran@mrv.com> Acked-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r--include/asm-ppc/mmu_context.h2
1 files changed, 2 insertions, 0 deletions
diff --git a/include/asm-ppc/mmu_context.h b/include/asm-ppc/mmu_context.h
index ccabbce39d8..afe26ffc2e2 100644
--- a/include/asm-ppc/mmu_context.h
+++ b/include/asm-ppc/mmu_context.h
@@ -149,6 +149,7 @@ static inline void get_mmu_context(struct mm_struct *mm)
*/
static inline void destroy_context(struct mm_struct *mm)
{
+ preempt_disable();
if (mm->context != NO_CONTEXT) {
clear_bit(mm->context, context_map);
mm->context = NO_CONTEXT;
@@ -156,6 +157,7 @@ static inline void destroy_context(struct mm_struct *mm)
atomic_inc(&nr_free_contexts);
#endif
}
+ preempt_enable();
}
static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next,