23 Oct, 2020

1 commit

  • Pull Kbuild updates from Masahiro Yamada:

    - Support 'make compile_commands.json' to generate the compilation
    database more easily, avoiding stale entries

    - Support 'make clang-analyzer' and 'make clang-tidy' for static checks
    using clang-tidy

    - Preprocess scripts/modules.lds.S to allow CONFIG options in the
    module linker script

    - Drop cc-option tests from compiler flags supported by our minimal
    GCC/Clang versions

    - Use always 12-digits commit hash for CONFIG_LOCALVERSION_AUTO=y

    - Use sha1 build id for both BFD linker and LLD

    - Improve deb-pkg for reproducible builds and rootless builds

    - Remove stale, useless scripts/namespace.pl

    - Turn -Wreturn-type warning into error

    - Fix build error of deb-pkg when CONFIG_MODULES=n

    - Replace 'hostname' command with more portable 'uname -n'

    - Various Makefile cleanups

    * tag 'kbuild-v5.10' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild: (34 commits)
    kbuild: Use uname for LINUX_COMPILE_HOST detection
    kbuild: Only add -fno-var-tracking-assignments for old GCC versions
    kbuild: remove leftover comment for filechk utility
    treewide: remove DISABLE_LTO
    kbuild: deb-pkg: clean up package name variables
    kbuild: deb-pkg: do not build linux-headers package if CONFIG_MODULES=n
    kbuild: enforce -Werror=return-type
    scripts: remove namespace.pl
    builddeb: Add support for all required debian/rules targets
    builddeb: Enable rootless builds
    builddeb: Pass -n to gzip for reproducible packages
    kbuild: split the build log of kallsyms
    kbuild: explicitly specify the build id style
    scripts/setlocalversion: make git describe output more reliable
    kbuild: remove cc-option test of -Werror=date-time
    kbuild: remove cc-option test of -fno-stack-check
    kbuild: remove cc-option test of -fno-strict-overflow
    kbuild: move CFLAGS_{KASAN,UBSAN,KCSAN} exports to relevant Makefiles
    kbuild: remove redundant CONFIG_KASAN check from scripts/Makefile.kasan
    kbuild: do not create built-in objects for external module builds
    ...

    Linus Torvalds
     

24 Sep, 2020

1 commit

  • Move CFLAGS_KASAN*, CFLAGS_UBSAN, CFLAGS_KCSAN to Makefile.kasan,
    Makefile.ubsan, Makefile.kcsan, respectively.

    This commit also avoids the same -fsanitize=* flags being added to
    CFLAGS_UBSAN multiple times.

    Prior to this commit, the ubsan flags were appended by the '+='
    operator, without any initialization. Some build targets such as
    'make bindeb-pkg' recurses to the top Makefile, and ended up with
    adding the same flags to CFLAGS_UBSAN twice.

    Clear CFLAGS_UBSAN with ':=' to make it a simply expanded variable.
    This is better than a recursively expanded variable, which evaluates
    $(call cc-option, ...) multiple times before Kbuild starts descending
    to subdirectories.

    Signed-off-by: Masahiro Yamada
    Acked-by: Marco Elver

    Masahiro Yamada
     

25 Aug, 2020

1 commit

  • Add support for compounded read-write instrumentation if supported by
    the compiler. Adds the necessary instrumentation functions, and a new
    type which is used to generate a more descriptive report.

    Furthermore, such compounded memory access instrumentation is excluded
    from the "assume aligned writes up to word size are atomic" rule,
    because we cannot assume that the compiler emits code that is atomic for
    compound ops.

    LLVM/Clang added support for the feature in:
    https://github.com/llvm/llvm-project/commit/785d41a261d136b64ab6c15c5d35f2adc5ad53e3

    The new instrumentation is emitted for sets of memory accesses in the
    same basic block to the same address with at least one read appearing
    before a write. These typically result from compound operations such as
    ++, --, +=, -=, |=, &=, etc. but also equivalent forms such as "var =
    var + 1". Where the compiler determines that it is equivalent to emit a
    call to a single __tsan_read_write instead of separate __tsan_read and
    __tsan_write, we can then benefit from improved performance and better
    reporting for such access patterns.

    The new reports now show that the ops are both reads and writes, for
    example:

    read-write to 0xffffffff90548a38 of 8 bytes by task 143 on cpu 3:
    test_kernel_rmw_array+0x45/0xa0
    access_thread+0x71/0xb0
    kthread+0x21e/0x240
    ret_from_fork+0x22/0x30

    read-write to 0xffffffff90548a38 of 8 bytes by task 144 on cpu 2:
    test_kernel_rmw_array+0x45/0xa0
    access_thread+0x71/0xb0
    kthread+0x21e/0x240
    ret_from_fork+0x22/0x30

    Acked-by: Peter Zijlstra (Intel)
    Signed-off-by: Marco Elver
    Signed-off-by: Paul E. McKenney

    Marco Elver
     

10 Aug, 2020

