diff options
author | Michael S. Tsirkin <mst@redhat.com> | 2009-09-21 20:03:52 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-09-22 10:17:42 -0400 |
commit | f68e14805085972b4e0b0ab684af37f713b9c262 (patch) | |
tree | 6e0cc9e1e3f29b36ec3d7acfaf863cf9bb39ea5b /mm/mmu_context.c | |
parent | 3d2d827f5ca5e32816194119d5c980c7e04474a6 (diff) |
mm: reduce atomic use on use_mm fast path
When the mm being switched to matches the active mm, we don't need to
increment and then drop the mm count. In a simple benchmark this happens
in about 50% of time. Making that conditional reduces contention on that
cacheline on SMP systems.
Acked-by: Andrea Arcangeli <aarcange@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm/mmu_context.c')
-rw-r--r-- | mm/mmu_context.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/mm/mmu_context.c b/mm/mmu_context.c index fd473b51c903..ded9081f4021 100644 --- a/mm/mmu_context.c +++ b/mm/mmu_context.c | |||
@@ -26,13 +26,16 @@ void use_mm(struct mm_struct *mm) | |||
26 | 26 | ||
27 | task_lock(tsk); | 27 | task_lock(tsk); |
28 | active_mm = tsk->active_mm; | 28 | active_mm = tsk->active_mm; |
29 | atomic_inc(&mm->mm_count); | 29 | if (active_mm != mm) { |
30 | atomic_inc(&mm->mm_count); | ||
31 | tsk->active_mm = mm; | ||
32 | } | ||
30 | tsk->mm = mm; | 33 | tsk->mm = mm; |
31 | tsk->active_mm = mm; | ||
32 | switch_mm(active_mm, mm, tsk); | 34 | switch_mm(active_mm, mm, tsk); |
33 | task_unlock(tsk); | 35 | task_unlock(tsk); |
34 | 36 | ||
35 | mmdrop(active_mm); | 37 | if (active_mm != mm) |
38 | mmdrop(active_mm); | ||
36 | } | 39 | } |
37 | 40 | ||
38 | /* | 41 | /* |