The commit is pushed to "branch-rh7-3.10.0-229.7.2.vz7.9.x-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git after rh7-3.10.0-229.7.2.vz7.9.15 ------> commit 7d409af21c38dea0fb3654bb9e88aa693c05024b Author: Vladimir Davydov <vdavy...@virtuozzo.com> Date: Tue Dec 8 18:15:55 2015 +0400
ms/mm/rmap: factor lock function out of rmap_walk_anon() Patchset description: rmap_walk() present in RH7 requires the caller to either hold mmap_sem or pin the page's anon_vma. page_idle_clear_pte_refs does neither. As a result, it might end up trying to lock/unlock anon_vma which has already been freed and possibly reallocated. This won't do any good. Let's pull the new version of rmap_walk() from upstream, which allows to specify a custom anon_vma lock function and use it in page_idle code to avoid this issue. This patch puts page_idle in sync with upstream. I hope this will fix: https://jira.sw.ru/browse/PSBM-42015 Joonsoo Kim (3): mm/rmap: factor lock function out of rmap_walk_anon() mm/rmap: make rmap_walk to get the rmap_walk_control argument mm/rmap: extend rmap_walk_xxx() to cope with different cases Vladimir Davydov (1): mm: page_idle: look up page anon_vma carefully when checking references ============================ This patch description: From: Joonsoo Kim <iamjoonsoo....@lge.com> When we traverse anon_vma, we need to take a read-side anon_lock. But there is subtle difference in the situation so that we can't use same method to take a lock in each cases. Therefore, we need to make rmap_walk_anon() taking difference lock function. This patch is the first step, factoring lock function for anon_lock out of rmap_walk_anon(). It will be used in case of removing migration entry and in default of rmap_walk_anon(). Signed-off-by: Joonsoo Kim <iamjoonsoo....@lge.com> Reviewed-by: Naoya Horiguchi <n-horigu...@ah.jp.nec.com> Cc: Mel Gorman <mgor...@suse.de> Cc: Hugh Dickins <hu...@google.com> Cc: Rik van Riel <r...@redhat.com> Cc: Ingo Molnar <mi...@kernel.org> Cc: Hillf Danton <dhi...@gmail.com> Signed-off-by: Andrew Morton <a...@linux-foundation.org> Signed-off-by: Linus Torvalds <torva...@linux-foundation.org> (cherry picked from commit faecd8dd852d4e4a63a1b8ad43e5df8e41ee0336) Signed-off-by: Vladimir Davydov <vdavy...@virtuozzo.com> --- mm/rmap.c | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/mm/rmap.c b/mm/rmap.c index 5039034..df4b9d1 100644 --- a/mm/rmap.c +++ b/mm/rmap.c @@ -1749,6 +1749,24 @@ void __put_anon_vma(struct anon_vma *anon_vma) } #ifdef CONFIG_MIGRATION +static struct anon_vma *rmap_walk_anon_lock(struct page *page) +{ + struct anon_vma *anon_vma; + + /* + * Note: remove_migration_ptes() cannot use page_lock_anon_vma_read() + * because that depends on page_mapped(); but not all its usages + * are holding mmap_sem. Users without mmap_sem are required to + * take a reference count to prevent the anon_vma disappearing + */ + anon_vma = page_anon_vma(page); + if (!anon_vma) + return NULL; + + anon_vma_lock_read(anon_vma); + return anon_vma; +} + /* * rmap_walk() and its helpers rmap_walk_anon() and rmap_walk_file(): * Called by migrate.c to remove migration ptes, but might be used more later. @@ -1761,16 +1779,10 @@ static int rmap_walk_anon(struct page *page, int (*rmap_one)(struct page *, struct anon_vma_chain *avc; int ret = SWAP_AGAIN; - /* - * Note: remove_migration_ptes() cannot use page_lock_anon_vma_read() - * because that depends on page_mapped(); but not all its usages - * are holding mmap_sem. Users without mmap_sem are required to - * take a reference count to prevent the anon_vma disappearing - */ - anon_vma = page_anon_vma(page); + anon_vma = rmap_walk_anon_lock(page); if (!anon_vma) return ret; - anon_vma_lock_read(anon_vma); + anon_vma_interval_tree_foreach(avc, &anon_vma->rb_root, pgoff, pgoff) { struct vm_area_struct *vma = avc->vma; unsigned long address = vma_address(page, vma); _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel