linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
* percpu: preemptless __per_cpu_counter_add
@ 2011-04-13 14:45 Christoph Lameter
  2011-04-13 16:49 ` Christoph Lameter
  0 siblings, 1 reply; 64+ messages in thread
From: Christoph Lameter @ 2011-04-13 14:45 UTC (permalink / raw)
  To: Tejun Heo; +Cc: akpm, linux-mm, eric.dumazet

Use this_cpu_cmpxchg to avoid preempt_disable/enable in
__percpu_counter_add.

Signed-off-by: Christoph Lameter <cl@linux.com>

---
 lib/percpu_counter.c |   27 +++++++++++++++------------
 1 file changed, 15 insertions(+), 12 deletions(-)

Index: linux-2.6/lib/percpu_counter.c
===================================================================
--- linux-2.6.orig/lib/percpu_counter.c	2011-04-13 09:26:19.000000000 -0500
+++ linux-2.6/lib/percpu_counter.c	2011-04-13 09:36:37.000000000 -0500
@@ -71,19 +71,22 @@ EXPORT_SYMBOL(percpu_counter_set);

 void __percpu_counter_add(struct percpu_counter *fbc, s64 amount, s32 batch)
 {
-	s64 count;
+	s64 count, new;

-	preempt_disable();
-	count = __this_cpu_read(*fbc->counters) + amount;
-	if (count >= batch || count <= -batch) {
-		spin_lock(&fbc->lock);
-		fbc->count += count;
-		__this_cpu_write(*fbc->counters, 0);
-		spin_unlock(&fbc->lock);
-	} else {
-		__this_cpu_write(*fbc->counters, count);
-	}
-	preempt_enable();
+	do {
+		count = this_cpu_read(*fbc->counters);
+
+		new = count + amount;
+		/* In case of overflow fold it into the global counter instead */
+		if (new >= batch || new <= -batch) {
+			spin_lock(&fbc->lock);
+			fbc->count += __this_cpu_read(*fbc->counters) + amount;
+			spin_unlock(&fbc->lock);
+			amount = 0;
+			new = 0;
+		}
+
+	} while (this_cpu_cmpxchg(*fbc->counters, count, new) != count);
 }
 EXPORT_SYMBOL(__percpu_counter_add);

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply	[flat|nested] 64+ messages in thread

end of thread, other threads:[~2011-05-05  4:08 UTC | newest]

Thread overview: 64+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-04-13 14:45 percpu: preemptless __per_cpu_counter_add Christoph Lameter
2011-04-13 16:49 ` Christoph Lameter
2011-04-13 18:56   ` Tejun Heo
2011-04-13 20:22     ` [PATCH] " Christoph Lameter
2011-04-13 21:50       ` Tejun Heo
2011-04-13 22:17         ` Christoph Lameter
2011-04-13 22:23           ` Christoph Lameter
2011-04-13 23:55             ` Tejun Heo
2011-04-14  2:00               ` Eric Dumazet
2011-04-14  2:14       ` Eric Dumazet
2011-04-14 21:10         ` Christoph Lameter
2011-04-14 21:15           ` Tejun Heo
2011-04-15 17:37             ` Christoph Lameter
2011-04-15 18:27               ` Tejun Heo
2011-04-15 19:43                 ` Christoph Lameter
2011-04-15 23:52                   ` Tejun Heo
2011-04-18 14:38                     ` Christoph Lameter
2011-04-21 14:43                       ` Tejun Heo
2011-04-21 14:58                         ` Tejun Heo
2011-04-21 17:50                           ` Christoph Lameter
2011-04-21 18:01                             ` Tejun Heo
2011-04-21 18:20                               ` Christoph Lameter
2011-04-21 18:37                                 ` Tejun Heo
2011-04-21 18:54                                   ` Christoph Lameter
2011-04-21 19:08                                     ` Tejun Heo
2011-04-22  2:33                                       ` Shaohua Li
2011-04-26 12:10                                         ` Tejun Heo
2011-04-26 19:02                                           ` Hugh Dickins
2011-04-27 10:28                                             ` Tejun Heo
2011-04-27  5:43                                           ` Shaohua Li
2011-04-27 10:20                                             ` Tejun Heo
2011-04-28  3:28                                               ` Shaohua Li
2011-04-28 10:09                                                 ` Tejun Heo
2011-04-28 14:11                                                   ` Christoph Lameter
2011-04-28 14:23                                                     ` Tejun Heo
2011-04-28 14:30                                                       ` Tejun Heo
2011-04-28 14:58                                                         ` Christoph Lameter
2011-04-28 14:42                                                       ` Christoph Lameter
2011-04-28 14:44                                                         ` Tejun Heo
2011-04-28 14:52                                                           ` Christoph Lameter
2011-04-28 14:56                                                             ` Tejun Heo
2011-04-28 15:05                                                               ` Christoph Lameter
2011-04-28 15:12                                                                 ` Tejun Heo
2011-04-28 15:22                                                                   ` Christoph Lameter
2011-04-28 15:31                                                                     ` Tejun Heo
2011-04-28 15:40                                                                       ` Tejun Heo
2011-04-28 15:47                                                                         ` Christoph Lameter
2011-04-28 15:48                                                                     ` Eric Dumazet
2011-04-28 15:59                                                                       ` Eric Dumazet
2011-04-28 16:17                                                                         ` Christoph Lameter
2011-04-28 16:35                                                                           ` Eric Dumazet
2011-04-28 16:52                                                                             ` Christoph Lameter
2011-04-28 16:59                                                                               ` Eric Dumazet
2011-04-29  8:52                                                                                 ` Tejun Heo
2011-04-29  8:32                                                                             ` Shaohua Li
2011-04-29  8:19                                                   ` Shaohua Li
2011-04-29  8:44                                                     ` Tejun Heo
2011-04-29 14:02                                                       ` Christoph Lameter
2011-04-29 14:03                                                         ` Christoph Lameter
2011-04-29 14:18                                                         ` Tejun Heo
2011-04-29 14:25                                                           ` Christoph Lameter
2011-04-29 14:43                                                             ` Tejun Heo
2011-04-29 14:55                                                               ` Christoph Lameter
2011-05-05  4:08                                                               ` Shaohua Li

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).