41 lines
1.2 KiB
Diff
41 lines
1.2 KiB
Diff
From: Miklos Szeredi <mszeredi@suse.cz>
|
|
Subject: [PATCH 30/31] Fix use of uninitialized variable in cache_grow()
|
|
Patch-mainline: not yet
|
|
|
|
This fixes a bug in reserve-slub.patch.
|
|
|
|
If cache_grow() was called with objp != NULL then the 'reserve' local
|
|
variable wasn't initialized. This resulted in ac->reserve being set to
|
|
a rubbish value. Due to this in some circumstances huge amounts of
|
|
slab pages were allocated (due to slab_force_alloc() returning true),
|
|
which caused atomic page allocation failures and slowdown of the
|
|
system.
|
|
|
|
Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>
|
|
Signed-off-by: Suresh Jayaraman <sjayaraman@suse.de>
|
|
---
|
|
mm/slab.c | 5 +++--
|
|
1 file changed, 3 insertions(+), 2 deletions(-)
|
|
|
|
--- a/mm/slab.c
|
|
+++ b/mm/slab.c
|
|
@@ -2841,7 +2841,7 @@ static int cache_grow(struct kmem_cache
|
|
size_t offset;
|
|
gfp_t local_flags;
|
|
struct kmem_list3 *l3;
|
|
- int reserve;
|
|
+ int reserve = -1;
|
|
|
|
/*
|
|
* Be lazy and only check for valid flags here, keeping it out of the
|
|
@@ -2897,7 +2897,8 @@ static int cache_grow(struct kmem_cache
|
|
if (local_flags & __GFP_WAIT)
|
|
local_irq_disable();
|
|
check_irq_off();
|
|
- slab_set_reserve(cachep, reserve);
|
|
+ if (reserve != -1)
|
|
+ slab_set_reserve(cachep, reserve);
|
|
spin_lock(&l3->list_lock);
|
|
|
|
/* Make slab active. */
|