diff options
Diffstat (limited to 'mm/migrate.c')
-rw-r--r-- | mm/migrate.c | 10 |
1 files changed, 3 insertions, 7 deletions
diff --git a/mm/migrate.c b/mm/migrate.c index 5208fa1d9712..38e7cad782f4 100644 --- a/mm/migrate.c +++ b/mm/migrate.c | |||
@@ -639,7 +639,7 @@ static int unmap_and_move(new_page_t get_new_page, unsigned long private, | |||
639 | * exist when the page is remapped later | 639 | * exist when the page is remapped later |
640 | */ | 640 | */ |
641 | anon_vma = page_anon_vma(page); | 641 | anon_vma = page_anon_vma(page); |
642 | atomic_inc(&anon_vma->external_refcount); | 642 | get_anon_vma(anon_vma); |
643 | } | 643 | } |
644 | } | 644 | } |
645 | 645 | ||
@@ -682,12 +682,8 @@ skip_unmap: | |||
682 | rcu_unlock: | 682 | rcu_unlock: |
683 | 683 | ||
684 | /* Drop an anon_vma reference if we took one */ | 684 | /* Drop an anon_vma reference if we took one */ |
685 | if (anon_vma && atomic_dec_and_lock(&anon_vma->external_refcount, &anon_vma->root->lock)) { | 685 | if (anon_vma) |
686 | int empty = list_empty(&anon_vma->head); | 686 | drop_anon_vma(anon_vma); |
687 | anon_vma_unlock(anon_vma); | ||
688 | if (empty) | ||
689 | anon_vma_free(anon_vma); | ||
690 | } | ||
691 | 687 | ||
692 | if (rcu_locked) | 688 | if (rcu_locked) |
693 | rcu_read_unlock(); | 689 | rcu_read_unlock(); |