Re: [PATCH 1/2] slub: fix leakage

!MAILaRCHIVE_VOTE_RePLACE
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
To: Olivér Pintér <oliver.pntr@...>
Cc: Christoph Lameter <clameter@...>, Linus Torvalds <torvalds@...>, Andrew Morton <akpm@...>, Willy Tarreau <w@...>, <linux-kernel@...>, <stable@...>
Date: Saturday, November 3, 2007 - 2:52 pm

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}
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
[PATCH 1/2] slub: fix leakage, Hugh Dickins, (Sat Nov 3, 1:10 pm)
Re: [PATCH 1/2] slub: fix leakage, Christoph Lameter, (Sat Nov 3, 2:48 pm)
Re: [PATCH 1/2] slub: fix leakage, Hugh Dickins, (Sat Nov 3, 3:04 pm)
Re: [PATCH 1/2] slub: fix leakage, Christoph Lameter, (Sat Nov 3, 3:26 pm)
Re: [PATCH 1/2] slub: fix leakage, Hugh Dickins, (Sat Nov 3, 3:35 pm)
Re: [PATCH 1/2] slub: fix leakage, Christoph Lameter, (Sat Nov 3, 2:51 pm)
Re: [PATCH 1/2] slub: fix leakage, Christoph Lameter, (Sat Nov 3, 2:31 pm)
Re: [PATCH 1/2] slub: fix leakage, Willy Tarreau, (Sat Nov 3, 1:38 pm)
Re: [PATCH 1/2] slub: fix leakage, Hugh Dickins, (Sat Nov 3, 1:55 pm)
Re: [PATCH 1/2] slub: fix leakage, Willy Tarreau, (Sat Nov 3, 1:59 pm)
Re: [PATCH 1/2] slub: fix leakage, Olivér Pintér, (Sat Nov 3, 1:27 pm)
Re: [PATCH 1/2] slub: fix leakage, Hugh Dickins, (Sat Nov 3, 1:50 pm)
Re: [PATCH 1/2] slub: fix leakage, Hugh Dickins, (Sat Nov 3, 2:52 pm)
Re: [PATCH 1/2] slub: fix leakage, Hugh Dickins, (Sat Nov 3, 3:39 pm)
Re: [PATCH 1/2] slub: fix leakage, Christoph Lameter, (Sat Nov 3, 3:47 pm)
Re: [PATCH 1/2] slub: fix leakage, Hugh Dickins, (Sat Nov 3, 3:52 pm)
Re: [PATCH 1/2] slub: fix leakage, Christoph Lameter, (Sat Nov 3, 3:54 pm)
Re: [PATCH 1/2] slub: fix leakage, Hugh Dickins, (Sat Nov 3, 4:10 pm)
Re: [PATCH 1/2] slub: fix leakage, Christoph Lameter, (Sat Nov 3, 4:26 pm)
Re: [PATCH 1/2] slub: fix leakage, Hugh Dickins, (Sun Nov 4, 7:18 am)
Re: [PATCH 1/2] slub: fix leakage, Christoph Lameter, (Mon Nov 5, 2:45 pm)
Re: [PATCH 1/2] slub: fix leakage, Jeff Chua, (Tue Nov 6, 2:15 am)
Re: [PATCH 1/2] slub: fix leakage, Hugh Dickins, (Tue Nov 6, 3:58 am)
Re: [PATCH 1/2] slub: fix leakage, Hugh Dickins, (Mon Nov 5, 3:09 pm)
Re: [PATCH 1/2] slub: fix leakage, Christoph Lameter, (Mon Nov 5, 3:15 pm)
Re: [PATCH 1/2] slub: fix leakage, Linus Torvalds, (Mon Nov 5, 3:26 pm)
Re: [PATCH 1/2] slub: fix leakage, Christoph Lameter, (Mon Nov 5, 3:31 pm)
Re: [PATCH 1/2] slub: fix leakage, Linus Torvalds, (Mon Nov 5, 3:36 pm)
Re: [PATCH 1/2] slub: fix leakage, Christoph Lameter, (Mon Nov 5, 3:23 pm)
[PATCH 2/2] slub: fix Objects count, Hugh Dickins, (Sat Nov 3, 1:11 pm)
Re: [PATCH 2/2] slub: fix Objects count, Christoph Lameter, (Sat Nov 3, 2:26 pm)
Re: [PATCH 2/2] slub: fix Objects count, Hugh Dickins, (Sat Nov 3, 3:09 pm)
Re: [PATCH 2/2] slub: fix Objects count, Christoph Lameter, (Sat Nov 3, 3:33 pm)
Re: [PATCH 2/2] slub: fix Objects count, Hugh Dickins, (Sat Nov 3, 4:03 pm)