From: Ralf Baechle <ralf@linux-mips.org>
To: Kaz Kylheku <kaz@zeugmasystems.com>
Cc: linux-mips@linux-mips.org
Subject: Re: Sync operation in atomic_add_return()
Date: Fri, 10 Nov 2006 13:50:40 +0000 [thread overview]
Message-ID: <20061110135040.GB10119@linux-mips.org> (raw)
In-Reply-To: <66910A579C9312469A7DF9ADB54A8B7D44D837@exchange.ZeugmaSystems.local>
On Mon, Nov 06, 2006 at 10:17:53AM -0800, Kaz Kylheku wrote:
> > Hi,
> > I am trying to figure out why there is a sync operation in
> > linux/include/asm-mips/atomic.h:atomic_add_return().
> > I believe it was added in the linux-2.4.19 patch, but can't trace the
> > reason. Can anyone help?
>
> Is it just unwarranted paranoia? There does not appear to be a need for
> the sync within the atomic_add_return code itself.
atomic_*_return() are used as synchronization points so must imply a
memory barrier on MP.
> But it might be that the code which calls this function needs the sync.
>
> Without looking at any code whatsoever, here is a general hypothesis.
>
> In what situation might you /care/ about the return value of an atomic
> add?
>
> Suppose atomic increments and decrements are being used for reference
> counting. If you know that you hold the reference to an object, you can
> call atomic_add to increase the reference count without caring about the
> return value, and no sync is needed in that situation.
For example the networking code does basically:
static inline void sock_put(struct sock *sk)
{
if (atomic_add_and_test(-11, &sk->sk_refcnt) == 0)
sk_free(sk);
}
> Suppose, however, that atomic_add is used to pick up a reference.
> Suppose you have a pool of ``dead'' objects with reference counts of
> zero, and want to recycle an object from such a pool. You might use
> atomic_add_return to examine the reference counts of the objects in this
> pool one by one until you get a 1 return. You might get something other
> than a 1 return if racing against another processor which is tryiing to
> pick up the same object.
>
> In this situation, if you successfully get the object, you do want to do
> a sync, since the object is being handed off between two processors.
> Before the object was put into the pool, its fields were updated, since
> it was being cleaned up. You would not want the new owner, by chance, to
> observe stale values of those fields.
>
> I.e., to put it briefly, atomic_add_return can have "acquire" semantics.
Correct - and depending on its use it may also have release semantics.
This applies to all atomic_*_return() functions not just atomic_add_return.
Ralf
next prev parent reply other threads:[~2006-11-10 13:50 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-11-06 18:17 Sync operation in atomic_add_return() Kaz Kylheku
2006-11-06 18:17 ` Kaz Kylheku
2006-11-10 13:50 ` Ralf Baechle [this message]
-- strict thread matches above, loose matches on Subject: below --
2006-11-12 6:46 Gideon Stupp (gstupp)
2006-11-12 6:46 ` Gideon Stupp (gstupp)
2006-11-06 14:42 Gideon Stupp (gstupp)
2006-11-06 14:42 ` Gideon Stupp (gstupp)
2006-11-10 13:37 ` Ralf Baechle
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=20061110135040.GB10119@linux-mips.org \
--to=ralf@linux-mips.org \
--cc=kaz@zeugmasystems.com \
--cc=linux-mips@linux-mips.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 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.