netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH net-next] phonet: add __rcu annotations
@ 2025-08-11 14:52 Eric Dumazet
  2025-08-11 14:57 ` Rémi Denis-Courmont
  2025-08-12 21:20 ` patchwork-bot+netdevbpf
  0 siblings, 2 replies; 3+ messages in thread
From: Eric Dumazet @ 2025-08-11 14:52 UTC (permalink / raw)
  To: David S . Miller, Jakub Kicinski, Paolo Abeni
  Cc: Simon Horman, netdev, eric.dumazet, Eric Dumazet,
	Remi Denis-Courmont

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@google.com>
Cc: Remi Denis-Courmont <courmisch@gmail.com>
---
 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),
-- 
2.50.1.703.g449372360f-goog


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH net-next] phonet: add __rcu annotations
  2025-08-11 14:52 [PATCH net-next] phonet: add __rcu annotations Eric Dumazet
@ 2025-08-11 14:57 ` Rémi Denis-Courmont
  2025-08-12 21:20 ` patchwork-bot+netdevbpf
  1 sibling, 0 replies; 3+ messages in thread
From: Rémi Denis-Courmont @ 2025-08-11 14:57 UTC (permalink / raw)
  To: Eric Dumazet, David S . Miller, Jakub Kicinski, Paolo Abeni
  Cc: Simon Horman, netdev, eric.dumazet, Remi Denis-Courmont



Le 11 août 2025 23:52:52 GMT+09:00, Eric Dumazet <edumazet@google.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@google.com>
>Cc: Remi Denis-Courmont <courmisch@gmail.com>


Acked-by: Rémi Denis-Courmont <courmisch@gmail.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),

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH net-next] phonet: add __rcu annotations
  2025-08-11 14:52 [PATCH net-next] phonet: add __rcu annotations Eric Dumazet
  2025-08-11 14:57 ` Rémi Denis-Courmont
@ 2025-08-12 21:20 ` patchwork-bot+netdevbpf
  1 sibling, 0 replies; 3+ messages in thread
From: patchwork-bot+netdevbpf @ 2025-08-12 21:20 UTC (permalink / raw)
  To: Eric Dumazet; +Cc: davem, kuba, pabeni, horms, netdev, eric.dumazet, courmisch

Hello:

This patch was applied to netdev/net-next.git (main)
by Jakub Kicinski <kuba@kernel.org>:

On Mon, 11 Aug 2025 14:52:52 +0000 you wrote:
> 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 *
> 
> [...]

Here is the summary with links:
  - [net-next] phonet: add __rcu annotations
    https://git.kernel.org/netdev/net-next/c/86e3d52bd3e9

You are awesome, thank you!
-- 
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html



^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2025-08-12 21:20 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-08-11 14:52 [PATCH net-next] phonet: add __rcu annotations Eric Dumazet
2025-08-11 14:57 ` Rémi Denis-Courmont
2025-08-12 21:20 ` patchwork-bot+netdevbpf

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).