All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Paul E. McKenney" <paulmck@linux.ibm.com>
To: Akira Yokosawa <akiyks@gmail.com>
Cc: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>,
	perfbook@vger.kernel.org
Subject: Re: Question of usage of per_thread()
Date: Sun, 16 Sep 2018 08:08:49 -0700	[thread overview]
Message-ID: <20180916150849.GW652@linux.ibm.com> (raw)
In-Reply-To: <71206929-11cd-73bc-560e-f982c7e86cf8@gmail.com>

On Sun, Sep 16, 2018 at 05:37:23PM +0900, Akira Yokosawa wrote:
> Hi Paul,
> 
> Every time I review code under CodeSamples/,
> I find myself confused where to use READ_ONCE/WRITE_ONCEs.
> 
> I'm looking at Listing 5.3 of current master.
> 
> There are two cases which lack READ_ONCE/WRITE_ONCE to access potentially
> shared variables, namely on line 5 (__get_thread_var(counter)++;) and
> on line 14 (sum += per_thread(counter, t);).
> 
> Line 5 looks like a good candidate to be optimized out when inlined.
> But the performance result indicates "gcc -O3" keeps it inside the loop.
> 
> Is this because the definition of __get_thread_var() contains
> a call to smp_thread_id() and complicated enough not to be optimized
> out?
> 
> As for line 14, as per_thread() was derived from per_cpu() of kernel
> API, I looked for call sites of per_cpu() in the kernel source tree.
> 
> There are very few cases where READ_ONCE/WRITE_ONCE is used along
> with per_cpu(). There are two READ_ONCEs with per_cpu() in
> kernel/rcu/srcutree.c, whose author is none other than you.
> Are those READ_ONCEs necessary?
> 
> I don't grasp the actual definition of per_cpu() macro.
> Definition of per_thread() macro under CodeSamples/api-pthreads/
> does not look so complicated, but contains array indexing,
> which might be good enough to prevent optimization in the loop.
> 
> I'm not sure, but my gut feeling is that READ_ONCE/WRITE_ONCE
> is necessary to access an unannotated variable. If we need
> volatility for sure, we could modify the definition of annotating
> macros/functions.
> 
> Can you enlighten me?

Yes, I do need to expand on this, both in perfbook and in order to inspect
my usage in Linux-kernel RCU.  Please see below for my current outline,
and any and all feedback would be deeply appreciated!

							Thanx, Paul

------------------------------------------------------------------------


Plain accesses, that is, without either READ_ONCE() or WRITE_ONCE():
o	Only accessed under lock.
o	Only accessed by owning CPU/thread.
o	Only modified by owning CPU/thread under lock, and otherwise
	accessed only either while holding lock or by owning CPU/thread.

WRITE_ONCE() for modifications, READ_ONCE() for non-owning CPUs/threads
not holding lock:
o	Only modified while holding lock by owning CPU/thread,
	could be read from anywhere by anyone.

WRITE_ONCE() for modifications, READ_ONCE() for CPUs/threads not holding
lock:
o	Only modified while holding lock, could be read anywhere by
	anyone.

WRITE_ONCE() for modifications, READ_ONCE() for non-owning
CPUs/threads:
o	Only modified by owning CPU/threads, could be read anywhere
	by anyone.

Otherwise, READ_ONCE() and WRITE_ONCE() everywhere.

But note that READ_ONCE() and WRITE_ONCE() provide absolutely no
ordering guarantees unless:

o	There is only one variable being accesses, and all of those
	accesses are of the same size and alignment.

o	There is only one CPU/thread doing the accesses to all
	of the variables during the timeframe of interest.

o	There are other operations involved, for example, smp_mb().

  reply	other threads:[~2018-09-16 15:08 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-09-16  8:37 Question of usage of per_thread() Akira Yokosawa
2018-09-16 15:08 ` Paul E. McKenney [this message]
2018-10-01 22:48   ` Akira Yokosawa
2018-10-02  4:00     ` 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=20180916150849.GW652@linux.ibm.com \
    --to=paulmck@linux.ibm.com \
    --cc=akiyks@gmail.com \
    --cc=paulmck@linux.vnet.ibm.com \
    --cc=perfbook@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 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.