2020-08-06 19:43:22

by Luc Van Oostenryck

[permalink] [raw]
Subject: [RESEND PATCH] sparse: use static inline for __chk_{user,io}_ptr()

__chk_user_ptr() & __chk_io_ptr() are dummy extern functions which
only exist to enforce the typechecking of __user or __iomem pointers
in macros when using sparse.

This typechecking is done by inserting a call to these functions.
But the presence of these calls can inhibit some simplifications
and so influence the result of sparse's analysis of context/locking.

Fix this by changing these calls into static inline calls with
an empty body.

Signed-off-by: Luc Van Oostenryck <[email protected]>
---
include/linux/compiler_types.h | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/include/linux/compiler_types.h b/include/linux/compiler_types.h
index b67930216e45..a9b6699f3934 100644
--- a/include/linux/compiler_types.h
+++ b/include/linux/compiler_types.h
@@ -11,8 +11,8 @@
# define __iomem __attribute__((noderef, address_space(__iomem)))
# define __percpu __attribute__((noderef, address_space(__percpu)))
# define __rcu __attribute__((noderef, address_space(__rcu)))
-extern void __chk_user_ptr(const volatile void __user *);
-extern void __chk_io_ptr(const volatile void __iomem *);
+static inline void __chk_user_ptr(const volatile void __user *ptr) { }
+static inline void __chk_io_ptr(const volatile void __iomem *ptr) { }
/* context/locking */
# define __must_hold(x) __attribute__((context(x,1,1)))
# define __acquires(x) __attribute__((context(x,0,1)))
--
2.28.0


2020-08-06 22:40:59

by kernel test robot

[permalink] [raw]
Subject: Re: [RESEND PATCH] sparse: use static inline for __chk_{user,io}_ptr()

Hi Luc,

I love your patch! Perhaps something to improve:

[auto build test WARNING on hnaz-linux-mm/master]
[also build test WARNING on next-20200806]
[cannot apply to linux/master linus/master v5.8]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url: https://github.com/0day-ci/linux/commits/Luc-Van-Oostenryck/sparse-use-static-inline-for-__chk_-user-io-_ptr/20200807-034410
base: https://github.com/hnaz/linux-mm master
config: x86_64-randconfig-s022-20200805 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-15) 9.3.0
reproduce:
# apt-get install sparse
# sparse version: v0.6.2-117-g8c7aee71-dirty
# save the attached .config to linux build tree
make W=1 C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' ARCH=x86_64

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <[email protected]>


sparse warnings: (new ones prefixed by >>)

arch/x86/ia32/ia32_signal.c:350:9: sparse: sparse: cast removes address space '__user' of expression
>> arch/x86/ia32/ia32_signal.c:350:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void const volatile [noderef] __user *ptr @@ got unsigned long long [usertype] * @@
>> arch/x86/ia32/ia32_signal.c:350:9: sparse: expected void const volatile [noderef] __user *ptr
arch/x86/ia32/ia32_signal.c:350:9: sparse: got unsigned long long [usertype] *
arch/x86/ia32/ia32_signal.c:350:9: sparse: sparse: cast removes address space '__user' of expression
arch/x86/ia32/ia32_signal.c:350:9: sparse: sparse: cast removes address space '__user' of expression
arch/x86/ia32/ia32_signal.c:350:9: sparse: sparse: cast removes address space '__user' of expression
arch/x86/ia32/ia32_signal.c:350:9: sparse: sparse: cast removes address space '__user' of expression
arch/x86/ia32/ia32_signal.c:350:9: sparse: sparse: cast removes address space '__user' of expression
arch/x86/ia32/ia32_signal.c:350:9: sparse: sparse: cast removes address space '__user' of expression
arch/x86/ia32/ia32_signal.c:350:9: sparse: sparse: cast removes address space '__user' of expression
arch/x86/ia32/ia32_signal.c:350:9: sparse: sparse: cast removes address space '__user' of expression
arch/x86/ia32/ia32_signal.c:350:9: sparse: sparse: cast removes address space '__user' of expression

