On 07/18/2010 02:14 PM, Eric Dumazet wrote: > Le vendredi 16 juillet 2010 à 18:07 +0530, Nitin Gupta a écrit : > >> This particular patch implemets basic functionality only: >> +static u64 zcache_get_stat(struct zcache_pool *zpool, >> + enum zcache_pool_stats_index idx) >> +{ >> + int cpu; >> + s64 val = 0; >> + >> + for_each_possible_cpu(cpu) { >> + unsigned int start; >> + struct zcache_pool_stats_cpu *stats; >> + >> + stats = per_cpu_ptr(zpool->stats, cpu); >> + do { >> + start = u64_stats_fetch_begin(&stats->syncp); >> + val += stats->count[idx]; >> + } while (u64_stats_fetch_retry(&stats->syncp, start)); >> + } >> + >> + BUG_ON(val < 0); >> + return val; >> +} > > Sorry this is wrong. > > Inside the fetch/retry block you should not do the addition to val, only > a read of value to a temporary variable, since this might be done > several times. > > You want something like : > > static u64 zcache_get_stat(struct zcache_pool *zpool, > enum zcache_pool_stats_index idx) > { > int cpu; > s64 temp, val = 0; > > for_each_possible_cpu(cpu) { > unsigned int start; > struct zcache_pool_stats_cpu *stats; > > stats = per_cpu_ptr(zpool->stats, cpu); > do { > start = u64_stats_fetch_begin(&stats->syncp); > temp = stats->count[idx]; > } while (u64_stats_fetch_retry(&stats->syncp, start)); > val += temp; > } > > ... > } > > Oh, my bad. Thanks for the fix! On a side note: u64_stats_* should probably be renamed to stats64_* since they are equally applicable for s64. Thanks, Nitin -- 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/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>