All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] tools: restore READ_ONCE() C++ compatibility
@ 2018-04-04 16:34 Mark Rutland
  2018-04-04 17:13 ` Sandipan Das
                   ` (2 more replies)
  0 siblings, 3 replies; 9+ messages in thread
From: Mark Rutland @ 2018-04-04 16:34 UTC (permalink / raw)
  To: linux-kernel; +Cc: lizhijian, sandipan, Mark Rutland, Arnaldo Carvalho de Melo

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

^ permalink raw reply related	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2018-04-16  6:41 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
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
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

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.