All of lore.kernel.org
 help / color / mirror / Atom feed
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

             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.