Skip to content

Commit

Permalink
[SPARC64]: Bulletproof MMU context locking.
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
David S. Miller committed Mar 20, 2006
1 parent 9132983 commit a77754b
Show file tree
Hide file tree
Showing 3 changed files with 7 additions and 5 deletions.
5 changes: 3 additions & 2 deletions arch/sparc64/mm/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -639,9 +639,10 @@ void get_new_mmu_context(struct mm_struct *mm)
{
unsigned long ctx, new_ctx;
unsigned long orig_pgsz_bits;
unsigned long flags;
int new_version;

spin_lock(&ctx_alloc_lock);
spin_lock_irqsave(&ctx_alloc_lock, flags);
orig_pgsz_bits = (mm->context.sparc64_ctx_val & CTX_PGSZ_MASK);
ctx = (tlb_context_cache + 1) & CTX_NR_MASK;
new_ctx = find_next_zero_bit(mmu_context_bmap, 1 << CTX_NR_BITS, ctx);
Expand Down Expand Up @@ -677,7 +678,7 @@ void get_new_mmu_context(struct mm_struct *mm)
out:
tlb_context_cache = new_ctx;
mm->context.sparc64_ctx_val = new_ctx | orig_pgsz_bits;
spin_unlock(&ctx_alloc_lock);
spin_unlock_irqrestore(&ctx_alloc_lock, flags);

if (unlikely(new_version))
smp_new_mmu_context_version();
Expand Down
1 change: 1 addition & 0 deletions arch/sparc64/mm/tsb.c
Original file line number Diff line number Diff line change
Expand Up @@ -354,6 +354,7 @@ void tsb_grow(struct mm_struct *mm, unsigned long rss, gfp_t gfp_flags)

int init_new_context(struct task_struct *tsk, struct mm_struct *mm)
{
spin_lock_init(&mm->context.lock);

mm->context.sparc64_ctx_val = 0UL;

Expand Down
6 changes: 3 additions & 3 deletions include/asm-sparc64/mmu_context.h
Original file line number Diff line number Diff line change
Expand Up @@ -67,14 +67,14 @@ extern void __flush_tlb_mm(unsigned long, unsigned long);
/* Switch the current MM context. Interrupts are disabled. */
static inline void switch_mm(struct mm_struct *old_mm, struct mm_struct *mm, struct task_struct *tsk)
{
unsigned long ctx_valid;
unsigned long ctx_valid, flags;
int cpu;

spin_lock(&mm->context.lock);
spin_lock_irqsave(&mm->context.lock, flags);
ctx_valid = CTX_VALID(mm->context);
if (!ctx_valid)
get_new_mmu_context(mm);
spin_unlock(&mm->context.lock);
spin_unlock_irqrestore(&mm->context.lock, flags);

if (!ctx_valid || (old_mm != mm)) {
load_secondary_context(mm);
Expand Down

0 comments on commit a77754b

Please sign in to comment.