Re: [PATCH 2/8] Basic zcache functionality

Nitin Gupta
2010-07-18T09:50:59Z

On 07/18/2010 02:14 PM, Eric Dumazet wrote:
> Le vendredi 16 juillet 2010 A 18:07 +0530, Nitin Gupta a A(C)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