On Wed, Aug 19, 2020 at 10:06:55PM +0200, Luc Van Oostenryck wrote: > On Wed, Aug 19, 2020 at 12:15:46PM -0700, Randy Dunlap wrote: > > On Linux kernel tree v5.9-rc1, with sparse v0.6.2-180-g49f7e13a, > > I see this sparse warning which I don't grok: > > > > ../include/uapi/asm-generic/signal-defs.h:19:29: CK: error: multiple address spaces given > > > > for this source code: > > > > typedef void __signalfn_t(int); > > typedef __signalfn_t __user *__sighandler_t; <<<<< line 19 > > > > Are there multiple address spaces there? What are they? > > > > > > > > or: is the warning related to the other nearby warnings? (e.g.:) > > > > ../kernel/signal.c:541:53: CK: warning: incorrect type in initializer (different address spaces) > > ../kernel/signal.c:541:53: CK: expected struct k_sigaction *ka > > ../kernel/signal.c:541:53: CK: got struct k_sigaction [noderef] __rcu * > > ../include/uapi/asm-generic/signal-defs.h:19:29: CK: error: multiple address spaces given > > ../kernel/signal.c:694:33: CK: warning: incorrect type in argument 1 (different address spaces) > > ../kernel/signal.c:694:33: CK: expected struct spinlock [usertype] *lock > > ../kernel/signal.c:694:33: CK: got struct spinlock [noderef] __rcu * > > I would guess that this __sighandler_t is used somewhere in a > struct which is itself accessed via a __rcu pointer. > But that would not explain the level of dereference. > > I'll need to check this one. The location of the warning should be the assignment in kernel/signal.c:69 static void __user *sig_handler(struct task_struct *t, int sig) { return t->sighand->action[sig - 1].sa.sa_handler; } There is a lot of type abuses in this file, between 'void __user *' and __sighandler_t, but the root cause of the warning is the '__rcu' in struct task_struct { ... struct sighand_struct __rcu *sighand; ... } Best regards, -- Luc