From: Alex Elder <aelder@sgi.com>
To: xfs@oss.sgi.com
Subject: [PATCH 5/5] percpu_counter: only disable preemption if needed in add_unless_lt()
Date: Wed, 22 Dec 2010 21:56:42 -0600 [thread overview]
Message-ID: <1293076602.2408.434.camel@doink> (raw)
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@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);
_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs
next reply other threads:[~2010-12-23 3:56 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-12-23 3:56 Alex Elder [this message]
2010-12-23 6:31 ` [PATCH 5/5] percpu_counter: only disable preemption if needed in add_unless_lt() Dave Chinner
2010-12-29 16:29 ` Alex Elder
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1293076602.2408.434.camel@doink \
--to=aelder@sgi.com \
--cc=xfs@oss.sgi.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox