On 05/06/2010 11:33 AM, Mel Gorman wrote:
@@ -1368,16 +1424,25 @@ static int rmap_walk_anon(struct page *page, int (*rmap_one)(struct page *, * 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 = page_anon_vma_lock_root(page); if (!anon_vma) return ret; - spin_lock(&anon_vma->lock); list_for_each_entry(avc,&anon_vma->head, same_anon_vma) {
One conceptual problem here. By taking the oldest anon_vma, instead of the anon_vma of the page, we may end up searching way too many processes. Eg. if the page is the page of a child process in a forking server workload, the above code will end up searching the parent and all of the siblings - even for a private page, in the child process's private anon_vma. For an Apache or Oracle system with 1000 clients (and child processes), that could be quite a drag - searching 1000 times as many processes as we should. -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxxx For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>