2 commits

  • Pull Kbuild updates from Masahiro Yamada:

    - run the checker (e.g. sparse) after the compiler

    - remove unneeded cc-option tests for old compiler flags

    - fix tar-pkg to install dtbs

    - introduce ccflags-remove-y and asflags-remove-y syntax

    - allow to trace functions in sub-directories of lib/

    - introduce hostprogs-always-y and userprogs-always-y syntax

    - various Makefile cleanups

    * tag 'kbuild-v5.9' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild:
    kbuild: stop filtering out $(GCC_PLUGINS_CFLAGS) from cc-option base
    kbuild: include scripts/Makefile.* only when relevant CONFIG is enabled
    kbuild: introduce hostprogs-always-y and userprogs-always-y
    kbuild: sort hostprogs before passing it to ifneq
    kbuild: move host .so build rules to scripts/gcc-plugins/Makefile
    kbuild: Replace HTTP links with HTTPS ones
    kbuild: trace functions in subdirectories of lib/
    kbuild: introduce ccflags-remove-y and asflags-remove-y
    kbuild: do not export LDFLAGS_vmlinux
    kbuild: always create directories of targets
    powerpc/boot: add DTB to 'targets'
    kbuild: buildtar: add dtbs support
    kbuild: remove cc-option test of -ffreestanding
    kbuild: remove cc-option test of -fno-stack-protector
    Revert "kbuild: Create directory for target DTB"
    kbuild: run the checker after the compiler

    Linus Torvalds
     
  • Currently, the top Makefile includes all of scripts/Makefile.
    even if the associated CONFIG option is disabled.

    Do not include unneeded Makefiles in order to slightly optimize the
    parse stage.

    Include $(include-y), and ignore $(include-).

    Signed-off-by: Masahiro Yamada

    Masahiro Yamada
     

30 Jun, 2020

1 commit

  • GCC version 11 recently implemented all requirements to correctly
    support KCSAN:

    1. Correct no_sanitize-attribute inlining behaviour:
    https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=4089df8ef4a63126b0774c39b6638845244c20d2

    2. --param=tsan-distinguish-volatile
    https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=ab2789ec507a94f1a75a6534bca51c7b39037ce0

    3. --param=tsan-instrument-func-entry-exit
    https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=06712fc68dc9843d9af7c7ac10047f49d305ad76

    Therefore, we can re-enable GCC for KCSAN, and document the new compiler
    requirements.

    Signed-off-by: Marco Elver
    Cc: Martin Liska
    Signed-off-by: Paul E. McKenney

    Marco Elver
     

12 Jun, 2020

3 commits

  • Clang (unlike GCC) removes reads before writes with matching addresses
    in the same basic block. This is an optimization for TSAN, since writes
    will always cause conflict if the preceding read would have.

    However, for KCSAN we cannot rely on this option, because we apply
    several special rules to writes, in particular when the
    KCSAN_ASSUME_PLAIN_WRITES_ATOMIC option is selected. To avoid missing
    potential data races, pass the -tsan-instrument-read-before-write option
    to Clang if it is available [1].

    [1] https://github.com/llvm/llvm-project/commit/151ed6aa38a3ec6c01973b35f684586b6e1c0f7e

    Signed-off-by: Marco Elver
    Signed-off-by: Borislav Petkov
    Signed-off-by: Thomas Gleixner
    Acked-by: Peter Zijlstra (Intel)
    Acked-by: Will Deacon
    Link: https://lkml.kernel.org/r/20200521142047.169334-5-elver@google.com

    Marco Elver
     
  • In the kernel, the "volatile" keyword is used in various concurrent
    contexts, whether in low-level synchronization primitives or for
    legacy reasons. If supported by the compiler, it will be assumed
    that aligned volatile accesses up to sizeof(long long) (matching
    compiletime_assert_rwonce_type()) are atomic.

    Recent versions of Clang [1] (GCC tentative [2]) can instrument
    volatile accesses differently. Add the option (required) to enable the
    instrumentation, and provide the necessary runtime functions. None of
    the updated compilers are widely available yet (Clang 11 will be the
    first release to support the feature).

    [1] https://github.com/llvm/llvm-project/commit/5a2c31116f412c3b6888be361137efd705e05814
    [2] https://gcc.gnu.org/pipermail/gcc-patches/2020-April/544452.html

    This change allows removing of any explicit checks in primitives such as
    READ_ONCE() and WRITE_ONCE().

    [ bp: Massage commit message a bit. ]

    Signed-off-by: Marco Elver
    Signed-off-by: Borislav Petkov
    Signed-off-by: Thomas Gleixner
    Acked-by: Will Deacon
    Acked-by: Peter Zijlstra (Intel)
    Link: https://lkml.kernel.org/r/20200521142047.169334-4-elver@google.com

    Marco Elver
     
  • To avoid inserting __tsan_func_{entry,exit}, add option if supported by
    compiler. Currently only Clang can be told to not emit calls to these
    functions. It is safe to not emit these, since KCSAN does not rely on
    them.

    Note that, if we disable __tsan_func_{entry,exit}(), we need to disable
    tail-call optimization in sanitized compilation units, as otherwise we
    may skip frames in the stack trace; in particular when the tail called
    function is one of the KCSAN's runtime functions, and a report is
    generated, we might miss the function where the actual access occurred.

    Since __tsan_func_{entry,exit}() insertion effectively disabled
    tail-call optimization, there should be no observable change.

    This was caught and confirmed with kcsan-test & UNWINDER_ORC.

    Signed-off-by: Marco Elver
    Signed-off-by: Borislav Petkov
    Signed-off-by: Thomas Gleixner
    Acked-by: Will Deacon
    Acked-by: Peter Zijlstra (Intel)
    Link: https://lkml.kernel.org/r/20200521142047.169334-3-elver@google.com

    Marco Elver
     

16 Nov, 2019

1 commit

  • Kernel Concurrency Sanitizer (KCSAN) is a dynamic data-race detector for
    kernel space. KCSAN is a sampling watchpoint-based data-race detector.
    See the included Documentation/dev-tools/kcsan.rst for more details.

    This patch adds basic infrastructure, but does not yet enable KCSAN for
    any architecture.

    Signed-off-by: Marco Elver
    Acked-by: Paul E. McKenney
    Signed-off-by: Paul E. McKenney

    Marco Elver