--- mm/reserve.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) Index: linux-2.6/mm/reserve.c =================================================================== --- linux-2.6.orig/mm/reserve.c +++ linux-2.6/mm/reserve.c @@ -164,6 +164,8 @@ int __mem_reserve_charge(struct mem_rese res->usage = 0; ret = 1; } + if (charge < 0) + wake_up_all(&res->waitqueue); spin_unlock_irqrestore(&res->lock, flags); return ret; @@ -468,7 +470,6 @@ void *___kmalloc_reserve(size_t size, gf obj = __kmalloc_node_track_caller(size, gfp, node, ip); if (obj) { mem_reserve_kmalloc_charge(res, -size); - wake_up_all(&res->waitqueue); goto out; } } @@ -493,7 +494,6 @@ void __kfree_reserve(void *obj, struct m * should all work nicely. */ mem_reserve_kmalloc_charge(res, -size); - wake_up_all(&res->waitqueue); } @@ -519,7 +519,6 @@ void *__kmem_cache_alloc_reserve(struct obj = kmem_cache_alloc_node(s, gfp, node); if (obj) { mem_reserve_kmem_cache_charge(res, s, -1); - wake_up_all(&res->waitqueue); goto out; } } @@ -538,7 +537,6 @@ void __kmem_cache_free_reserve(struct km { kmem_cache_free(s, obj); mem_reserve_kmem_cache_charge(res, s, -1); - wake_up_all(&res->waitqueue); } @@ -564,7 +562,6 @@ struct page *__alloc_pages_reserve(int n page = alloc_pages_node(node, gfp, order); if (page) { mem_reserve_pages_charge(res, -(1 << order)); - wake_up_all(&res->waitqueue); goto out; } } @@ -583,5 +580,4 @@ void __free_pages_reserve(struct page *p { __free_pages(page, order); mem_reserve_pages_charge(res, -(1 << order)); - wake_up_all(&res->waitqueue); }