From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
To: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ming Lei <tom.leiming@gmail.com>,
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: Tue, 12 Mar 2013 10:55:57 -0700 [thread overview]
Message-ID: <20130312175557.GF3725@linux.vnet.ibm.com> (raw)
In-Reply-To: <CAFTL4hxHV+htjCsk1w-78kAg3WopfJ=CYH_kx-k7uFNiEC=pzw@mail.gmail.com>
On Tue, Mar 12, 2013 at 04:02:47PM +0100, Frederic Weisbecker wrote:
> 2013/3/12 Paul E. McKenney <paulmck@linux.vnet.ibm.com>:
> > On Tue, Mar 12, 2013 at 12:03:23PM +0800, Ming Lei wrote:
> >> On Tue, Mar 12, 2013 at 11:39 AM, Paul E. McKenney
> >> <paulmck@linux.vnet.ibm.com> wrote:
> >> >
> >> > Atomic operations that return a value are required to act as full memory
> >> > barriers. This means that code relying on ordering provided by these
> >> > atomic operations must also do ordering, either by using an explicit
> >> > memory barrier or by relying on guarantees from atomic operations.
> >> >
> >> > For example:
> >> >
> >> > CPU 0 CPU 1
> >> >
> >> > X = 1; r1 = Z;
> >> > if (atomic_inc_unless_negative(&Y) smp_mb();
> >> > do_something();
> >> > Z = 1; r2 = X;
> >> >
> >> > Assuming X and Z are initially zero, if r1==1, we are guaranteed
> >> > that r2==1. However, CPU 1 needs its smp_mb() in order to pair with
> >> > the barrier implicit in atomic_inc_unless_negative().
> >> >
> >> > Make sense?
> >>
> >> Yes, it does, and thanks for the explanation.
> >>
> >> But looks the above example is not what Frederic described:
> >>
> >> "the above atomic_read() might return -1 because there is no
> >> guarantee it's seeing the recent update on the remote CPU."
> >>
> >> Even I am not sure if adding one smp_mb() around atomic_read()
> >> can guarantee that too.
> >
> > Frederic was likely thinking of some other scenario that would be
> > broken by atomic_inc_unless_negative() failing to act as a full
> > memory barrier. Here is another example:
> >
> >
> > CPU 0 CPU 1
> >
> > X = 1;
> > if (atomic_inc_unless_negative(&Y) r1 = atomic_xchg(&Y, -1);
> > r2 = X;
> >
> > If atomic_inc_unless_negative() acts as a full memory barrier, then
> > if CPU 0 reaches the assignment from X, the results will be guaranteed
> > to be 1. Otherwise, there is no guarantee.
>
> Your scenarios show an interesting guarantee I did not think about.
> But my concern was on such a situation:
>
> CPU 0 CPU 1
>
> atomic_set(&X, -1)
> atomic_inc(&X)
> atomic_add_unless_negative(&X, 5)
>
> On the above situation, CPU 0 may still see X == -1 and thus not add
> the 5. Of course all that only make sense with datas coming along.
That could happen, but you would need CPU 1 to carry out some other
reference for it to be a bug. Otherwise, CPU 1's atomic_inc() just
happened after all of CPU 0's code. But yes, it would be possible
to misorder with some larger scenario starting with this example.
Especially given that atomic_inc() does not make any ordering guarantees.
Thanx, Paul
Thanx, Paul
next prev parent reply other threads:[~2013-03-12 17:57 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 [this message]
2013-03-13 9:33 ` anish singh
2013-03-13 12:40 ` Paul E. McKenney
2013-03-12 0:21 ` Paul E. McKenney
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=20130312175557.GF3725@linux.vnet.ibm.com \
--to=paulmck@linux.vnet.ibm.com \
--cc=akpm@linux-foundation.org \
--cc=fweisbec@gmail.com \
--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.