vim +350 arch/x86/ia32/ia32_signal.c

^1da177e4c3f41 arch/x86_64/ia32/ia32_signal.c Linus Torvalds 2005-04-16 299
235b80226b986d arch/x86/ia32/ia32_signal.c Al Viro 2012-11-09 300 int ia32_setup_rt_frame(int sig, struct ksignal *ksig,
^1da177e4c3f41 arch/x86_64/ia32/ia32_signal.c Linus Torvalds 2005-04-16 301 compat_sigset_t *set, struct pt_regs *regs)
^1da177e4c3f41 arch/x86_64/ia32/ia32_signal.c Linus Torvalds 2005-04-16 302 {
3b0d29ee1c73b6 arch/x86/ia32/ia32_signal.c Hiroshi Shimamoto 2008-12-17 303 struct rt_sigframe_ia32 __user *frame;
af65d64845a90c arch/x86/ia32/ia32_signal.c Roland McGrath 2008-01-30 304 void __user *restorer;
44a1d996325982 arch/x86/ia32/ia32_signal.c Al Viro 2020-02-15 305 void __user *fp = NULL;
^1da177e4c3f41 arch/x86_64/ia32/ia32_signal.c Linus Torvalds 2005-04-16 306
57d563c8292569 arch/x86/ia32/ia32_signal.c Al Viro 2020-02-15 307 /* unsafe_put_user optimizes that into a single 8 byte store */
99b9cdf758af70 arch/x86/ia32/ia32_signal.c Thomas Gleixner 2008-01-30 308 static const struct {
99b9cdf758af70 arch/x86/ia32/ia32_signal.c Thomas Gleixner 2008-01-30 309 u8 movl;
99b9cdf758af70 arch/x86/ia32/ia32_signal.c Thomas Gleixner 2008-01-30 310 u32 val;
99b9cdf758af70 arch/x86/ia32/ia32_signal.c Thomas Gleixner 2008-01-30 311 u16 int80;
9cc3c49ed1b1db arch/x86/ia32/ia32_signal.c Hiroshi Shimamoto 2008-11-11 312 u8 pad;
99b9cdf758af70 arch/x86/ia32/ia32_signal.c Thomas Gleixner 2008-01-30 313 } __attribute__((packed)) code = {
99b9cdf758af70 arch/x86/ia32/ia32_signal.c Thomas Gleixner 2008-01-30 314 0xb8,
99b9cdf758af70 arch/x86/ia32/ia32_signal.c Thomas Gleixner 2008-01-30 315 __NR_ia32_rt_sigreturn,
99b9cdf758af70 arch/x86/ia32/ia32_signal.c Thomas Gleixner 2008-01-30 316 0x80cd,
99b9cdf758af70 arch/x86/ia32/ia32_signal.c Thomas Gleixner 2008-01-30 317 0,
99b9cdf758af70 arch/x86/ia32/ia32_signal.c Thomas Gleixner 2008-01-30 318 };
99b9cdf758af70 arch/x86/ia32/ia32_signal.c Thomas Gleixner 2008-01-30 319
44a1d996325982 arch/x86/ia32/ia32_signal.c Al Viro 2020-02-15 320 frame = get_sigframe(ksig, regs, sizeof(*frame), &fp);
^1da177e4c3f41 arch/x86_64/ia32/ia32_signal.c Linus Torvalds 2005-04-16 321
39f16c1c0f14e9 arch/x86/ia32/ia32_signal.c Al Viro 2020-02-15 322 if (!user_access_begin(frame, sizeof(*frame)))
3d0aedd9538e6b arch/x86/ia32/ia32_signal.c Hiroshi Shimamoto 2008-09-12 323 return -EFAULT;
^1da177e4c3f41 arch/x86_64/ia32/ia32_signal.c Linus Torvalds 2005-04-16 324
39f16c1c0f14e9 arch/x86/ia32/ia32_signal.c Al Viro 2020-02-15 325 unsafe_put_user(sig, &frame->sig, Efault);
39f16c1c0f14e9 arch/x86/ia32/ia32_signal.c Al Viro 2020-02-15 326 unsafe_put_user(ptr_to_compat(&frame->info), &frame->pinfo, Efault);
39f16c1c0f14e9 arch/x86/ia32/ia32_signal.c Al Viro 2020-02-15 327 unsafe_put_user(ptr_to_compat(&frame->uc), &frame->puc, Efault);
^1da177e4c3f41 arch/x86_64/ia32/ia32_signal.c Linus Torvalds 2005-04-16 328
^1da177e4c3f41 arch/x86_64/ia32/ia32_signal.c Linus Torvalds 2005-04-16 329 /* Create the ucontext. */
ff661350157266 arch/x86/ia32/ia32_signal.c Marco Elver 2019-07-11 330 if (static_cpu_has(X86_FEATURE_XSAVE))
39f16c1c0f14e9 arch/x86/ia32/ia32_signal.c Al Viro 2020-02-15 331 unsafe_put_user(UC_FP_XSTATE, &frame->uc.uc_flags, Efault);
c37b5efea43f9e arch/x86/ia32/ia32_signal.c Suresh Siddha 2008-07-29 332 else
39f16c1c0f14e9 arch/x86/ia32/ia32_signal.c Al Viro 2020-02-15 333 unsafe_put_user(0, &frame->uc.uc_flags, Efault);
39f16c1c0f14e9 arch/x86/ia32/ia32_signal.c Al Viro 2020-02-15 334 unsafe_put_user(0, &frame->uc.uc_link, Efault);
39f16c1c0f14e9 arch/x86/ia32/ia32_signal.c Al Viro 2020-02-15 335 unsafe_compat_save_altstack(&frame->uc.uc_stack, regs->sp, Efault);
^1da177e4c3f41 arch/x86_64/ia32/ia32_signal.c Linus Torvalds 2005-04-16 336
235b80226b986d arch/x86/ia32/ia32_signal.c Al Viro 2012-11-09 337 if (ksig->ka.sa.sa_flags & SA_RESTORER)
235b80226b986d arch/x86/ia32/ia32_signal.c Al Viro 2012-11-09 338 restorer = ksig->ka.sa.sa_restorer;
af65d64845a90c arch/x86/ia32/ia32_signal.c Roland McGrath 2008-01-30 339 else
6f121e548f8367 arch/x86/ia32/ia32_signal.c Andy Lutomirski 2014-05-05 340 restorer = current->mm->context.vdso +
0a6d1fa0d2b48f arch/x86/ia32/ia32_signal.c Andy Lutomirski 2015-10-05 341 vdso_image_32.sym___kernel_rt_sigreturn;
39f16c1c0f14e9 arch/x86/ia32/ia32_signal.c Al Viro 2020-02-15 342 unsafe_put_user(ptr_to_compat(restorer), &frame->pretcode, Efault);
^1da177e4c3f41 arch/x86_64/ia32/ia32_signal.c Linus Torvalds 2005-04-16 343
99b9cdf758af70 arch/x86/ia32/ia32_signal.c Thomas Gleixner 2008-01-30 344 /*
99b9cdf758af70 arch/x86/ia32/ia32_signal.c Thomas Gleixner 2008-01-30 345 * Not actually used anymore, but left because some gdb
99b9cdf758af70 arch/x86/ia32/ia32_signal.c Thomas Gleixner 2008-01-30 346 * versions need it.
99b9cdf758af70 arch/x86/ia32/ia32_signal.c Thomas Gleixner 2008-01-30 347 */
39f16c1c0f14e9 arch/x86/ia32/ia32_signal.c Al Viro 2020-02-15 348 unsafe_put_user(*((u64 *)&code), (u64 __user *)frame->retcode, Efault);
44a1d996325982 arch/x86/ia32/ia32_signal.c Al Viro 2020-02-15 349 unsafe_put_sigcontext32(&frame->uc.uc_mcontext, fp, regs, set, Efault);
57d563c8292569 arch/x86/ia32/ia32_signal.c Al Viro 2020-02-15 @350 unsafe_put_user(*(__u64 *)set, (__u64 *)&frame->uc.uc_sigmask, Efault);

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/[email protected]


Attachments:
(No filename) (8.34 kB)
.config.gz (32.32 kB)
Download all attachments

2020-08-07 01:13:44

by kernel test robot

[permalink] [raw]
Subject: Re: [RESEND PATCH] sparse: use static inline for __chk_{user,io}_ptr()

Hi Luc,

I love your patch! Perhaps something to improve:

[auto build test WARNING on hnaz-linux-mm/master]
[also build test WARNING on next-20200806]
[cannot apply to linux/master linus/master v5.8]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url: https://github.com/0day-ci/linux/commits/Luc-Van-Oostenryck/sparse-use-static-inline-for-__chk_-user-io-_ptr/20200807-034410
base: https://github.com/hnaz/linux-mm master
config: x86_64-randconfig-s021-20200805 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-15) 9.3.0
reproduce:
# apt-get install sparse
# sparse version: v0.6.2-117-g8c7aee71-dirty
# save the attached .config to linux build tree
make W=1 C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' ARCH=x86_64

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <[email protected]>


