All of lore.kernel.org
 help / color / mirror / Atom feed
From: Marco Elver <elver@google.com>
To: kernel test robot <lkp@intel.com>
Cc: llvm@lists.linux.dev, oe-kbuild-all@lists.linux.dev,
	Ammar Faizi <ammarfaizi2@gnuweeb.org>,
	GNU/Weeb Mailing List <gwml@vger.gnuweeb.org>,
	Sasha Levin <sashal@kernel.org>,
	"Paul E. McKenney" <paulmck@kernel.org>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Subject: Re: [ammarfaizi2-block:stable/linux-stable-rc/queue/5.15 54/54] kernel/kcsan/core.c:1076:49: error: too many arguments to function call, expected 3, have 4
Date: Mon, 2 Jan 2023 21:15:26 +0100	[thread overview]
Message-ID: <Y7M7Xo7NJEy7Yucr@elver.google.com> (raw)
In-Reply-To: <202301030233.rZPMiNh1-lkp@intel.com>

[-- Attachment #1: Type: text/plain, Size: 5777 bytes --]

On Tue, Jan 03, 2023 at 02:44AM +0800, kernel test robot wrote:
> tree:   https://github.com/ammarfaizi2/linux-block stable/linux-stable-rc/queue/5.15
> head:   6b61636f89bfa685895515e024c7d07c0fdebaa9
> commit: 6b61636f89bfa685895515e024c7d07c0fdebaa9 [54/54] kcsan: Instrument memcpy/memset/memmove with newer Clang
> config: s390-randconfig-r021-20230102
> compiler: clang version 16.0.0 (https://github.com/llvm/llvm-project 7a8cb6cd4e3ff8aaadebff2b9d3ee9e2a326d444)
> reproduce (this is a W=1 build):
>         wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
>         chmod +x ~/bin/make.cross
>         # install s390 cross compiling tool for clang build
>         # apt-get install binutils-s390x-linux-gnu
>         # https://github.com/ammarfaizi2/linux-block/commit/6b61636f89bfa685895515e024c7d07c0fdebaa9
>         git remote add ammarfaizi2-block https://github.com/ammarfaizi2/linux-block
>         git fetch --no-tags ammarfaizi2-block stable/linux-stable-rc/queue/5.15
>         git checkout 6b61636f89bfa685895515e024c7d07c0fdebaa9
>         # save the config file
>         mkdir build_dir && cp config build_dir/.config
>         COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=s390 olddefconfig
>         COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=s390 SHELL=/bin/bash kernel/kcsan/
> 
> If you fix the issue, kindly add following tag where applicable
> | Reported-by: kernel test robot <lkp@intel.com>
> 
> All errors (new ones prefixed by >>):
> 
> >> kernel/kcsan/core.c:1076:49: error: too many arguments to function call, expected 3, have 4
>            check_access(s, check_len, KCSAN_ACCESS_WRITE, _RET_IP_);
>            ~~~~~~~~~~~~                                   ^~~~~~~~
>    include/linux/kernel.h:57:19: note: expanded from macro '_RET_IP_'
>    #define _RET_IP_                (unsigned long)__builtin_return_address(0)
>                                    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>    kernel/kcsan/core.c:601:29: note: 'check_access' declared here
>    static __always_inline void check_access(const volatile void *ptr, size_t size,
>                                ^
>    kernel/kcsan/core.c:1090:51: error: too many arguments to function call, expected 3, have 4
>            check_access(dst, check_len, KCSAN_ACCESS_WRITE, _RET_IP_);
>            ~~~~~~~~~~~~                                     ^~~~~~~~
>    include/linux/kernel.h:57:19: note: expanded from macro '_RET_IP_'
>    #define _RET_IP_                (unsigned long)__builtin_return_address(0)
>                                    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>    kernel/kcsan/core.c:601:29: note: 'check_access' declared here
>    static __always_inline void check_access(const volatile void *ptr, size_t size,
>                                ^
>    kernel/kcsan/core.c:1091:34: error: too many arguments to function call, expected 3, have 4
>            check_access(src, check_len, 0, _RET_IP_);
>            ~~~~~~~~~~~~                    ^~~~~~~~
>    include/linux/kernel.h:57:19: note: expanded from macro '_RET_IP_'
>    #define _RET_IP_                (unsigned long)__builtin_return_address(0)
>                                    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>    kernel/kcsan/core.c:601:29: note: 'check_access' declared here
>    static __always_inline void check_access(const volatile void *ptr, size_t size,
>                                ^
>    kernel/kcsan/core.c:1105:51: error: too many arguments to function call, expected 3, have 4
>            check_access(dst, check_len, KCSAN_ACCESS_WRITE, _RET_IP_);
>            ~~~~~~~~~~~~                                     ^~~~~~~~
>    include/linux/kernel.h:57:19: note: expanded from macro '_RET_IP_'
>    #define _RET_IP_                (unsigned long)__builtin_return_address(0)
>                                    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>    kernel/kcsan/core.c:601:29: note: 'check_access' declared here
>    static __always_inline void check_access(const volatile void *ptr, size_t size,
>                                ^
>    kernel/kcsan/core.c:1106:34: error: too many arguments to function call, expected 3, have 4
>            check_access(src, check_len, 0, _RET_IP_);
>            ~~~~~~~~~~~~                    ^~~~~~~~
>    include/linux/kernel.h:57:19: note: expanded from macro '_RET_IP_'
>    #define _RET_IP_                (unsigned long)__builtin_return_address(0)
>                                    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>    kernel/kcsan/core.c:601:29: note: 'check_access' declared here
>    static __always_inline void check_access(const volatile void *ptr, size_t size,
>                                ^
>    5 errors generated.
> 
> 
> vim +1076 kernel/kcsan/core.c
> 
>   1065	
>   1066	#ifdef __HAVE_ARCH_MEMSET
>   1067	void *__tsan_memset(void *s, int c, size_t count);
>   1068	noinline void *__tsan_memset(void *s, int c, size_t count)
>   1069	{
>   1070		/*
>   1071		 * Instead of not setting up watchpoints where accessed size is greater
>   1072		 * than MAX_ENCODABLE_SIZE, truncate checked size to MAX_ENCODABLE_SIZE.
>   1073		 */
>   1074		size_t check_len = min_t(size_t, count, MAX_ENCODABLE_SIZE);
>   1075	
> > 1076		check_access(s, check_len, KCSAN_ACCESS_WRITE, _RET_IP_);
>   1077		return memset(s, c, count);
>   1078	}
>   1079	#else
>   1080	void *__tsan_memset(void *s, int c, size_t count) __alias(memset);
>   1081	#endif
>   1082	EXPORT_SYMBOL(__tsan_memset);
>   1083	

For 5.10 and 5.15 stable kernels we require a separate backport (see
attached), because check_access() was changed in commit 55a55fec5015b.

Thanks,
-- Marco

[-- Attachment #2: 0001-kcsan-Instrument-memcpy-memset-memmove-with-newer-Cl.patch --]
[-- Type: text/x-diff, Size: 3165 bytes --]

From 460f24b2b74f507d100d3f09ab81c7b089477bb3 Mon Sep 17 00:00:00 2001
From: Marco Elver <elver@google.com>
Date: Mon, 12 Sep 2022 11:45:40 +0200
Subject: [PATCH] kcsan: Instrument memcpy/memset/memmove with newer Clang

commit 7c201739beef1a586d806463f1465429cdce34c5 upstream.

With Clang version 16+, -fsanitize=thread will turn
memcpy/memset/memmove calls in instrumented functions into
__tsan_memcpy/__tsan_memset/__tsan_memmove calls respectively.

Add these functions to the core KCSAN runtime, so that we (a) catch data
races with mem* functions, and (b) won't run into linker errors with
such newer compilers.

[ elver@google.com: adjust check_access() call for v5.15 and earlier. ]

Cc: stable@vger.kernel.org # v5.10+
Signed-off-by: Marco Elver <elver@google.com>
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
---
 kernel/kcsan/core.c | 50 +++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 50 insertions(+)

diff --git a/kernel/kcsan/core.c b/kernel/kcsan/core.c
index 76e67d1e02d4..526510b3791e 100644
--- a/kernel/kcsan/core.c
+++ b/kernel/kcsan/core.c
@@ -14,10 +14,12 @@
 #include <linux/init.h>
 #include <linux/kernel.h>
 #include <linux/list.h>
+#include <linux/minmax.h>
 #include <linux/moduleparam.h>
 #include <linux/percpu.h>
 #include <linux/preempt.h>
 #include <linux/sched.h>
+#include <linux/string.h>
 #include <linux/uaccess.h>
 
 #include "encoding.h"
@@ -1060,3 +1062,51 @@ EXPORT_SYMBOL(__tsan_atomic_thread_fence);
 void __tsan_atomic_signal_fence(int memorder);
 void __tsan_atomic_signal_fence(int memorder) { }
 EXPORT_SYMBOL(__tsan_atomic_signal_fence);
+
+#ifdef __HAVE_ARCH_MEMSET
+void *__tsan_memset(void *s, int c, size_t count);
+noinline void *__tsan_memset(void *s, int c, size_t count)
+{
+	/*
+	 * Instead of not setting up watchpoints where accessed size is greater
+	 * than MAX_ENCODABLE_SIZE, truncate checked size to MAX_ENCODABLE_SIZE.
+	 */
+	size_t check_len = min_t(size_t, count, MAX_ENCODABLE_SIZE);
+
+	check_access(s, check_len, KCSAN_ACCESS_WRITE);
+	return memset(s, c, count);
+}
+#else
+void *__tsan_memset(void *s, int c, size_t count) __alias(memset);
+#endif
+EXPORT_SYMBOL(__tsan_memset);
+
+#ifdef __HAVE_ARCH_MEMMOVE
+void *__tsan_memmove(void *dst, const void *src, size_t len);
+noinline void *__tsan_memmove(void *dst, const void *src, size_t len)
+{
+	size_t check_len = min_t(size_t, len, MAX_ENCODABLE_SIZE);
+
+	check_access(dst, check_len, KCSAN_ACCESS_WRITE);
+	check_access(src, check_len, 0);
+	return memmove(dst, src, len);
+}
+#else
+void *__tsan_memmove(void *dst, const void *src, size_t len) __alias(memmove);
+#endif
+EXPORT_SYMBOL(__tsan_memmove);
+
+#ifdef __HAVE_ARCH_MEMCPY
+void *__tsan_memcpy(void *dst, const void *src, size_t len);
+noinline void *__tsan_memcpy(void *dst, const void *src, size_t len)
+{
+	size_t check_len = min_t(size_t, len, MAX_ENCODABLE_SIZE);
+
+	check_access(dst, check_len, KCSAN_ACCESS_WRITE);
+	check_access(src, check_len, 0);
+	return memcpy(dst, src, len);
+}
+#else
+void *__tsan_memcpy(void *dst, const void *src, size_t len) __alias(memcpy);
+#endif
+EXPORT_SYMBOL(__tsan_memcpy);
-- 
2.39.0.314.g84b9a713c41-goog


  reply	other threads:[~2023-01-02 20:15 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-01-02 18:44 [ammarfaizi2-block:stable/linux-stable-rc/queue/5.15 54/54] kernel/kcsan/core.c:1076:49: error: too many arguments to function call, expected 3, have 4 kernel test robot
2023-01-02 20:15 ` Marco Elver [this message]
2023-01-05 11:46   ` Greg Kroah-Hartman

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=Y7M7Xo7NJEy7Yucr@elver.google.com \
    --to=elver@google.com \
    --cc=ammarfaizi2@gnuweeb.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=gwml@vger.gnuweeb.org \
    --cc=lkp@intel.com \
    --cc=llvm@lists.linux.dev \
    --cc=oe-kbuild-all@lists.linux.dev \
    --cc=paulmck@kernel.org \
    --cc=sashal@kernel.org \
    /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.