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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.