mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-30 19:51:31 -04:00
mm: always lock the root (oldest) anon_vma
Always (and only) lock the root (oldest) anon_vma whenever we do something in an anon_vma. The recently introduced anon_vma scalability is due to the rmap code scanning only the VMAs that need to be scanned. Many common operations still took the anon_vma lock on the root anon_vma, so always taking that lock is not expected to introduce any scalability issues. However, always taking the same lock does mean we only need to take one lock, which means rmap_walk on pages from any anon_vma in the vma is excluded from occurring during an munmap, expand_stack or other operation that needs to exclude rmap_walk and similar functions. Also add the proper locking to vma_adjust. Signed-off-by: Rik van Riel <[email protected]> Tested-by: Larry Woodman <[email protected]> Acked-by: Larry Woodman <[email protected]> Reviewed-by: Minchan Kim <[email protected]> Reviewed-by: KAMEZAWA Hiroyuki <[email protected]> Acked-by: Mel Gorman <[email protected]> Acked-by: Linus Torvalds <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
This commit is contained in:
parent
5c341ee1df
commit
012f18004d
4 changed files with 28 additions and 14 deletions
2
mm/ksm.c
2
mm/ksm.c
|
|
@ -325,7 +325,7 @@ static void drop_anon_vma(struct rmap_item *rmap_item)
|
|||
{
|
||||
struct anon_vma *anon_vma = rmap_item->anon_vma;
|
||||
|
||||
if (atomic_dec_and_lock(&anon_vma->external_refcount, &anon_vma->lock)) {
|
||||
if (atomic_dec_and_lock(&anon_vma->external_refcount, &anon_vma->root->lock)) {
|
||||
int empty = list_empty(&anon_vma->head);
|
||||
anon_vma_unlock(anon_vma);
|
||||
if (empty)
|
||||
|
|
|
|||
Loading…
Reference in a new issue