lkml.org 
[lkml]   [2018]   [Apr]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip:perf/urgent] tools headers: Restore READ_ONCE() C++ compatibility
    Commit-ID:  4d3b57da1593c66835d8e3a757e4751b35493fb8
    Gitweb: https://git.kernel.org/tip/4d3b57da1593c66835d8e3a757e4751b35493fb8
    Author: Mark Rutland <mark.rutland@arm.com>
    AuthorDate: Wed, 4 Apr 2018 17:34:45 +0100
    Committer: Arnaldo Carvalho de Melo <acme@redhat.com>
    CommitDate: Thu, 12 Apr 2018 09:30:09 -0300

    tools headers: Restore READ_ONCE() C++ compatibility

    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>.

    Reported-by: Li Zhijian <lizhijian@cn.fujitsu.com>
    Reported-by: Sandipan Das <sandipan@linux.vnet.ibm.com>
    Tested-by: Sandipan Das <sandipan@linux.vnet.ibm.com>
    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()")
    Link: http://lkml.kernel.org/r/20180404163445.16492-1-mark.rutland@arm.com
    Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
    ---
    tools/include/linux/compiler.h | 20 +++++++++++++++-----
    1 file changed, 15 insertions(+), 5 deletions(-)

    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
    \
     
     \ /
      Last update: 2018-04-16 08:42    [W:3.571 / U:0.592 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site