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: Hugh Dickins <hugh@veritas.com> Cc: Petr Vandrovec <petr@vmware.com> Acked-by: Nick Piggin <npiggin@suse.de> Cc: Andrea Arcangeli <andrea@suse.de> Cc: <stable@kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Родитель
172d0496cd
Коммит
30acbabae3
24
mm/rmap.c
24
mm/rmap.c
|
@ -53,24 +53,6 @@
|
|||
|
||||
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. */
|
||||
int anon_vma_prepare(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;
|
||||
|
||||
if (anon_vma) {
|
||||
if (anon_vma)
|
||||
list_add_tail(&vma->anon_vma_node, &anon_vma->head);
|
||||
validate_anon_vma(vma);
|
||||
}
|
||||
}
|
||||
|
||||
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) {
|
||||
spin_lock(&anon_vma->lock);
|
||||
list_add_tail(&vma->anon_vma_node, &anon_vma->head);
|
||||
validate_anon_vma(vma);
|
||||
spin_unlock(&anon_vma->lock);
|
||||
}
|
||||
}
|
||||
|
@ -148,7 +127,6 @@ void anon_vma_unlink(struct vm_area_struct *vma)
|
|||
return;
|
||||
|
||||
spin_lock(&anon_vma->lock);
|
||||
validate_anon_vma(vma);
|
||||
list_del(&vma->anon_vma_node);
|
||||
|
||||
/* We must garbage collect the anon_vma if it's empty */
|
||||
|
|
Загрузка…
Ссылка в новой задаче