From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
To: Ming Lei <tom.leiming@gmail.com>
Cc: Andrew Morton <akpm@linux-foundation.org>,
linux-kernel@vger.kernel.org, Shaohua Li <shli@kernel.org>,
Al Viro <viro@zeniv.linux.org.uk>
Subject: Re: [PATCH] atomic: improve atomic_inc_unless_negative/atomic_dec_unless_positive
Date: Mon, 11 Mar 2013 17:21:31 -0700 [thread overview]
Message-ID: <20130312002131.GA29650@linux.vnet.ibm.com> (raw)
In-Reply-To: <1362843501-31159-1-git-send-email-tom.leiming@gmail.com>
On Sat, Mar 09, 2013 at 11:38:21PM +0800, Ming Lei wrote:
> Generally, both atomic_inc_unless_negative() and
> atomic_dec_unless_positive() need at least two atomic_cmpxchg()
> to complete the atomic operation. In fact, the 1st atomic_cmpxchg()
> is just used to read current value of the atomic variable at most times.
>
> Considered memory barrier, bus lock, cache walking, etc. things may be
> involved in atomic_cmpxchg(), it is much expensive than atomic_read(),
> which is just the simple below:
>
> (*(volatile int *)&(v)->counter)
>
> so this patch can save one extra atomic_cmpxchg() for the two
> helpers under general situation, and should improve them a bit.
>
> Cc: Andrew Morton <akpm@linux-foundation.org>
> Cc: Shaohua Li <shli@kernel.org>
> Cc: Al Viro <viro@zeniv.linux.org.uk>
> Signed-off-by: Ming Lei <tom.leiming@gmail.com>
> ---
> include/linux/atomic.h | 28 ++++++++++++++++++----------
> 1 file changed, 18 insertions(+), 10 deletions(-)
>
> diff --git a/include/linux/atomic.h b/include/linux/atomic.h
> index 5b08a85..aa951d8 100644
> --- a/include/linux/atomic.h
> +++ b/include/linux/atomic.h
> @@ -63,26 +63,34 @@ static inline int atomic_inc_not_zero_hint(atomic_t *v, int hint)
> #ifndef atomic_inc_unless_negative
> static inline int atomic_inc_unless_negative(atomic_t *p)
> {
> - int v, v1;
> - for (v = 0; v >= 0; v = v1) {
> - v1 = atomic_cmpxchg(p, v, v + 1);
> - if (likely(v1 == v))
> + int v, t;
> +
> + v = atomic_read(p);
> + while (1) {
> + if (unlikely(v < 0))
As Frederic noted, you need an smp_mb() right here. Because
atomic_inc_unless_negative() returns a value, it is required to
act as a full memory barrier. On the other code paths, atomic_cmpxchg()
supplies the needed memory ordering, but not on this path.
> + return 0;
> + t = atomic_cmpxchg(p, v, v + 1);
> + if (likely(t == v))
> return 1;
> + v = t;
> }
> - return 0;
> }
> #endif
>
> #ifndef atomic_dec_unless_positive
> static inline int atomic_dec_unless_positive(atomic_t *p)
> {
> - int v, v1;
> - for (v = 0; v <= 0; v = v1) {
> - v1 = atomic_cmpxchg(p, v, v - 1);
> - if (likely(v1 == v))
> + int v, t;
> +
> + v = atomic_read(p);
> + while (1) {
> + if (unlikely(v > 0))
Ditto here.
Thanx, Paul
> + return 0;
> + t = atomic_cmpxchg(p, v, v - 1);
> + if (likely(t == v))
> return 1;
> + v = t;
> }
> - return 0;
> }
> #endif
>
> --
> 1.7.9.5
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/
prev parent reply other threads:[~2013-03-12 0:24 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-03-09 15:38 [PATCH] atomic: improve atomic_inc_unless_negative/atomic_dec_unless_positive Ming Lei
2013-03-11 23:45 ` Andrew Morton
2013-03-11 23:59 ` Frederic Weisbecker
2013-03-12 2:15 ` Ming Lei
2013-03-12 3:39 ` Paul E. McKenney
2013-03-12 4:03 ` Ming Lei
2013-03-12 14:38 ` Paul E. McKenney
2013-03-12 15:02 ` Frederic Weisbecker
2013-03-12 17:55 ` Paul E. McKenney
2013-03-13 9:33 ` anish singh
2013-03-13 12:40 ` Paul E. McKenney
2013-03-12 0:21 ` Paul E. McKenney [this message]
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=20130312002131.GA29650@linux.vnet.ibm.com \
--to=paulmck@linux.vnet.ibm.com \
--cc=akpm@linux-foundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=shli@kernel.org \
--cc=tom.leiming@gmail.com \
--cc=viro@zeniv.linux.org.uk \
/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.