sparse warnings: (new ones prefixed by >>)

>> drivers/watchdog/sbc_fitpc2_wdt.c:99:21: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void const volatile [noderef] __user *ptr @@ got char const * @@
>> drivers/watchdog/sbc_fitpc2_wdt.c:99:21: sparse: expected void const volatile [noderef] __user *ptr
drivers/watchdog/sbc_fitpc2_wdt.c:99:21: sparse: got char const *
drivers/watchdog/sbc_fitpc2_wdt.c:128:37: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void [noderef] __user *to @@ got struct watchdog_info * @@
drivers/watchdog/sbc_fitpc2_wdt.c:128:37: sparse: expected void [noderef] __user *to
drivers/watchdog/sbc_fitpc2_wdt.c:128:37: sparse: got struct watchdog_info *
>> drivers/watchdog/sbc_fitpc2_wdt.c:133:23: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void const volatile [noderef] __user *ptr @@ got int * @@
drivers/watchdog/sbc_fitpc2_wdt.c:133:23: sparse: expected void const volatile [noderef] __user *ptr
drivers/watchdog/sbc_fitpc2_wdt.c:133:23: sparse: got int *
drivers/watchdog/sbc_fitpc2_wdt.c:137:23: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void const volatile [noderef] __user *ptr @@ got int * @@
drivers/watchdog/sbc_fitpc2_wdt.c:137:23: sparse: expected void const volatile [noderef] __user *ptr
drivers/watchdog/sbc_fitpc2_wdt.c:137:23: sparse: got int *
drivers/watchdog/sbc_fitpc2_wdt.c:146:23: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void const volatile [noderef] __user *ptr @@ got int * @@
drivers/watchdog/sbc_fitpc2_wdt.c:146:23: sparse: expected void const volatile [noderef] __user *ptr
drivers/watchdog/sbc_fitpc2_wdt.c:146:23: sparse: got int *
drivers/watchdog/sbc_fitpc2_wdt.c:160:23: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void const volatile [noderef] __user *ptr @@ got int * @@
drivers/watchdog/sbc_fitpc2_wdt.c:160:23: sparse: expected void const volatile [noderef] __user *ptr
drivers/watchdog/sbc_fitpc2_wdt.c:160:23: sparse: got int *
drivers/watchdog/sbc_fitpc2_wdt.c:187:27: sparse: sparse: incorrect type in initializer (incompatible argument 2 (different address spaces)) @@ expected long ( *write )( ... ) @@ got long ( * )( ... ) @@
drivers/watchdog/sbc_fitpc2_wdt.c:187:27: sparse: expected long ( *write )( ... )
drivers/watchdog/sbc_fitpc2_wdt.c:187:27: sparse: got long ( * )( ... )

