public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Nick Piggin <nickpiggin@yahoo.com.au>
To: linux-kernel <linux-kernel@vger.kernel.org>
Subject: [patch 5/5] atomic: dec_and_lock use atomic primitives
Date: Sun, 30 Oct 2005 11:47:04 +1100	[thread overview]
Message-ID: <43641808.5000705@yahoo.com.au> (raw)
In-Reply-To: <436417C2.3050703@yahoo.com.au>

[-- Attachment #1: Type: text/plain, Size: 33 bytes --]

5/5

-- 
SUSE Labs, Novell Inc.


[-- Attachment #2: atomic-dec_and_lock-use-atomic-primitives.patch --]
[-- Type: text/plain, Size: 2219 bytes --]

Index: linux-2.6/lib/dec_and_lock.c
===================================================================
--- linux-2.6.orig/lib/dec_and_lock.c
+++ linux-2.6/lib/dec_and_lock.c
@@ -1,47 +1,11 @@
 #include <linux/module.h>
 #include <linux/spinlock.h>
 #include <asm/atomic.h>
-#include <asm/system.h>
 
-#ifdef __HAVE_ARCH_CMPXCHG
 /*
  * This is an implementation of the notion of "decrement a
  * reference count, and return locked if it decremented to zero".
  *
- * This implementation can be used on any architecture that
- * has a cmpxchg, and where atomic->value is an int holding
- * the value of the atomic (i.e. the high bits aren't used
- * for a lock or anything like that).
- */
-int _atomic_dec_and_lock(atomic_t *atomic, spinlock_t *lock)
-{
-	int counter;
-	int newcount;
-
-	for (;;) {
-		counter = atomic_read(atomic);
-		newcount = counter - 1;
-		if (!newcount)
-			break;		/* do it the slow way */
-
-		newcount = cmpxchg(&atomic->counter, counter, newcount);
-		if (newcount == counter)
-			return 0;
-	}
-
-	spin_lock(lock);
-	if (atomic_dec_and_test(atomic))
-		return 1;
-	spin_unlock(lock);
-	return 0;
-}
-#else
-/*
- * This is an architecture-neutral, but slow,
- * implementation of the notion of "decrement
- * a reference count, and return locked if it
- * decremented to zero".
- *
  * NOTE NOTE NOTE! This is _not_ equivalent to
  *
  *	if (atomic_dec_and_test(&atomic)) {
@@ -52,21 +16,20 @@ int _atomic_dec_and_lock(atomic_t *atomi
  *
  * because the spin-lock and the decrement must be
  * "atomic".
- *
- * This slow version gets the spinlock unconditionally,
- * and releases it if it isn't needed. Architectures
- * are encouraged to come up with better approaches,
- * this is trivially done efficiently using a load-locked
- * store-conditional approach, for example.
  */
 int _atomic_dec_and_lock(atomic_t *atomic, spinlock_t *lock)
 {
+#ifdef CONFIG_SMP
+	/* Subtract 1 from counter unless that drops it to 0 (ie. it was 1) */
+	if (atomic_add_unless(atomic, -1, 1))
+		return 0;
+#endif
+	/* Otherwise do it the slow way */
 	spin_lock(lock);
 	if (atomic_dec_and_test(atomic))
 		return 1;
 	spin_unlock(lock);
 	return 0;
 }
-#endif
 
 EXPORT_SYMBOL(_atomic_dec_and_lock);

  reply	other threads:[~2005-10-30  0:45 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-10-30  0:41 [patches] lockless pagecache prep round 1 Nick Piggin
2005-10-30  0:43 ` [patch 1/5] i386 generic cmpxchg Nick Piggin
2005-10-30  0:44   ` [patch 2/5] atomic: atomic_cmpxchg Nick Piggin
2005-10-30  0:45     ` [patch 3/5] atomic: atomic_inc_not_zero Nick Piggin
2005-10-30  0:45       ` [patch 4/5] rcu file: use atomic primitives Nick Piggin
2005-10-30  0:47         ` Nick Piggin [this message]
2005-10-31 19:05       ` [patch 3/5] atomic: atomic_inc_not_zero Christoph Lameter
2005-11-01  4:34         ` Nick Piggin
2005-11-14 16:29       ` Paul Jackson
2005-11-14 21:48         ` Andrew Morton
2005-11-14 22:02           ` Paul Jackson
2005-11-14 23:09             ` Andrew Morton
2005-11-15  8:57               ` Nick Piggin
2005-10-30 20:12   ` [patch 1/5] i386 generic cmpxchg Zwane Mwaikambo
2005-10-31  1:29     ` Nick Piggin
2005-10-31  6:06       ` Zwane Mwaikambo
2005-10-31 19:09       ` Christoph Lameter
2005-10-30  0:48 ` [patche 1/5] radix tree: lookup_slot Nick Piggin
2005-10-30  0:49   ` [patch 2/5] radix tree: use prealloc Nick Piggin
2005-10-30  0:50     ` [patch 3/5] radix tree: cleanup Nick Piggin
2005-10-30  0:51       ` [patch 4/5] radix tree: clear_tags bail Nick Piggin
2005-10-30  0:57         ` [patch 5/5] radix tree: shrink Nick Piggin
2005-10-30  1:04 ` [patch 1/5] radix tree: lookup_slot Nick Piggin

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=43641808.5000705@yahoo.com.au \
    --to=nickpiggin@yahoo.com.au \
    --cc=linux-kernel@vger.kernel.org \
    /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