Skip to content

Commit

Permalink
powerpc: Fix deadlock in icswx code
Browse files Browse the repository at this point in the history
commit 8bdafa3 upstream.

The icswx code introduced an A-B B-A deadlock:

     CPU0                    CPU1
     ----                    ----
lock(&anon_vma->mutex);
                             lock(&mm->mmap_sem);
                             lock(&anon_vma->mutex);
lock(&mm->mmap_sem);

Instead of using the mmap_sem to keep mm_users constant, take the
page table spinlock.

Signed-off-by: Anton Blanchard <[email protected]>
Signed-off-by: Benjamin Herrenschmidt <[email protected]>
Signed-off-by: Greg Kroah-Hartman <[email protected]>
  • Loading branch information
antonblanchard authored and gregkh committed Nov 11, 2011
1 parent 71b1a9d commit eaeafcd
Showing 1 changed file with 6 additions and 6 deletions.
12 changes: 6 additions & 6 deletions arch/powerpc/mm/mmu_context_hash64.c
Original file line number Diff line number Diff line change
Expand Up @@ -136,8 +136,8 @@ int use_cop(unsigned long acop, struct mm_struct *mm)
if (!mm || !acop)
return -EINVAL;

/* We need to make sure mm_users doesn't change */
down_read(&mm->mmap_sem);
/* The page_table_lock ensures mm_users won't change under us */
spin_lock(&mm->page_table_lock);
spin_lock(mm->context.cop_lockp);

if (mm->context.cop_pid == COP_PID_NONE) {
Expand All @@ -164,7 +164,7 @@ int use_cop(unsigned long acop, struct mm_struct *mm)

out:
spin_unlock(mm->context.cop_lockp);
up_read(&mm->mmap_sem);
spin_unlock(&mm->page_table_lock);

return ret;
}
Expand All @@ -185,8 +185,8 @@ void drop_cop(unsigned long acop, struct mm_struct *mm)
if (WARN_ON_ONCE(!mm))
return;

/* We need to make sure mm_users doesn't change */
down_read(&mm->mmap_sem);
/* The page_table_lock ensures mm_users won't change under us */
spin_lock(&mm->page_table_lock);
spin_lock(mm->context.cop_lockp);

mm->context.acop &= ~acop;
Expand All @@ -213,7 +213,7 @@ void drop_cop(unsigned long acop, struct mm_struct *mm)
}

spin_unlock(mm->context.cop_lockp);
up_read(&mm->mmap_sem);
spin_unlock(&mm->page_table_lock);
}
EXPORT_SYMBOL_GPL(drop_cop);

Expand Down

0 comments on commit eaeafcd

Please sign in to comment.