Hello, On Wed, Apr 13, 2011 at 03:22:36PM -0500, Christoph Lameter wrote: > + do { > + 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) { > + spin_lock(&fbc->lock); > + fbc->count += __this_cpu_read(*fbc->counters) + amount; > + spin_unlock(&fbc->lock); > + amount = 0; > + new = 0; > + } > + > + } while (this_cpu_cmpxchg(*fbc->counters, count, new) != count); Is this correct? If the percpu count changes in the middle, doesn't the count get added twice? Can you please use the cmpxchg() only in the fast path? ie. do { count = this_cpu_read(); if (overflow) { disable preemption and do the slow thing. return; } } while (this_cpu_cmpxchg()); 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>