From: Chuck Lever <chuck.lever@xxxxxxxxxx> $ make C=1 W=1 net/sunrpc/svc.o make[1]: Entering directory '/home/cel/src/linux/obj/manet.1015granger.net' GEN Makefile CALL /home/cel/src/linux/server-development/scripts/checksyscalls.sh DESCEND objtool INSTALL libsubcmd_headers DESCEND bpf/resolve_btfids INSTALL libsubcmd_headers CC [M] net/sunrpc/svc.o CHECK /home/cel/src/linux/server-development/net/sunrpc/svc.c /home/cel/src/linux/server-development/net/sunrpc/svc.c:1225:9: warning: incorrect type in argument 1 (different address spaces) /home/cel/src/linux/server-development/net/sunrpc/svc.c:1225:9: expected struct spinlock [usertype] *lock /home/cel/src/linux/server-development/net/sunrpc/svc.c:1225:9: got struct spinlock [noderef] __rcu * /home/cel/src/linux/server-development/net/sunrpc/svc.c:1227:40: warning: incorrect type in argument 1 (different address spaces) /home/cel/src/linux/server-development/net/sunrpc/svc.c:1227:40: expected struct spinlock [usertype] *lock /home/cel/src/linux/server-development/net/sunrpc/svc.c:1227:40: got struct spinlock [noderef] __rcu * make[1]: Leaving directory '/home/cel/src/linux/obj/manet.1015granger.net' Warning introduced by commit 913292c97d75 ("sched.h: Annotate sighand_struct with __rcu"). Signed-off-by: Chuck Lever <chuck.lever@xxxxxxxxxx> --- net/sunrpc/svc.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/net/sunrpc/svc.c b/net/sunrpc/svc.c index 79967b6925bd..174ebf2e36e1 100644 --- a/net/sunrpc/svc.c +++ b/net/sunrpc/svc.c @@ -1173,6 +1173,7 @@ static void __svc_unregister(struct net *net, const u32 program, const u32 versi */ static void svc_unregister(const struct svc_serv *serv, struct net *net) { + struct sighand_struct *sighand; struct svc_program *progp; unsigned long flags; unsigned int i; @@ -1189,9 +1190,12 @@ static void svc_unregister(const struct svc_serv *serv, struct net *net) } } - spin_lock_irqsave(¤t->sighand->siglock, flags); + rcu_read_lock(); + sighand = rcu_dereference(current->sighand); + spin_lock_irqsave(&sighand->siglock, flags); recalc_sigpending(); - spin_unlock_irqrestore(¤t->sighand->siglock, flags); + spin_unlock_irqrestore(&sighand->siglock, flags); + rcu_read_unlock(); } /*