2009-11-24 11:10:51

by Tim Blechmann

[permalink] [raw]
Subject: [PATCH 3/5] slab.c: remove branch hint

branch profiling on my nehalem machine showed 99% incorrect branch hints:

28459 7678524 99 __cache_alloc_node slab.c
3551

Signed-off-by: Tim Blechmann <[email protected]>
---
mm/slab.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/mm/slab.c b/mm/slab.c
index f70b326..4125fcd 100644
--- a/mm/slab.c
+++ b/mm/slab.c
@@ -3548,7 +3548,7 @@ __cache_alloc_node(struct kmem_cache *cachep,
gfp_t flags, int nodeid,
slab_irq_save(save_flags, this_cpu);
this_node = cpu_to_node(this_cpu);
- if (unlikely(nodeid == -1))
+ if (nodeid == -1)
nodeid = this_node;
if (unlikely(!cachep->nodelists[nodeid])) {
--
1.6.4.2



Attachments:
signature.asc (197.00 B)
OpenPGP digital signature

2009-11-24 11:22:08

by Ingo Molnar

[permalink] [raw]
Subject: Re: [PATCH 3/5] slab.c: remove branch hint


(Pekka Cc:-ed)

* Tim Blechmann <[email protected]> wrote:

> branch profiling on my nehalem machine showed 99% incorrect branch hints:
>
> 28459 7678524 99 __cache_alloc_node slab.c
> 3551
>
> Signed-off-by: Tim Blechmann <[email protected]>
> ---
> mm/slab.c | 2 +-
> 1 files changed, 1 insertions(+), 1 deletions(-)
>
> diff --git a/mm/slab.c b/mm/slab.c
> index f70b326..4125fcd 100644
> --- a/mm/slab.c
> +++ b/mm/slab.c
> @@ -3548,7 +3548,7 @@ __cache_alloc_node(struct kmem_cache *cachep,
> gfp_t flags, int nodeid,
> slab_irq_save(save_flags, this_cpu);
> this_node = cpu_to_node(this_cpu);
> - if (unlikely(nodeid == -1))
> + if (nodeid == -1)
> nodeid = this_node;
> if (unlikely(!cachep->nodelists[nodeid])) {
> --
> 1.6.4.2
>
>

2009-11-24 11:28:49

by Pekka Enberg

[permalink] [raw]
Subject: Re: [PATCH 3/5] slab.c: remove branch hint

On Tue, Nov 24, 2009 at 1:20 PM, Ingo Molnar <[email protected]> wrote:
> (Pekka Cc:-ed)
>
> * Tim Blechmann <[email protected]> wrote:
>
>> branch profiling on my nehalem machine showed 99% incorrect branch hints:
>>
>> ? ?28459 ?7678524 ?99 __cache_alloc_node ? ? ? ? ? ? slab.c
>> ? 3551
>>
>> Signed-off-by: Tim Blechmann <[email protected]>
>> ---
>> ?mm/slab.c | ? ?2 +-
>> ?1 files changed, 1 insertions(+), 1 deletions(-)
>>
>> diff --git a/mm/slab.c b/mm/slab.c
>> index f70b326..4125fcd 100644
>> --- a/mm/slab.c
>> +++ b/mm/slab.c
>> @@ -3548,7 +3548,7 @@ __cache_alloc_node(struct kmem_cache *cachep,
>> gfp_t flags, int nodeid,
>> ? ? ? slab_irq_save(save_flags, this_cpu);
>> ? ? ? this_node = cpu_to_node(this_cpu);
>> - ? ? if (unlikely(nodeid == -1))
>> + ? ? if (nodeid == -1)
>> ? ? ? ? ? ? ? nodeid = this_node;
>> ? ? ? if (unlikely(!cachep->nodelists[nodeid])) {

That sounds odd to me. Can you see where the incorrectly predicted
calls are coming from? Calling kmem_cache_alloc_node() with node set
to -1 most of the time could be a real bug somewhere.

2009-11-24 11:42:19

by Ingo Molnar

[permalink] [raw]
Subject: Re: [PATCH 3/5] slab.c: remove branch hint


* Pekka Enberg <[email protected]> wrote:

> On Tue, Nov 24, 2009 at 1:20 PM, Ingo Molnar <[email protected]> wrote:
> > (Pekka Cc:-ed)
> >
> > * Tim Blechmann <[email protected]> wrote:
> >
> >> branch profiling on my nehalem machine showed 99% incorrect branch hints:
> >>
> >> ? ?28459 ?7678524 ?99 __cache_alloc_node ? ? ? ? ? ? slab.c
> >> ? 3551
> >>
> >> Signed-off-by: Tim Blechmann <[email protected]>
> >> ---
> >> ?mm/slab.c | ? ?2 +-
> >> ?1 files changed, 1 insertions(+), 1 deletions(-)
> >>
> >> diff --git a/mm/slab.c b/mm/slab.c
> >> index f70b326..4125fcd 100644
> >> --- a/mm/slab.c
> >> +++ b/mm/slab.c
> >> @@ -3548,7 +3548,7 @@ __cache_alloc_node(struct kmem_cache *cachep,
> >> gfp_t flags, int nodeid,
> >> ? ? ? slab_irq_save(save_flags, this_cpu);
> >> ? ? ? this_node = cpu_to_node(this_cpu);
> >> - ? ? if (unlikely(nodeid == -1))
> >> + ? ? if (nodeid == -1)
> >> ? ? ? ? ? ? ? nodeid = this_node;
> >> ? ? ? if (unlikely(!cachep->nodelists[nodeid])) {
>
> That sounds odd to me. Can you see where the incorrectly predicted
> calls are coming from? Calling kmem_cache_alloc_node() with node set
> to -1 most of the time could be a real bug somewhere.

I think it could occur in too limited tests - the branch prediction
looks 'wrong' in certain tests - while it's OK in general.

Is there some easy to run workload you consider more or less
representative of typical SLAB patterns?

<plug> You might want to pull even with the scheduler subsystem and in
addition to 'perf bench sched', add a 'perf bench slab' set of
interesting testcases for SLAB performance testing. :-)
</plug>

Ingo

2009-11-24 11:45:32

by Tim Blechmann

[permalink] [raw]
Subject: Re: [PATCH 3/5] slab.c: remove branch hint

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On 11/24/2009 12:28 PM, Pekka Enberg wrote:
> On Tue, Nov 24, 2009 at 1:20 PM, Ingo Molnar <[email protected]> wrote:
>> (Pekka Cc:-ed)
>>
>> * Tim Blechmann <[email protected]> wrote:
>>
>>> branch profiling on my nehalem machine showed 99% incorrect branch hints:
>>>
>>> 28459 7678524 99 __cache_alloc_node slab.c
>>> 3551
>>>
>>> Signed-off-by: Tim Blechmann <[email protected]>
>>> ---
>>> mm/slab.c | 2 +-
>>> 1 files changed, 1 insertions(+), 1 deletions(-)
>>>
>>> diff --git a/mm/slab.c b/mm/slab.c
>>> index f70b326..4125fcd 100644
>>> --- a/mm/slab.c
>>> +++ b/mm/slab.c
>>> @@ -3548,7 +3548,7 @@ __cache_alloc_node(struct kmem_cache *cachep,
>>> gfp_t flags, int nodeid,
>>> slab_irq_save(save_flags, this_cpu);
>>> this_node = cpu_to_node(this_cpu);
>>> - if (unlikely(nodeid == -1))
>>> + if (nodeid == -1)
>>> nodeid = this_node;
>>> if (unlikely(!cachep->nodelists[nodeid])) {
>
> That sounds odd to me. Can you see where the incorrectly predicted
> calls are coming from? Calling kmem_cache_alloc_node() with node set
> to -1 most of the time could be a real bug somewhere.

i don't know, if there is any facility in the ftrace branch profiler to
get call graph information, but i can try to manually dump backtraces in
this condition path ...
could be a specific situation on my machine, though ...

tim

- --
[email protected]
http://tim.klingt.org

You don't have to call it music if the term shocks you.
John Cage
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)

iEYEARECAAYFAksLx0kACgkQdL+4qsZfVsskOQCglFQG3eYAfdgXoOAHAGTqaLcU
8e0AoIQNbzSRxttGFaXTF3PEh5O4aGEB
=3nmT
-----END PGP SIGNATURE-----

2009-11-25 10:41:54

by Pekka Enberg

[permalink] [raw]
Subject: Re: [PATCH 3/5] slab.c: remove branch hint

Ingo Molnar kirjoitti:
>> That sounds odd to me. Can you see where the incorrectly predicted
>> calls are coming from? Calling kmem_cache_alloc_node() with node set
>> to -1 most of the time could be a real bug somewhere.
>
> I think it could occur in too limited tests - the branch prediction
> looks 'wrong' in certain tests - while it's OK in general.
>
> Is there some easy to run workload you consider more or less
> representative of typical SLAB patterns?

I can think of three main classes: VFS, SCSI, or network intensive
applications and benchmarks tend to bring out the worst in SLAB. There
are probably some interesting NUMA related things that I'm not really
aware of.

2009-11-29 11:37:17

by Tim Blechmann

[permalink] [raw]
Subject: Re: [PATCH 3/5] slab.c: remove branch hint

On 11/24/2009 12:28 PM, Pekka Enberg wrote:
> On Tue, Nov 24, 2009 at 1:20 PM, Ingo Molnar <[email protected]> wrote:
>> (Pekka Cc:-ed)
>>
>> * Tim Blechmann <[email protected]> wrote:
>>
>>> branch profiling on my nehalem machine showed 99% incorrect branch hints:
>>>
>>> 28459 7678524 99 __cache_alloc_node slab.c
>>> 3551
>>>
>>> Signed-off-by: Tim Blechmann <[email protected]>
>>> ---
>>> mm/slab.c | 2 +-
>>> 1 files changed, 1 insertions(+), 1 deletions(-)
>>>
>>> diff --git a/mm/slab.c b/mm/slab.c
>>> index f70b326..4125fcd 100644
>>> --- a/mm/slab.c
>>> +++ b/mm/slab.c
>>> @@ -3548,7 +3548,7 @@ __cache_alloc_node(struct kmem_cache *cachep,
>>> gfp_t flags, int nodeid,
>>> slab_irq_save(save_flags, this_cpu);
>>> this_node = cpu_to_node(this_cpu);
>>> - if (unlikely(nodeid == -1))
>>> + if (nodeid == -1)
>>> nodeid = this_node;
>>> if (unlikely(!cachep->nodelists[nodeid])) {
>
> That sounds odd to me. Can you see where the incorrectly predicted
> calls are coming from? Calling kmem_cache_alloc_node() with node set
> to -1 most of the time could be a real bug somewhere.

when dumping the stack for the incorrectly hinted branches, i get the
attached stack traces...

hth, tim

--- a/mm/slab.c
+++ b/mm/slab.c
@@ -3548,8 +3548,10 @@ __cache_alloc_node(struct kmem_cache *cachep,
gfp_t flags, int nodeid,
slab_irq_save(save_flags, this_cpu);

this_node = cpu_to_node(this_cpu);
- if (nodeid == -1)
+ if (nodeid == -1) {
+ dump_stack();
nodeid = this_node;
+ }

if (unlikely(!cachep->nodelists[nodeid])) {
/* Node not bootstrapped yet */



--
[email protected]
http://tim.klingt.org

It is better to make a piece of music than to perform one, better to
perform one than to listen to one, better to listen to one than to
misuse it as a means of distraction, entertainment, or acquisition of
'culture'.
John Cage


Attachments:
traces.bz2 (6.48 kB)
signature.asc (197.00 B)
OpenPGP digital signature
Download all attachments

2009-11-30 09:05:03

by Pekka Enberg

[permalink] [raw]
Subject: Re: [PATCH 3/5] slab.c: remove branch hint

Tim Blechmann kirjoitti:
> On 11/24/2009 12:28 PM, Pekka Enberg wrote:
>> On Tue, Nov 24, 2009 at 1:20 PM, Ingo Molnar <[email protected]> wrote:
>>> (Pekka Cc:-ed)
>>>
>>> * Tim Blechmann <[email protected]> wrote:
>>>
>>>> branch profiling on my nehalem machine showed 99% incorrect branch hints:
>>>>
>>>> 28459 7678524 99 __cache_alloc_node slab.c
>>>> 3551
>>>>
>>>> Signed-off-by: Tim Blechmann <[email protected]>
>>>> ---
>>>> mm/slab.c | 2 +-
>>>> 1 files changed, 1 insertions(+), 1 deletions(-)
>>>>
>>>> diff --git a/mm/slab.c b/mm/slab.c
>>>> index f70b326..4125fcd 100644
>>>> --- a/mm/slab.c
>>>> +++ b/mm/slab.c
>>>> @@ -3548,7 +3548,7 @@ __cache_alloc_node(struct kmem_cache *cachep,
>>>> gfp_t flags, int nodeid,
>>>> slab_irq_save(save_flags, this_cpu);
>>>> this_node = cpu_to_node(this_cpu);
>>>> - if (unlikely(nodeid == -1))
>>>> + if (nodeid == -1)
>>>> nodeid = this_node;
>>>> if (unlikely(!cachep->nodelists[nodeid])) {
>> That sounds odd to me. Can you see where the incorrectly predicted
>> calls are coming from? Calling kmem_cache_alloc_node() with node set
>> to -1 most of the time could be a real bug somewhere.
>
> when dumping the stack for the incorrectly hinted branches, i get the
> attached stack traces...
>
> hth, tim
>
> --- a/mm/slab.c
> +++ b/mm/slab.c
> @@ -3548,8 +3548,10 @@ __cache_alloc_node(struct kmem_cache *cachep,
> gfp_t flags, int nodeid,
> slab_irq_save(save_flags, this_cpu);
>
> this_node = cpu_to_node(this_cpu);
> - if (nodeid == -1)
> + if (nodeid == -1) {
> + dump_stack();
> nodeid = this_node;
> + }
>
> if (unlikely(!cachep->nodelists[nodeid])) {
> /* Node not bootstrapped yet */
>
>
>

OK, so it's the generic alloc_skb() function that keeps hitting
kmem_cache_alloc_node() with "-1". Christoph, are you okay with removing
the unlikely() annotation from __cache_alloc_node()?

Pekka

2009-11-30 16:10:06

by Christoph Lameter

[permalink] [raw]
Subject: Re: [PATCH 3/5] slab.c: remove branch hint

On Mon, 30 Nov 2009, Pekka Enberg wrote:

> OK, so it's the generic alloc_skb() function that keeps hitting
> kmem_cache_alloc_node() with "-1". Christoph, are you okay with removing the
> unlikely() annotation from __cache_alloc_node()?

Yes. Lets look for other cases in the allocators too.
kmem_cache_alloc_node used to be mainly used for off node allocations but
the network alloc_skb() case shows that this is changing now.

I hope the users of kmem_cache_alloc_node() realize that using -1 is not
equivalent to kmem_cache_alloc(). kmem_cache_alloc follows numa policies
for memory allocations. kmem_cache_alloc_node() does not.





2009-11-30 17:44:27

by Pekka Enberg

[permalink] [raw]
Subject: Re: [PATCH 3/5] slab.c: remove branch hint

On Mon, Nov 30, 2009 at 6:09 PM, Christoph Lameter
<[email protected]> wrote:
> On Mon, 30 Nov 2009, Pekka Enberg wrote:
>
>> OK, so it's the generic alloc_skb() function that keeps hitting
>> kmem_cache_alloc_node() with "-1". Christoph, are you okay with removing the
>> unlikely() annotation from __cache_alloc_node()?
>
> Yes. Lets look for other cases in the allocators too.
> kmem_cache_alloc_node used to be mainly used for off node allocations but
> the network alloc_skb() case shows that this is changing now.

Tim, can you please re-send the patch to me so I can apply it?

2009-11-30 17:50:33

by Christoph Lameter

[permalink] [raw]
Subject: Re: [PATCH 3/5] slab.c: remove branch hint

On Mon, 30 Nov 2009, Pekka Enberg wrote:

> Tim, can you please re-send the patch to me so I can apply it?

SLUB has no issue since NUMA decisions are deferred to the page allocator.

2009-11-30 17:59:43

by Tim Blechmann

[permalink] [raw]
Subject: [PATCH] branch profiling on my nehalem machine showed 99% incorrect branch hints:

i have regenerated the patch for tip/tip ...

--
28459 7678524 99 __cache_alloc_node slab.c 3551

Discussion on lkml [1] led to the solution to remove this hint.

[1] http://patchwork.kernel.org/patch/63517/

Signed-off-by: Tim Blechmann <[email protected]>
---
mm/slab.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)



Attachments:
0001-branch-profiling-on-my-nehalem-machine-showed-99-inc.patch (397.00 B)
signature.asc (197.00 B)
OpenPGP digital signature
Download all attachments

2009-12-06 08:33:55

by Pekka Enberg

[permalink] [raw]
Subject: Re: [PATCH] branch profiling on my nehalem machine showed 99% incorrect branch hints:

Tim Blechmann wrote:
> i have regenerated the patch for tip/tip ...
>
> --
> 28459 7678524 99 __cache_alloc_node slab.c 3551
>
> Discussion on lkml [1] led to the solution to remove this hint.
>
> [1] http://patchwork.kernel.org/patch/63517/
>
> Signed-off-by: Tim Blechmann <[email protected]>
> ---
> mm/slab.c | 2 +-
> 1 files changed, 1 insertions(+), 1 deletions(-)

Applied, thanks.

Please use plain text email for sending patches in the future.