Messages in this thread | | | Date | Thu, 5 Nov 2009 10:15:36 -0500 (EST) | From | Christoph Lameter <> | Subject | Re: [RFC][PATCH] lib: generic percpu counter array |
| |
On Thu, 5 Nov 2009, KAMEZAWA Hiroyuki wrote:
> +static inline void > +counter_array_add(struct counter_array *ca, int idx, int val) > +{ > + ca->counters[idx] += val; > +}
This is not a per cpu operation and therefore expensive. The new percpu this_cpu_inc f.e. generates a single x86 instruction for an increment.
> +void __counter_array_add(struct counter_array *ca, int idx, int val, int batch) > +{ > + long count, *pcount; > + > + preempt_disable(); > + > + pcount = this_cpu_ptr(ca->v.array); > + count = pcount[idx] + val; > + if (!ca->v.nosync && ((count > batch) || (count < -batch))) { > + atomic_long_add(count, &ca->counters[idx]); > + pcount[idx] = 0; > + } else > + pcount[idx] = count; > + preempt_enable(); > +}
Too expensive to use in critical VM paths. The percpu operations generate a single instruction instead of the code above. No need for preempt etc.
| |