diff options
| author | Ingo Molnar <mingo@kernel.org> | 2012-12-02 14:56:46 -0500 |
|---|---|---|
| committer | Mel Gorman <mgorman@suse.de> | 2012-12-11 09:43:00 -0500 |
| commit | 5a505085f043e8380f83610f79642853c051e2f1 (patch) | |
| tree | c9e86ee196b1ef87350ee9b268a515e2eae4d307 /include | |
| parent | d28d433512f4f387e2563c14db45a7bb8a338b1a (diff) | |
mm/rmap: Convert the struct anon_vma::mutex to an rwsem
Convert the struct anon_vma::mutex to an rwsem, which will help
in solving a page-migration scalability problem. (Addressed in
a separate patch.)
The conversion is simple and straightforward: in every case
where we mutex_lock()ed we'll now down_write().
Suggested-by: Linus Torvalds <torvalds@linux-foundation.org>
Reviewed-by: Rik van Riel <riel@redhat.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Paul Turner <pjt@google.com>
Cc: Lee Schermerhorn <Lee.Schermerhorn@hp.com>
Cc: Christoph Lameter <cl@linux.com>
Cc: Mel Gorman <mgorman@suse.de>
Cc: Andrea Arcangeli <aarcange@redhat.com>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Hugh Dickins <hughd@google.com>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Signed-off-by: Mel Gorman <mgorman@suse.de>
Diffstat (limited to 'include')
| -rw-r--r-- | include/linux/rmap.h | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/include/linux/rmap.h b/include/linux/rmap.h index bfe1f4780644..f3f41d242e25 100644 --- a/include/linux/rmap.h +++ b/include/linux/rmap.h | |||
| @@ -7,7 +7,7 @@ | |||
| 7 | #include <linux/list.h> | 7 | #include <linux/list.h> |
| 8 | #include <linux/slab.h> | 8 | #include <linux/slab.h> |
| 9 | #include <linux/mm.h> | 9 | #include <linux/mm.h> |
| 10 | #include <linux/mutex.h> | 10 | #include <linux/rwsem.h> |
| 11 | #include <linux/memcontrol.h> | 11 | #include <linux/memcontrol.h> |
| 12 | 12 | ||
| 13 | /* | 13 | /* |
| @@ -25,8 +25,8 @@ | |||
| 25 | * pointing to this anon_vma once its vma list is empty. | 25 | * pointing to this anon_vma once its vma list is empty. |
| 26 | */ | 26 | */ |
| 27 | struct anon_vma { | 27 | struct anon_vma { |
| 28 | struct anon_vma *root; /* Root of this anon_vma tree */ | 28 | struct anon_vma *root; /* Root of this anon_vma tree */ |
| 29 | struct mutex mutex; /* Serialize access to vma list */ | 29 | struct rw_semaphore rwsem; /* W: modification, R: walking the list */ |
| 30 | /* | 30 | /* |
| 31 | * The refcount is taken on an anon_vma when there is no | 31 | * The refcount is taken on an anon_vma when there is no |
| 32 | * guarantee that the vma of page tables will exist for | 32 | * guarantee that the vma of page tables will exist for |
| @@ -64,7 +64,7 @@ struct anon_vma_chain { | |||
| 64 | struct vm_area_struct *vma; | 64 | struct vm_area_struct *vma; |
| 65 | struct anon_vma *anon_vma; | 65 | struct anon_vma *anon_vma; |
| 66 | struct list_head same_vma; /* locked by mmap_sem & page_table_lock */ | 66 | struct list_head same_vma; /* locked by mmap_sem & page_table_lock */ |
| 67 | struct rb_node rb; /* locked by anon_vma->mutex */ | 67 | struct rb_node rb; /* locked by anon_vma->rwsem */ |
| 68 | unsigned long rb_subtree_last; | 68 | unsigned long rb_subtree_last; |
| 69 | #ifdef CONFIG_DEBUG_VM_RB | 69 | #ifdef CONFIG_DEBUG_VM_RB |
| 70 | unsigned long cached_vma_start, cached_vma_last; | 70 | unsigned long cached_vma_start, cached_vma_last; |
| @@ -108,24 +108,24 @@ static inline void vma_lock_anon_vma(struct vm_area_struct *vma) | |||
| 108 | { | 108 | { |
| 109 | struct anon_vma *anon_vma = vma->anon_vma; | 109 | struct anon_vma *anon_vma = vma->anon_vma; |
| 110 | if (anon_vma) | 110 | if (anon_vma) |
| 111 | mutex_lock(&anon_vma->root->mutex); | 111 | down_write(&anon_vma->root->rwsem); |
| 112 | } | 112 | } |
| 113 | 113 | ||
| 114 | static inline void vma_unlock_anon_vma(struct vm_area_struct *vma) | 114 | static inline void vma_unlock_anon_vma(struct vm_area_struct *vma) |
| 115 | { | 115 | { |
| 116 | struct anon_vma *anon_vma = vma->anon_vma; | 116 | struct anon_vma *anon_vma = vma->anon_vma; |
| 117 | if (anon_vma) | 117 | if (anon_vma) |
| 118 | mutex_unlock(&anon_vma->root->mutex); | 118 | up_write(&anon_vma->root->rwsem); |
| 119 | } | 119 | } |
| 120 | 120 | ||
| 121 | static inline void anon_vma_lock(struct anon_vma *anon_vma) | 121 | static inline void anon_vma_lock(struct anon_vma *anon_vma) |
| 122 | { | 122 | { |
| 123 | mutex_lock(&anon_vma->root->mutex); | 123 | down_write(&anon_vma->root->rwsem); |
| 124 | } | 124 | } |
| 125 | 125 | ||
| 126 | static inline void anon_vma_unlock(struct anon_vma *anon_vma) | 126 | static inline void anon_vma_unlock(struct anon_vma *anon_vma) |
| 127 | { | 127 | { |
| 128 | mutex_unlock(&anon_vma->root->mutex); | 128 | up_write(&anon_vma->root->rwsem); |
| 129 | } | 129 | } |
| 130 | 130 | ||
| 131 | /* | 131 | /* |
