Hello, Christoph. > void __percpu_counter_add(struct percpu_counter *fbc, s64 amount, s32 batch) > { > - s64 count; > + s64 count, new, overflow; > > - preempt_disable(); > - count = __this_cpu_read(*fbc->counters) + amount; > - if (count >= batch || count <= -batch) { > + do { > + overflow = 0; > + count = this_cpu_read(*fbc->counters); > + > + new = count + amount; > + /* In case of overflow fold it into the global counter instead */ > + if (new >= batch || new <= -batch) { > + overflow = new; > + new = 0; > + } > +#ifdef CONFIG_PREEMPT > + } while (this_cpu_cmpxchg(*fbc->counters, count, new) != count); > +#else > + } while (0); > + this_cpu_write(*fbc->counters, new); > +#endif Eeeek, no. If you want to do the above, please put it in a separate inline function with sufficient comment. > + if (unlikely(overflow)) { > spin_lock(&fbc->lock); > - fbc->count += count; > - __this_cpu_write(*fbc->counters, 0); > + fbc->count += overflow; > spin_unlock(&fbc->lock); Why put this outside and use yet another branch? Thanks. -- tejun -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxxx For more info on Linux MM, see: http://www.linux-mm.org/ . Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/ Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>