lkml.org 
[lkml]   [2021]   [Nov]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    Subject[PATCH v3 25/25] kcsan: Support WEAK_MEMORY with Clang where no objtool support exists
    From
    Clang and GCC behave a little differently when it comes to the
    __no_sanitize_thread attribute, which has valid reasons, and depending
    on context either one could be right.

    Traditionally, user space ThreadSanitizer [1] still expects instrumented
    builtin atomics (to avoid false positives) and __tsan_func_{entry,exit}
    (to generate meaningful stack traces), even if the function has the
    attribute no_sanitize("thread").

    [1] https://clang.llvm.org/docs/ThreadSanitizer.html#attribute-no-sanitize-thread

    GCC doesn't follow the same policy (for better or worse), and removes
    all kinds of instrumentation if no_sanitize is added. Arguably, since
    this may be a problem for user space ThreadSanitizer, we expect this may
    change in future.

    Since KCSAN != ThreadSanitizer, the likelihood of false positives even
    without barrier instrumentation everywhere, is much lower by design.

    At least for Clang, however, to fully remove all sanitizer
    instrumentation, we must add the disable_sanitizer_instrumentation
    attribute, which is available since Clang 14.0.

    Signed-off-by: Marco Elver <elver@google.com>
    ---
    v3:
    * New patch.
    ---
    include/linux/compiler_types.h | 13 ++++++++++++-
    lib/Kconfig.kcsan | 2 +-
    2 files changed, 13 insertions(+), 2 deletions(-)

    diff --git a/include/linux/compiler_types.h b/include/linux/compiler_types.h
    index 1d32f4c03c9e..3c1795fdb568 100644
    --- a/include/linux/compiler_types.h
    +++ b/include/linux/compiler_types.h
    @@ -198,9 +198,20 @@ struct ftrace_likely_data {
    # define __no_kasan_or_inline __always_inline
    #endif

    -#define __no_kcsan __no_sanitize_thread
    #ifdef __SANITIZE_THREAD__
    +/*
    + * Clang still emits instrumentation for __tsan_func_{entry,exit}() and builtin
    + * atomics even with __no_sanitize_thread (to avoid false positives in userspace
    + * ThreadSanitizer). The kernel's requirements are stricter and we really do not
    + * want any instrumentation with __no_kcsan.
    + *
    + * Therefore we add __disable_sanitizer_instrumentation where available to
    + * disable all instrumentation. See Kconfig.kcsan where this is mandatory.
    + */
    +# define __no_kcsan __no_sanitize_thread __disable_sanitizer_instrumentation
    # define __no_sanitize_or_inline __no_kcsan notrace __maybe_unused
    +#else
    +# define __no_kcsan
    #endif

    #ifndef __no_sanitize_or_inline
    diff --git a/lib/Kconfig.kcsan b/lib/Kconfig.kcsan
    index e4394ea8068b..63b70b8c5551 100644
    --- a/lib/Kconfig.kcsan
    +++ b/lib/Kconfig.kcsan
    @@ -198,7 +198,7 @@ config KCSAN_WEAK_MEMORY
    # We can either let objtool nop __tsan_func_{entry,exit}() and builtin
    # atomics instrumentation in .noinstr.text, or use a compiler that can
    # implement __no_kcsan to really remove all instrumentation.
    - depends on STACK_VALIDATION || CC_IS_GCC
    + depends on STACK_VALIDATION || CC_IS_GCC || CLANG_VERSION >= 140000
    help
    Enable support for modeling a subset of weak memory, which allows
    detecting a subset of data races due to missing memory barriers.
    --
    2.34.0.rc2.393.gf8c9666880-goog
    \
     
     \ /
      Last update: 2021-11-30 12:48    [W:4.453 / U:1.244 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site