Messages in this thread Patch in this message | | | Date | Thu, 7 Oct 2010 14:42:02 -0500 (CDT) | From | Christoph Lameter <> | Subject | Re: [PATCH] percpu_counter: change inaccurate comment |
| |
On Thu, 7 Oct 2010, Eric Dumazet wrote:
> percpu_counter used to be huge objects, they are not anymore, > thanks to fine alloc_percpu() granularity. > > We now consume 4 bytes per possible cpu.
Ahh I did not notice that they switched.... Then we may also want the following patch to improve performance. It would even be better if we could do a this_cpu_add(fbc->counters, amount) there but the 64 bit size fo count looks suspiciously like you are expecting overflows beyond ints max size.
Subject: percpu_counter: Use this_cpu_ptr instead of per_cpu_ptr
this_cpu_ptr avoids an array lookup and can use the percpu offset of the local cpu directly.
Signed-off-by: Christoph Lameter <cl@linux.com>
--- lib/percpu_counter.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
Index: linux-2.6/lib/percpu_counter.c =================================================================== --- linux-2.6.orig/lib/percpu_counter.c 2010-10-07 14:36:39.000000000 -0500 +++ linux-2.6/lib/percpu_counter.c 2010-10-07 14:38:43.000000000 -0500 @@ -30,9 +30,9 @@ void __percpu_counter_add(struct percpu_ { s64 count; s32 *pcount; - int cpu = get_cpu();
- pcount = per_cpu_ptr(fbc->counters, cpu); + preempt_disable(); + pcount = this_cpu_ptr(fbc->counters); count = *pcount + amount; if (count >= batch || count <= -batch) { spin_lock(&fbc->lock); @@ -42,7 +42,7 @@ void __percpu_counter_add(struct percpu_ } else { *pcount = count; } - put_cpu(); + preempt_enable(); } EXPORT_SYMBOL(__percpu_counter_add);
| |