On Sat, 3 Nov 2007, Hugh Dickins wrote: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= =2E 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 <hugh@veritas.com> --- 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=092007-10-09 21:31:38.000000000 +0100 +++ linux/mm/slub.c=092007-11-03 18:23:07.000000000 +0000 @@ -1517,6 +1517,12 @@ new_slab: =09=09=09=09 */ =09=09=09=09discard_slab(s, page); =09=09=09=09page =3D s->cpu_slab[cpu]; +=09=09=09=09if (page->lockless_freelist) { +=09=09=09=09=09object =3D page->lockless_freelist; +=09=09=09=09=09page->lockless_freelist =3D +=09=09=09=09=09=09=09object[page->offset]; +=09=09=09=09=09return object; +=09=09=09=09} =09=09=09=09slab_lock(page); =09=09=09=09goto load_freelist; =09=09=09}
| Greg KH | Re: Dual-Licensing Linux Kernel with GPL V2 and GPL V3 |
| Greg Kroah-Hartman | [PATCH 005/196] Chinese: add translation of SubmittingDrivers |
| Adrian Bunk | [1/6] 2.6.21-rc2: known regressions |
| Paul Jackson | Re: cpuset-remove-sched-domain-hooks-from-cpusets |
git: | |
| Linus Torvalds | Re: [GIT]: Networking |
| Gerrit Renker | [PATCH 27/37] dccp: Integration of dynamic feature activation - part 2 (server side) |
| Jarek Poplawski | [PATCH] pkt_sched: Destroy gen estimators under rtnl_lock(). |
| Andrew Morton | Re: [BUG] New Kernel Bugs |
