On Sat, 3 Nov 2007, Hugh Dickins wrote: > On Sat, 3 Nov 2007, Olivér Pintér wrote: > > Q: It's needed auch to 2.6.22-stable? > > I guess so: though SLUB wasn't on by default in 2.6.22; and it being > only a slow leak rather than a corruption, I was less inclined to > agitate about it for releases further back. > > But your question makes me realize I never even looked at 2.6.23 or > 2.6.22 hereabouts, just assumed they were the same; let alone patch > or build or test them. The patches reject as such because quite a > lot has changed around (there was no struct kmem_cache_cpu in either). > > A hurried look suggests that the leakage problem was there in both, > but let's wait to hear Christoph's expert opinion.
Okay, here's a version for 2.6.23 and 2.6.22... Christoph, you've now Acked the 2.6.24 one, thanks: do you agree this patch below should go to -stable? Slub has been quite leaky under load. Taking mm_struct as an example, in a loop of swapping kernel builds, after the first iteration slabinfo shows: Name Objects Objsize Space Slabs/Part/Cpu O/S O %Fr %Ef Flg mm_struct 55 840 73.7K 18/7/4 4 0 38 62 A but Objects and Partials steadily creep up - after the 340th iteration: mm_struct 110 840 188.4K 46/36/4 4 0 78 49 A (example taken from 2.6.24-rc1: YMMV). The culprit turns out to be __slab_alloc(), where it copes with the race that another task has assigned the cpu slab while we were allocating one. Don't rush off to load_freelist there: that assumes page->lockless_freelist is empty, and will lose all its free slots when page->freelist is not empty. Instead just do a local allocation from lockless_freelist when it has one. Which fixes the leakage: Objects and Partials then remain stable. Signed-off-by: Hugh Dickins <[EMAIL PROTECTED]> --- Version of patch suitable and recommended for both 2.6.23-stable and 2.6.22-stable. I've not run tests on either to observe the mounting leakage; but a version of the patch below with a printk announcing when non-empty freelist would overwrite non-empty lockless_freelist does indeed show up in both (though notably less frequently than in 2.6.24-rc1 - something else seems to be making it more likely now). But please wait for Christoph's Ack before committing to -stable. mm/slub.c | 6 ++++++ 1 file changed, 6 insertions(+) --- 2.6.23/mm/slub.c 2007-10-09 21:31:38.000000000 +0100 +++ linux/mm/slub.c 2007-11-03 18:23:07.000000000 +0000 @@ -1517,6 +1517,12 @@ new_slab: */ discard_slab(s, page); page = s->cpu_slab[cpu]; + if (page->lockless_freelist) { + object = page->lockless_freelist; + page->lockless_freelist = + object[page->offset]; + return object; + } slab_lock(page); goto load_freelist; }