aboutsummaryrefslogtreecommitdiffstats
path: root/include/asm-sparc64
diff options
context:
space:
mode:
authorDavid S. Miller <davem@sunset.davemloft.net>2006-03-06 22:59:50 -0500
committerDavid S. Miller <davem@sunset.davemloft.net>2006-03-20 04:14:20 -0500
commita77754b4d0731321db266c6c60ffcd7c62757da5 (patch)
tree37cc4c6793e2b616791d42ee840e5a007a13eccb /include/asm-sparc64
parent9132983ae140a8ca81e95e081d5a4c0dd7a7f670 (diff)
[SPARC64]: Bulletproof MMU context locking.
1) Always spin_lock_init() in init_context(). The caller essentially clears it out, or copies the mm info from the parent. In both cases we need to explicitly initialize the spinlock. 2) Always do explicit IRQ disabling while taking mm->context.lock and ctx_alloc_lock. Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/asm-sparc64')
-rw-r--r--include/asm-sparc64/mmu_context.h6
1 files changed, 3 insertions, 3 deletions
diff --git a/include/asm-sparc64/mmu_context.h b/include/asm-sparc64/mmu_context.h
index 4be40c58e3c1..ca36ea96f64b 100644
--- a/include/asm-sparc64/mmu_context.h
+++ b/include/asm-sparc64/mmu_context.h
@@ -67,14 +67,14 @@ extern void __flush_tlb_mm(unsigned long, unsigned long);
67/* Switch the current MM context. Interrupts are disabled. */ 67/* Switch the current MM context. Interrupts are disabled. */
68static inline void switch_mm(struct mm_struct *old_mm, struct mm_struct *mm, struct task_struct *tsk) 68static inline void switch_mm(struct mm_struct *old_mm, struct mm_struct *mm, struct task_struct *tsk)
69{ 69{
70 unsigned long ctx_valid; 70 unsigned long ctx_valid, flags;
71 int cpu; 71 int cpu;
72 72
73 spin_lock(&mm->context.lock); 73 spin_lock_irqsave(&mm->context.lock, flags);
74 ctx_valid = CTX_VALID(mm->context); 74 ctx_valid = CTX_VALID(mm->context);
75 if (!ctx_valid) 75 if (!ctx_valid)
76 get_new_mmu_context(mm); 76 get_new_mmu_context(mm);
77 spin_unlock(&mm->context.lock); 77 spin_unlock_irqrestore(&mm->context.lock, flags);
78 78
79 if (!ctx_valid || (old_mm != mm)) { 79 if (!ctx_valid || (old_mm != mm)) {
80 load_secondary_context(mm); 80 load_secondary_context(mm);