[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <CF7BAFD9-D698-4639-8AA0-EDF88166794F@remlab.net>
Date: Mon, 11 Aug 2025 23:57:35 +0900
From: Rémi Denis-Courmont <remi@...lab.net>
To: Eric Dumazet <edumazet@...gle.com>, "David S . Miller" <davem@...emloft.net>,
Jakub Kicinski <kuba@...nel.org>, Paolo Abeni <pabeni@...hat.com>
CC: Simon Horman <horms@...nel.org>, netdev@...r.kernel.org,
eric.dumazet@...il.com, Remi Denis-Courmont <courmisch@...il.com>
Subject: Re: [PATCH net-next] phonet: add __rcu annotations
Le 11 août 2025 23:52:52 GMT+09:00, Eric Dumazet <edumazet@...gle.com> a écrit :
>Removes following sparse errors.
>
>make C=2 net/phonet/socket.o net/phonet/af_phonet.o
> CHECK net/phonet/socket.c
>net/phonet/socket.c:619:14: error: incompatible types in comparison expression (different address spaces):
>net/phonet/socket.c:619:14: struct sock [noderef] __rcu *
>net/phonet/socket.c:619:14: struct sock *
>net/phonet/socket.c:642:17: error: incompatible types in comparison expression (different address spaces):
>net/phonet/socket.c:642:17: struct sock [noderef] __rcu *
>net/phonet/socket.c:642:17: struct sock *
>net/phonet/socket.c:658:17: error: incompatible types in comparison expression (different address spaces):
>net/phonet/socket.c:658:17: struct sock [noderef] __rcu *
>net/phonet/socket.c:658:17: struct sock *
>net/phonet/socket.c:677:25: error: incompatible types in comparison expression (different address spaces):
>net/phonet/socket.c:677:25: struct sock [noderef] __rcu *
>net/phonet/socket.c:677:25: struct sock *
>net/phonet/socket.c:726:21: warning: context imbalance in 'pn_res_seq_start' - wrong count at exit
>net/phonet/socket.c:741:13: warning: context imbalance in 'pn_res_seq_stop' - wrong count at exit
> CHECK net/phonet/af_phonet.c
>net/phonet/af_phonet.c:35:14: error: incompatible types in comparison expression (different address spaces):
>net/phonet/af_phonet.c:35:14: struct phonet_protocol const [noderef] __rcu *
>net/phonet/af_phonet.c:35:14: struct phonet_protocol const *
>net/phonet/af_phonet.c:474:17: error: incompatible types in comparison expression (different address spaces):
>net/phonet/af_phonet.c:474:17: struct phonet_protocol const [noderef] __rcu *
>net/phonet/af_phonet.c:474:17: struct phonet_protocol const *
>net/phonet/af_phonet.c:486:9: error: incompatible types in comparison expression (different address spaces):
>net/phonet/af_phonet.c:486:9: struct phonet_protocol const [noderef] __rcu *
>net/phonet/af_phonet.c:486:9: struct phonet_protocol const *
>
>Signed-off-by: Eric Dumazet <edumazet@...gle.com>
>Cc: Remi Denis-Courmont <courmisch@...il.com>
Acked-by: Rémi Denis-Courmont <courmisch@...il.com>
(We should probably replace that BUG_ON with a WARN_ON but that's a separate issue.)
>---
> net/phonet/af_phonet.c | 4 ++--
> net/phonet/socket.c | 23 ++++++++++++-----------
> 2 files changed, 14 insertions(+), 13 deletions(-)
>
>diff --git a/net/phonet/af_phonet.c b/net/phonet/af_phonet.c
>index a27efa4faa4ef46e64efe6744790c47ec34147ac..238a9638d2b0f6a23070b0871515302d8cba864f 100644
>--- a/net/phonet/af_phonet.c
>+++ b/net/phonet/af_phonet.c
>@@ -22,7 +22,7 @@
> #include <net/phonet/pn_dev.h>
>
> /* Transport protocol registration */
>-static const struct phonet_protocol *proto_tab[PHONET_NPROTO] __read_mostly;
>+static const struct phonet_protocol __rcu *proto_tab[PHONET_NPROTO] __read_mostly;
>
> static const struct phonet_protocol *phonet_proto_get(unsigned int protocol)
> {
>@@ -482,7 +482,7 @@ void phonet_proto_unregister(unsigned int protocol,
> const struct phonet_protocol *pp)
> {
> mutex_lock(&proto_tab_lock);
>- BUG_ON(proto_tab[protocol] != pp);
>+ BUG_ON(rcu_access_pointer(proto_tab[protocol]) != pp);
> RCU_INIT_POINTER(proto_tab[protocol], NULL);
> mutex_unlock(&proto_tab_lock);
> synchronize_rcu();
>diff --git a/net/phonet/socket.c b/net/phonet/socket.c
>index ea4d5e6533dba737f77bedbba1b1ef2ec3c17568..2b61a40b568e91e340130a9b589e2b7a9346643f 100644
>--- a/net/phonet/socket.c
>+++ b/net/phonet/socket.c
>@@ -602,7 +602,7 @@ const struct seq_operations pn_sock_seq_ops = {
> #endif
>
> static struct {
>- struct sock *sk[256];
>+ struct sock __rcu *sk[256];
> } pnres;
>
> /*
>@@ -654,7 +654,7 @@ int pn_sock_unbind_res(struct sock *sk, u8 res)
> return -EPERM;
>
> mutex_lock(&resource_mutex);
>- if (pnres.sk[res] == sk) {
>+ if (rcu_access_pointer(pnres.sk[res]) == sk) {
> RCU_INIT_POINTER(pnres.sk[res], NULL);
> ret = 0;
> }
>@@ -673,7 +673,7 @@ void pn_sock_unbind_all_res(struct sock *sk)
>
> mutex_lock(&resource_mutex);
> for (res = 0; res < 256; res++) {
>- if (pnres.sk[res] == sk) {
>+ if (rcu_access_pointer(pnres.sk[res]) == sk) {
> RCU_INIT_POINTER(pnres.sk[res], NULL);
> match++;
> }
>@@ -688,7 +688,7 @@ void pn_sock_unbind_all_res(struct sock *sk)
> }
>
> #ifdef CONFIG_PROC_FS
>-static struct sock **pn_res_get_idx(struct seq_file *seq, loff_t pos)
>+static struct sock __rcu **pn_res_get_idx(struct seq_file *seq, loff_t pos)
> {
> struct net *net = seq_file_net(seq);
> unsigned int i;
>@@ -697,7 +697,7 @@ static struct sock **pn_res_get_idx(struct seq_file *seq, loff_t pos)
> return NULL;
>
> for (i = 0; i < 256; i++) {
>- if (pnres.sk[i] == NULL)
>+ if (rcu_access_pointer(pnres.sk[i]) == NULL)
> continue;
> if (!pos)
> return pnres.sk + i;
>@@ -706,7 +706,7 @@ static struct sock **pn_res_get_idx(struct seq_file *seq, loff_t pos)
> return NULL;
> }
>
>-static struct sock **pn_res_get_next(struct seq_file *seq, struct sock **sk)
>+static struct sock __rcu **pn_res_get_next(struct seq_file *seq, struct sock __rcu **sk)
> {
> struct net *net = seq_file_net(seq);
> unsigned int i;
>@@ -728,7 +728,7 @@ static void *pn_res_seq_start(struct seq_file *seq, loff_t *pos)
>
> static void *pn_res_seq_next(struct seq_file *seq, void *v, loff_t *pos)
> {
>- struct sock **sk;
>+ struct sock __rcu **sk;
>
> if (v == SEQ_START_TOKEN)
> sk = pn_res_get_idx(seq, 0);
>@@ -747,11 +747,12 @@ static void pn_res_seq_stop(struct seq_file *seq, void *v)
> static int pn_res_seq_show(struct seq_file *seq, void *v)
> {
> seq_setwidth(seq, 63);
>- if (v == SEQ_START_TOKEN)
>+ if (v == SEQ_START_TOKEN) {
> seq_puts(seq, "rs uid inode");
>- else {
>- struct sock **psk = v;
>- struct sock *sk = *psk;
>+ } else {
>+ struct sock __rcu **psk = v;
>+ struct sock *sk = rcu_dereference_protected(*psk,
>+ lockdep_is_held(&resource_mutex));
>
> seq_printf(seq, "%02X %5u %lu",
> (int) (psk - pnres.sk),
Powered by blists - more mailing lists