Commit 30acbaba authored by Hugh Dickins's avatar Hugh Dickins Committed by Linus Torvalds

mm: kill validate_anon_vma to avoid mapcount BUG

validate_anon_vma gave a useful check on the integrity of the anon_vma list
when Andrea was developing obj rmap; but it was not enabled in SLES9
itself, nor in mainline, until Nick changed commented-out RMAP_DEBUG to
configurable CONFIG_DEBUG_VM in 2.6.17.  Now Petr Vandrovec reports that
its BUG_ON(mapcount > 100000) can easily crash a CONFIG_DEBUG_VM=y system.

That limit was just an arbitrary number to protect against an infinite
loop.  We could raise it to something enormous (depending on sizeof struct
vma and size of memory?); but I rather think validate_anon_vma has outlived
its usefulness, and is better just removed - which gives a magnificent
performance boost to anything like Petr's test program ;)

Of course, a very long anon_vma list is bad news for preemption latency,
and I believe there has been one recent report of such: let's not forget
that, but validate_anon_vma only makes it worse not better.
Signed-off-by: default avatarHugh Dickins <hugh@veritas.com>
Cc: Petr Vandrovec <petr@vmware.com>
Acked-by: default avatarNick Piggin <npiggin@suse.de>
Cc: Andrea Arcangeli <andrea@suse.de>
Cc: <stable@kernel.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 172d0496
...@@ -53,24 +53,6 @@ ...@@ -53,24 +53,6 @@
struct kmem_cache *anon_vma_cachep; struct kmem_cache *anon_vma_cachep;
static inline void validate_anon_vma(struct vm_area_struct *find_vma)
{
#ifdef CONFIG_DEBUG_VM
struct anon_vma *anon_vma = find_vma->anon_vma;
struct vm_area_struct *vma;
unsigned int mapcount = 0;
int found = 0;
list_for_each_entry(vma, &anon_vma->head, anon_vma_node) {
mapcount++;
BUG_ON(mapcount > 100000);
if (vma == find_vma)
found = 1;
}
BUG_ON(!found);
#endif
}
/* This must be called under the mmap_sem. */ /* This must be called under the mmap_sem. */
int anon_vma_prepare(struct vm_area_struct *vma) int anon_vma_prepare(struct vm_area_struct *vma)
{ {
...@@ -121,10 +103,8 @@ void __anon_vma_link(struct vm_area_struct *vma) ...@@ -121,10 +103,8 @@ void __anon_vma_link(struct vm_area_struct *vma)
{ {
struct anon_vma *anon_vma = vma->anon_vma; struct anon_vma *anon_vma = vma->anon_vma;
if (anon_vma) { if (anon_vma)
list_add_tail(&vma->anon_vma_node, &anon_vma->head); list_add_tail(&vma->anon_vma_node, &anon_vma->head);
validate_anon_vma(vma);
}
} }
void anon_vma_link(struct vm_area_struct *vma) void anon_vma_link(struct vm_area_struct *vma)
...@@ -134,7 +114,6 @@ void anon_vma_link(struct vm_area_struct *vma) ...@@ -134,7 +114,6 @@ void anon_vma_link(struct vm_area_struct *vma)
if (anon_vma) { if (anon_vma) {
spin_lock(&anon_vma->lock); spin_lock(&anon_vma->lock);
list_add_tail(&vma->anon_vma_node, &anon_vma->head); list_add_tail(&vma->anon_vma_node, &anon_vma->head);
validate_anon_vma(vma);
spin_unlock(&anon_vma->lock); spin_unlock(&anon_vma->lock);
} }
} }
...@@ -148,7 +127,6 @@ void anon_vma_unlink(struct vm_area_struct *vma) ...@@ -148,7 +127,6 @@ void anon_vma_unlink(struct vm_area_struct *vma)
return; return;
spin_lock(&anon_vma->lock); spin_lock(&anon_vma->lock);
validate_anon_vma(vma);
list_del(&vma->anon_vma_node); list_del(&vma->anon_vma_node);
/* We must garbage collect the anon_vma if it's empty */ /* We must garbage collect the anon_vma if it's empty */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment