Prev: [PATCH -mm 5/6] resurrect page_address_in_vma anon_vma check
Next: CRYPTO: ablkcipher, avoid NULL dereference
From: Rik van Riel on 21 Jun 2010 16:50 From: Andrea Arcangeli <aarcange(a)redhat.com> Subject: always use anon_vma root pointer Always use anon_vma->root pointer instead of anon_vma_chain.prev. Also optimize the map-paths, if a mapping is already established no need to overwrite it with root anon-vma list, we can keep the more finegrined anon-vma and skip the overwrite: see the PageAnon check in !exclusive case. This is also the optimization that hidden the ksm bug as this tends to make ksm_might_need_to_copy skip the copy, but only the proper fix to ksm_might_need_to_copy guarantees not triggering the ksm bug unless ksm is in use. this is an optimization only... Signed-off-by: Andrea Arcangeli <aarcange(a)redhat.com> Signed-off-by: Rik van Riel <riel(a)redhat.com> diff --git a/mm/rmap.c b/mm/rmap.c index 006f223..2d9504d 100644 --- a/mm/rmap.c +++ b/mm/rmap.c @@ -776,15 +776,13 @@ static void __page_set_anon_rmap(struct page *page, * If the page isn't exclusively mapped into this vma, * we must use the _oldest_ possible anon_vma for the * page mapping! - * - * So take the last AVC chain entry in the vma, which is - * the deepest ancestor, and use the anon_vma from that. */ if (!exclusive) { - struct anon_vma_chain *avc; - avc = list_entry(vma->anon_vma_chain.prev, struct anon_vma_chain, same_vma); - anon_vma = avc->anon_vma; - } + if (PageAnon(page)) + return; + anon_vma = anon_vma->root; + } else + BUG_ON(PageAnon(page)); anon_vma = (void *) anon_vma + PAGE_MAPPING_ANON; page->mapping = (struct address_space *) anon_vma; -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/ |