[PATCH RFC] SUNRPC: Address sparse RCU warning in net/sunrpc/svc.c
From: Chuck Lever <cel@kernel.org>
Date: 2023-06-16 13:20:11
Subsystem:
kernel nfsd, sunrpc, and lockd servers, networking [general], nfs, sunrpc, and lockd clients, the rest · Maintainers:
Chuck Lever, Jeff Layton, "David S. Miller", Eric Dumazet, Jakub Kicinski, Paolo Abeni, Trond Myklebust, Anna Schumaker, Linus Torvalds
From: Chuck Lever <chuck.lever@oracle.com>
$ 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@oracle.com>
---
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();
}
/*