[PATCH] Undo mempolicy shared policy rbtree microoptimization
All mempolicy changes must be inside the spinlock and readding the rb_erase prevents a crash while doing: > echo "1" > /tmp/numatest > numactl --length=0x4000 --shm /tmp/numatest --localalloc > numactl --length=0x2000 --offset=0 --shm /tmp/numatest --membind=0 > numactl --length=0x2000 --offset=0x2000 --shm /tmp/numatest --membind=1 > ipcs > ipcrm -M "the_key_value_of_this_shm_area" Based on a patch by John Blackwood Cc: <john.blackwood@ccur.com> Cc: <andrea@suse.de> Signed-off-by: Andi Kleen <ak@suse.de> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
c223695634
commit
90c5029e47
|
@ -1138,11 +1138,11 @@ void mpol_free_shared_policy(struct shared_policy *p)
|
||||||
while (next) {
|
while (next) {
|
||||||
n = rb_entry(next, struct sp_node, nd);
|
n = rb_entry(next, struct sp_node, nd);
|
||||||
next = rb_next(&n->nd);
|
next = rb_next(&n->nd);
|
||||||
|
rb_erase(&n->nd, &p->root);
|
||||||
mpol_free(n->policy);
|
mpol_free(n->policy);
|
||||||
kmem_cache_free(sn_cache, n);
|
kmem_cache_free(sn_cache, n);
|
||||||
}
|
}
|
||||||
spin_unlock(&p->lock);
|
spin_unlock(&p->lock);
|
||||||
p->root = RB_ROOT;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* assumes fs == KERNEL_DS */
|
/* assumes fs == KERNEL_DS */
|
||||||
|
|
Loading…
Reference in New Issue