[PATCH 5/5] percpu_counter: only disable preemption if needed in add_unless_lt()
Alex Elder
aelder at sgi.com
Wed Dec 22 21:56:42 CST 2010
In __percpu_counter_add_unless_lt() we don't need to disable
preemption unless we're manipulating a per-cpu variable. That only
happens in a limited case, so narrow the scope of that preemption to
surround that case. This makes the "out" label rather unnecessary,
so replace a couple "goto out" calls to just return.
Signed-off-by: Alex Elder <aelder at sgi.com>
---
lib/percpu_counter.c | 21 ++++++++++-----------
1 file changed, 10 insertions(+), 11 deletions(-)
Index: b/lib/percpu_counter.c
===================================================================
--- a/lib/percpu_counter.c
+++ b/lib/percpu_counter.c
@@ -232,8 +232,6 @@ int __percpu_counter_add_unless_lt(struc
int cpu;
int ret = -1;
- preempt_disable();
-
/*
* Check to see if rough count will be sufficient for
* comparison. First, if the upper bound is too low,
@@ -241,7 +239,7 @@ int __percpu_counter_add_unless_lt(struc
*/
count = percpu_counter_read(fbc);
if (count + error + amount < threshold)
- goto out;
+ return -1;
/*
* Next, if the lower bound is above the threshold, we can
@@ -251,12 +249,15 @@ int __percpu_counter_add_unless_lt(struc
if (count - error + amount > threshold) {
s32 *pcount = this_cpu_ptr(fbc->counters);
+ preempt_disable();
+ pcount = this_cpu_ptr(fbc->counters);
count = *pcount + amount;
if (abs(count) < batch) {
*pcount = count;
- ret = 1;
- goto out;
+ preempt_enable();
+ return 1;
}
+ preempt_enable();
}
/*
@@ -281,10 +282,9 @@ int __percpu_counter_add_unless_lt(struc
}
/*
- * Result is withing the error margin. Run an open-coded sum of the
- * per-cpu counters to get the exact value at this point in time,
- * and if the result greater than the threshold, add the amount to
- * the global counter.
+ * Now add in all the per-cpu counters to compute the exact
+ * value at this point in time, and if the result greater
+ * than the threshold, add the amount to the global counter.
*/
count = fbc->count;
for_each_online_cpu(cpu) {
@@ -301,8 +301,7 @@ int __percpu_counter_add_unless_lt(struc
}
out_unlock:
spin_unlock(&fbc->lock);
-out:
- preempt_enable();
+
return ret;
}
EXPORT_SYMBOL(__percpu_counter_add_unless_lt);
More information about the xfs
mailing list