All of lore.kernel.org
 help / color / mirror / Atom feed
From: Arnaldo Carvalho de Melo <acme@redhat.com>
To: Mark Rutland <mark.rutland@arm.com>
Cc: linux-kernel@vger.kernel.org, lizhijian@cn.fujitsu.com,
	sandipan@linux.vnet.ibm.com
Subject: Re: [PATCH] tools: restore READ_ONCE() C++ compatibility
Date: Mon, 9 Apr 2018 16:40:32 -0300	[thread overview]
Message-ID: <20180409194032.GA7184@redhat.com> (raw)
In-Reply-To: <20180409171041.6qfabrccsqu4bdlc@lakrids.cambridge.arm.com>

Em Mon, Apr 09, 2018 at 06:10:41PM +0100, Mark Rutland escreveu:
> Hi Arnaldo,
> 
> As Sandipan gave a Tested-by for this, are you happy to pick it up as a
> fix for v4.17?
> 
> Or would you prefer that I resend this?

I forgot about this fix, but was exposed to it while processing
Sandipan's patches for fixing up builtin clang support, so I ended up
adding the following patch:

https://git.kernel.org/acme/c/ad0902e0c400

This sidesteps this issue by removing the sequence of includes that ends
up including the compiler.h from a C++ file.

Now 'make LIBCLANGLLVM=1 -C tools/perf' works, but I'll look at the
patch below, probably it will save some time in the future if we get to
include compiler.h from C++ code again...

Take a look at my perf/urgent branch, that I just asked Ingo to pull.

- Arnaldo
 
> Thanks,
> Mark.
> 
> On Wed, Apr 04, 2018 at 05:34:45PM +0100, Mark Rutland wrote:
> > Our userspace <linux/compiler.h> defines READ_ONCE() in a way that clang
> > doesn't like, as we have an anonymous union in which neither field is
> > initialized.
> > 
> > WRITE_ONCE() is fine since it initializes the __val field. For
> > READ_ONCE() we can keep clang and GCC happy with a dummy initialization
> > of the __c field, so let's do that.
> > 
> > At the same time, let's split READ_ONCE() and WRITE_ONCE() over several
> > lines for legibility, as we do in the in-kernel <linux/compiler.h>.
> > 
> > Signed-off-by: Mark Rutland <mark.rutland@arm.com>
> > Fixes: 6aa7de059173a986 ("locking/atomics: COCCINELLE/treewide: Convert trivial ACCESS_ONCE() patterns to READ_ONCE()/WRITE_ONCE()")
> > Reported-by: Li Zhijian <lizhijian@cn.fujitsu.com>
> > Reported-by: Sandipan Das <sandipan@linux.vnet.ibm.com>
> > Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
> > ---
> >  tools/include/linux/compiler.h | 20 +++++++++++++++-----
> >  1 file changed, 15 insertions(+), 5 deletions(-)
> > 
> > Hi,
> > 
> > This is fallout from my automated ACCESS_ONCE() removal, and I'm not that
> > familiar with using clang for perf.
> > 
> > In local testing, this fixes READ_ONCE() when compiling with clang, but I
> > subsequently hit some other issues which I believe are down to LLVM API
> > changes.
> > 
> > Zhijian, Sandipan, does this patch work for you?
> > 
> > Thanks,
> > Mark.
> > 
> > diff --git a/tools/include/linux/compiler.h b/tools/include/linux/compiler.h
> > index 04e32f965ad7..1827c2f973f9 100644
> > --- a/tools/include/linux/compiler.h
> > +++ b/tools/include/linux/compiler.h
> > @@ -151,11 +151,21 @@ static __always_inline void __write_once_size(volatile void *p, void *res, int s
> >   * required ordering.
> >   */
> >  
> > -#define READ_ONCE(x) \
> > -	({ union { typeof(x) __val; char __c[1]; } __u; __read_once_size(&(x), __u.__c, sizeof(x)); __u.__val; })
> > -
> > -#define WRITE_ONCE(x, val) \
> > -	({ union { typeof(x) __val; char __c[1]; } __u = { .__val = (val) }; __write_once_size(&(x), __u.__c, sizeof(x)); __u.__val; })
> > +#define READ_ONCE(x)					\
> > +({							\
> > +	union { typeof(x) __val; char __c[1]; } __u =	\
> > +		{ .__c = { 0 } };			\
> > +	__read_once_size(&(x), __u.__c, sizeof(x));	\
> > +	__u.__val;					\
> > +})
> > +
> > +#define WRITE_ONCE(x, val)				\
> > +({							\
> > +	union { typeof(x) __val; char __c[1]; } __u =	\
> > +		{ .__val = (val) }; 			\
> > +	__write_once_size(&(x), __u.__c, sizeof(x));	\
> > +	__u.__val;					\
> > +})
> >  
> >  
> >  #ifndef __fallthrough
> > -- 
> > 2.11.0
> > 

  reply	other threads:[~2018-04-09 19:40 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-04-04 16:34 [PATCH] tools: restore READ_ONCE() C++ compatibility Mark Rutland
2018-04-04 17:13 ` Sandipan Das
2018-04-04 17:18   ` Mark Rutland
2018-04-04 17:22     ` Sandipan Das
2018-04-09 17:10 ` Mark Rutland
2018-04-09 19:40   ` Arnaldo Carvalho de Melo [this message]
2018-04-10 10:55     ` Mark Rutland
2018-04-10 15:50       ` Arnaldo Carvalho de Melo
2018-04-16  6:41 ` [tip:perf/urgent] tools headers: Restore " tip-bot for Mark Rutland

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=20180409194032.GA7184@redhat.com \
    --to=acme@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=lizhijian@cn.fujitsu.com \
    --cc=mark.rutland@arm.com \
    --cc=sandipan@linux.vnet.ibm.com \
    /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.