diff options
author | Paul Mackerras <paulus@samba.org> | 2006-03-09 14:32:05 +1100 |
---|---|---|
committer | Paul Mackerras <paulus@samba.org> | 2006-03-09 14:32:05 +1100 |
commit | 516450179454de9e689e0a53ed8f34b896e8651c (patch) | |
tree | 78eae2f77de6cd39b18c7393fc5854456fc3fb1f /mm/swap.c | |
parent | 6749c5507388f3fc3719f57a54b540ee83f6661a (diff) | |
parent | 0d514f040ac6629311974889d5b96bcf21c6461a (diff) |
Merge ../linux-2.6
Diffstat (limited to 'mm/swap.c')
-rw-r--r-- | mm/swap.c | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/mm/swap.c b/mm/swap.c index cce3dda59c59..e9ec06d845e8 100644 --- a/mm/swap.c +++ b/mm/swap.c @@ -489,13 +489,34 @@ void percpu_counter_mod(struct percpu_counter *fbc, long amount) if (count >= FBC_BATCH || count <= -FBC_BATCH) { spin_lock(&fbc->lock); fbc->count += count; + *pcount = 0; spin_unlock(&fbc->lock); - count = 0; + } else { + *pcount = count; } - *pcount = count; put_cpu(); } EXPORT_SYMBOL(percpu_counter_mod); + +/* + * Add up all the per-cpu counts, return the result. This is a more accurate + * but much slower version of percpu_counter_read_positive() + */ +long percpu_counter_sum(struct percpu_counter *fbc) +{ + long ret; + int cpu; + + spin_lock(&fbc->lock); + ret = fbc->count; + for_each_cpu(cpu) { + long *pcount = per_cpu_ptr(fbc->counters, cpu); + ret += *pcount; + } + spin_unlock(&fbc->lock); + return ret < 0 ? 0 : ret; +} +EXPORT_SYMBOL(percpu_counter_sum); #endif /* |