vim +99 drivers/watchdog/sbc_fitpc2_wdt.c

3a5f90002e9d08 Denis Turischev 2009-07-21 80
3a5f90002e9d08 Denis Turischev 2009-07-21 81 static ssize_t fitpc2_wdt_write(struct file *file, const char *data,
3a5f90002e9d08 Denis Turischev 2009-07-21 82 size_t len, loff_t *ppos)
3a5f90002e9d08 Denis Turischev 2009-07-21 83 {
3a5f90002e9d08 Denis Turischev 2009-07-21 84 size_t i;
3a5f90002e9d08 Denis Turischev 2009-07-21 85
3a5f90002e9d08 Denis Turischev 2009-07-21 86 if (!len)
3a5f90002e9d08 Denis Turischev 2009-07-21 87 return 0;
3a5f90002e9d08 Denis Turischev 2009-07-21 88
3a5f90002e9d08 Denis Turischev 2009-07-21 89 if (nowayout) {
3a5f90002e9d08 Denis Turischev 2009-07-21 90 len = 0;
3a5f90002e9d08 Denis Turischev 2009-07-21 91 goto out;
3a5f90002e9d08 Denis Turischev 2009-07-21 92 }
3a5f90002e9d08 Denis Turischev 2009-07-21 93
3a5f90002e9d08 Denis Turischev 2009-07-21 94 clear_bit(WDT_OK_TO_CLOSE, &wdt_status);
3a5f90002e9d08 Denis Turischev 2009-07-21 95
3a5f90002e9d08 Denis Turischev 2009-07-21 96 for (i = 0; i != len; i++) {
3a5f90002e9d08 Denis Turischev 2009-07-21 97 char c;
3a5f90002e9d08 Denis Turischev 2009-07-21 98
3a5f90002e9d08 Denis Turischev 2009-07-21 @99 if (get_user(c, data + i))
3a5f90002e9d08 Denis Turischev 2009-07-21 100 return -EFAULT;
3a5f90002e9d08 Denis Turischev 2009-07-21 101
3a5f90002e9d08 Denis Turischev 2009-07-21 102 if (c == 'V')
3a5f90002e9d08 Denis Turischev 2009-07-21 103 set_bit(WDT_OK_TO_CLOSE, &wdt_status);
3a5f90002e9d08 Denis Turischev 2009-07-21 104 }
3a5f90002e9d08 Denis Turischev 2009-07-21 105
3a5f90002e9d08 Denis Turischev 2009-07-21 106 out:
3a5f90002e9d08 Denis Turischev 2009-07-21 107 wdt_enable();
3a5f90002e9d08 Denis Turischev 2009-07-21 108
3a5f90002e9d08 Denis Turischev 2009-07-21 109 return len;
3a5f90002e9d08 Denis Turischev 2009-07-21 110 }
3a5f90002e9d08 Denis Turischev 2009-07-21 111
3a5f90002e9d08 Denis Turischev 2009-07-21 112
42747d712de56c Wim Van Sebroeck 2009-12-26 113 static const struct watchdog_info ident = {
3a5f90002e9d08 Denis Turischev 2009-07-21 114 .options = WDIOF_MAGICCLOSE | WDIOF_SETTIMEOUT |
3a5f90002e9d08 Denis Turischev 2009-07-21 115 WDIOF_KEEPALIVEPING,
3a5f90002e9d08 Denis Turischev 2009-07-21 116 .identity = WATCHDOG_NAME,
3a5f90002e9d08 Denis Turischev 2009-07-21 117 };
3a5f90002e9d08 Denis Turischev 2009-07-21 118
3a5f90002e9d08 Denis Turischev 2009-07-21 119
3a5f90002e9d08 Denis Turischev 2009-07-21 120 static long fitpc2_wdt_ioctl(struct file *file, unsigned int cmd,
3a5f90002e9d08 Denis Turischev 2009-07-21 121 unsigned long arg)
3a5f90002e9d08 Denis Turischev 2009-07-21 122 {
3a5f90002e9d08 Denis Turischev 2009-07-21 123 int ret = -ENOTTY;
3a5f90002e9d08 Denis Turischev 2009-07-21 124 int time;
3a5f90002e9d08 Denis Turischev 2009-07-21 125
3a5f90002e9d08 Denis Turischev 2009-07-21 126 switch (cmd) {
3a5f90002e9d08 Denis Turischev 2009-07-21 127 case WDIOC_GETSUPPORT:
3a5f90002e9d08 Denis Turischev 2009-07-21 128 ret = copy_to_user((struct watchdog_info *)arg, &ident,
3a5f90002e9d08 Denis Turischev 2009-07-21 129 sizeof(ident)) ? -EFAULT : 0;
3a5f90002e9d08 Denis Turischev 2009-07-21 130 break;
3a5f90002e9d08 Denis Turischev 2009-07-21 131
3a5f90002e9d08 Denis Turischev 2009-07-21 132 case WDIOC_GETSTATUS:
3a5f90002e9d08 Denis Turischev 2009-07-21 @133 ret = put_user(0, (int *)arg);
3a5f90002e9d08 Denis Turischev 2009-07-21 134 break;
3a5f90002e9d08 Denis Turischev 2009-07-21 135
3a5f90002e9d08 Denis Turischev 2009-07-21 136 case WDIOC_GETBOOTSTATUS:
3a5f90002e9d08 Denis Turischev 2009-07-21 137 ret = put_user(0, (int *)arg);
3a5f90002e9d08 Denis Turischev 2009-07-21 138 break;
3a5f90002e9d08 Denis Turischev 2009-07-21 139
3a5f90002e9d08 Denis Turischev 2009-07-21 140 case WDIOC_KEEPALIVE:
3a5f90002e9d08 Denis Turischev 2009-07-21 141 wdt_enable();
3a5f90002e9d08 Denis Turischev 2009-07-21 142 ret = 0;
3a5f90002e9d08 Denis Turischev 2009-07-21 143 break;
3a5f90002e9d08 Denis Turischev 2009-07-21 144
3a5f90002e9d08 Denis Turischev 2009-07-21 145 case WDIOC_SETTIMEOUT:
3a5f90002e9d08 Denis Turischev 2009-07-21 146 ret = get_user(time, (int *)arg);
3a5f90002e9d08 Denis Turischev 2009-07-21 147 if (ret)
3a5f90002e9d08 Denis Turischev 2009-07-21 148 break;
3a5f90002e9d08 Denis Turischev 2009-07-21 149
3a5f90002e9d08 Denis Turischev 2009-07-21 150 if (time < 31 || time > 255) {
3a5f90002e9d08 Denis Turischev 2009-07-21 151 ret = -EINVAL;
3a5f90002e9d08 Denis Turischev 2009-07-21 152 break;
3a5f90002e9d08 Denis Turischev 2009-07-21 153 }
3a5f90002e9d08 Denis Turischev 2009-07-21 154
3a5f90002e9d08 Denis Turischev 2009-07-21 155 margin = time;
3a5f90002e9d08 Denis Turischev 2009-07-21 156 wdt_enable();
3a5f90002e9d08 Denis Turischev 2009-07-21 157 /* Fall through */
3a5f90002e9d08 Denis Turischev 2009-07-21 158
3a5f90002e9d08 Denis Turischev 2009-07-21 159 case WDIOC_GETTIMEOUT:
3a5f90002e9d08 Denis Turischev 2009-07-21 160 ret = put_user(margin, (int *)arg);
3a5f90002e9d08 Denis Turischev 2009-07-21 161 break;
3a5f90002e9d08 Denis Turischev 2009-07-21 162 }
3a5f90002e9d08 Denis Turischev 2009-07-21 163
3a5f90002e9d08 Denis Turischev 2009-07-21 164 return ret;
3a5f90002e9d08 Denis Turischev 2009-07-21 165 }
3a5f90002e9d08 Denis Turischev 2009-07-21 166

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/[email protected]


Attachments:
(No filename) (9.34 kB)
.config.gz (36.01 kB)
Download all attachments