netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 net 0/3] net: fix mcast RCU splats
@ 2024-11-24 15:40 Paolo Abeni
  2024-11-24 15:40 ` [PATCH v2 net 1/3] ipmr: add debug check for mr table cleanup Paolo Abeni
                   ` (3 more replies)
  0 siblings, 4 replies; 8+ messages in thread
From: Paolo Abeni @ 2024-11-24 15:40 UTC (permalink / raw)
  To: netdev
  Cc: Eric Dumazet, David S. Miller, Jakub Kicinski, Simon Horman,
	stefan.wiehler, David Ahern

This series addresses the RCU splat triggered by the forwarding
mroute tests.

The first patch does not address any specific issue, but makes the
following ones more clear. Patch 2 and 3 address the issue for ipv6 and
ipv4 respectively.

---
v1 -> v2:
 - fix build issues in patch 1/3

Paolo Abeni (3):
  ipmr: add debug check for mr table cleanup
  ip6mr: fix tables suspicious RCU usage
  ipmr: fix tables suspicious RCU usage

 net/ipv4/ipmr.c  | 56 +++++++++++++++++++++++++++++++++++++-----------
 net/ipv6/ip6mr.c | 52 ++++++++++++++++++++++++++++++++++----------
 2 files changed, 84 insertions(+), 24 deletions(-)

-- 
2.45.2


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

* [PATCH v2 net 1/3] ipmr: add debug check for mr table cleanup
  2024-11-24 15:40 [PATCH v2 net 0/3] net: fix mcast RCU splats Paolo Abeni
@ 2024-11-24 15:40 ` Paolo Abeni
  2024-11-26 15:34   ` David Ahern
  2024-11-24 15:40 ` [PATCH v2 net 2/3] ip6mr: fix tables suspicious RCU usage Paolo Abeni
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 8+ messages in thread
From: Paolo Abeni @ 2024-11-24 15:40 UTC (permalink / raw)
  To: netdev
  Cc: Eric Dumazet, David S. Miller, Jakub Kicinski, Simon Horman,
	stefan.wiehler, David Ahern

The multicast route tables lifecycle, for both ipv4 and ipv6, is
protected by RCU using the RTNL lock for write access. In many
places a table pointer escapes the RCU (or RTNL) protected critical
section, but such scenarios are actually safe because tables are
deleted only at namespace cleanup time or just after allocation, in
case of default rule creation failure.

Tables freed at namespace cleanup time are assured to be alive for the
whole netns lifetime; tables freed just after creation time are never
exposed to other possible users.

Ensure that the free conditions are respected in ip{,6}mr_free_table, to
document the locking schema and to prevent future possible introduction
of 'table del' operation from breaking it.

Signed-off-by: Paolo Abeni <pabeni@redhat.com>
---
v1 -> v2:
 - fix build errors with CONFIG_IP{,V6}_MROUTE_MULTIPLE_TABLES=n
---
 net/ipv4/ipmr.c  | 14 ++++++++++++++
 net/ipv6/ip6mr.c | 14 ++++++++++++++
 2 files changed, 28 insertions(+)

diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c
index c58dd78509a2..bac0776648e0 100644
--- a/net/ipv4/ipmr.c
+++ b/net/ipv4/ipmr.c
@@ -120,6 +120,11 @@ static void ipmr_expire_process(struct timer_list *t);
 				lockdep_rtnl_is_held() ||		\
 				list_empty(&net->ipv4.mr_tables))
 
+static bool ipmr_can_free_table(struct net *net)
+{
+	return !check_net(net) || !net->ipv4.mr_rules_ops;
+}
+
 static struct mr_table *ipmr_mr_table_iter(struct net *net,
 					   struct mr_table *mrt)
 {
@@ -302,6 +307,11 @@ EXPORT_SYMBOL(ipmr_rule_default);
 #define ipmr_for_each_table(mrt, net) \
 	for (mrt = net->ipv4.mrt; mrt; mrt = NULL)
 
+static bool ipmr_can_free_table(struct net *net)
+{
+	return !check_net(net);
+}
+
 static struct mr_table *ipmr_mr_table_iter(struct net *net,
 					   struct mr_table *mrt)
 {
@@ -413,6 +423,10 @@ static struct mr_table *ipmr_new_table(struct net *net, u32 id)
 
 static void ipmr_free_table(struct mr_table *mrt)
 {
+	struct net *net = read_pnet(&mrt->net);
+
+	DEBUG_NET_WARN_ON_ONCE(!ipmr_can_free_table(net));
+
 	timer_shutdown_sync(&mrt->ipmr_expire_timer);
 	mroute_clean_tables(mrt, MRT_FLUSH_VIFS | MRT_FLUSH_VIFS_STATIC |
 				 MRT_FLUSH_MFC | MRT_FLUSH_MFC_STATIC);
diff --git a/net/ipv6/ip6mr.c b/net/ipv6/ip6mr.c
index d66f58932a79..b80fca894916 100644
--- a/net/ipv6/ip6mr.c
+++ b/net/ipv6/ip6mr.c
@@ -108,6 +108,11 @@ static void ipmr_expire_process(struct timer_list *t);
 				lockdep_rtnl_is_held() || \
 				list_empty(&net->ipv6.mr6_tables))
 
+static bool ip6mr_can_free_table(struct net *net)
+{
+	return !check_net(net) || !net->ipv6.mr6_rules_ops;
+}
+
 static struct mr_table *ip6mr_mr_table_iter(struct net *net,
 					    struct mr_table *mrt)
 {
@@ -291,6 +296,11 @@ EXPORT_SYMBOL(ip6mr_rule_default);
 #define ip6mr_for_each_table(mrt, net) \
 	for (mrt = net->ipv6.mrt6; mrt; mrt = NULL)
 
+static bool ip6mr_can_free_table(struct net *net)
+{
+	return !check_net(net);
+}
+
 static struct mr_table *ip6mr_mr_table_iter(struct net *net,
 					    struct mr_table *mrt)
 {
@@ -392,6 +402,10 @@ static struct mr_table *ip6mr_new_table(struct net *net, u32 id)
 
 static void ip6mr_free_table(struct mr_table *mrt)
 {
+	struct net *net = read_pnet(&mrt->net);
+
+	DEBUG_NET_WARN_ON_ONCE(!ip6mr_can_free_table(net));
+
 	timer_shutdown_sync(&mrt->ipmr_expire_timer);
 	mroute_clean_tables(mrt, MRT6_FLUSH_MIFS | MRT6_FLUSH_MIFS_STATIC |
 				 MRT6_FLUSH_MFC | MRT6_FLUSH_MFC_STATIC);
-- 
2.45.2


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

* [PATCH v2 net 2/3] ip6mr: fix tables suspicious RCU usage
  2024-11-24 15:40 [PATCH v2 net 0/3] net: fix mcast RCU splats Paolo Abeni
  2024-11-24 15:40 ` [PATCH v2 net 1/3] ipmr: add debug check for mr table cleanup Paolo Abeni
@ 2024-11-24 15:40 ` Paolo Abeni
  2024-11-26 15:39   ` David Ahern
  2024-11-24 15:40 ` [PATCH v2 net 3/3] ipmr: " Paolo Abeni
  2024-11-28  9:30 ` [PATCH v2 net 0/3] net: fix mcast RCU splats patchwork-bot+netdevbpf
  3 siblings, 1 reply; 8+ messages in thread
From: Paolo Abeni @ 2024-11-24 15:40 UTC (permalink / raw)
  To: netdev
  Cc: Eric Dumazet, David S. Miller, Jakub Kicinski, Simon Horman,
	stefan.wiehler, David Ahern

Several places call ip6mr_get_table() with no RCU nor RTNL lock.
Add RCU protection inside such helper and provide a lockless variant
for the few callers that already acquired the relevant lock.

Note that some users additionally reference the table outside the RCU
lock. That is actually safe as the table deletion can happen only
after all table accesses are completed.

Fixes: e2d57766e674 ("net: Provide compat support for SIOCGETMIFCNT_IN6 and SIOCGETSGCNT_IN6.")
Fixes: d7c31cbde4bc ("net: ip6mr: add RTM_GETROUTE netlink op")
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
---
 net/ipv6/ip6mr.c | 38 +++++++++++++++++++++++++++-----------
 1 file changed, 27 insertions(+), 11 deletions(-)

diff --git a/net/ipv6/ip6mr.c b/net/ipv6/ip6mr.c
index b80fca894916..4147890fe98f 100644
--- a/net/ipv6/ip6mr.c
+++ b/net/ipv6/ip6mr.c
@@ -130,7 +130,7 @@ static struct mr_table *ip6mr_mr_table_iter(struct net *net,
 	return ret;
 }
 
-static struct mr_table *ip6mr_get_table(struct net *net, u32 id)
+static struct mr_table *__ip6mr_get_table(struct net *net, u32 id)
 {
 	struct mr_table *mrt;
 
@@ -141,6 +141,16 @@ static struct mr_table *ip6mr_get_table(struct net *net, u32 id)
 	return NULL;
 }
 
+static struct mr_table *ip6mr_get_table(struct net *net, u32 id)
+{
+	struct mr_table *mrt;
+
+	rcu_read_lock();
+	mrt = __ip6mr_get_table(net, id);
+	rcu_read_unlock();
+	return mrt;
+}
+
 static int ip6mr_fib_lookup(struct net *net, struct flowi6 *flp6,
 			    struct mr_table **mrt)
 {
@@ -182,7 +192,7 @@ static int ip6mr_rule_action(struct fib_rule *rule, struct flowi *flp,
 
 	arg->table = fib_rule_get_table(rule, arg);
 
-	mrt = ip6mr_get_table(rule->fr_net, arg->table);
+	mrt = __ip6mr_get_table(rule->fr_net, arg->table);
 	if (!mrt)
 		return -EAGAIN;
 	res->mrt = mrt;
@@ -314,6 +324,8 @@ static struct mr_table *ip6mr_get_table(struct net *net, u32 id)
 	return net->ipv6.mrt6;
 }
 
+#define __ip6mr_get_table ip6mr_get_table
+
 static int ip6mr_fib_lookup(struct net *net, struct flowi6 *flp6,
 			    struct mr_table **mrt)
 {
@@ -392,7 +404,7 @@ static struct mr_table *ip6mr_new_table(struct net *net, u32 id)
 {
 	struct mr_table *mrt;
 
-	mrt = ip6mr_get_table(net, id);
+	mrt = __ip6mr_get_table(net, id);
 	if (mrt)
 		return mrt;
 
@@ -425,13 +437,15 @@ static void *ip6mr_vif_seq_start(struct seq_file *seq, loff_t *pos)
 	struct net *net = seq_file_net(seq);
 	struct mr_table *mrt;
 
-	mrt = ip6mr_get_table(net, RT6_TABLE_DFLT);
-	if (!mrt)
+	rcu_read_lock();
+	mrt = __ip6mr_get_table(net, RT6_TABLE_DFLT);
+	if (!mrt) {
+		rcu_read_unlock();
 		return ERR_PTR(-ENOENT);
+	}
 
 	iter->mrt = mrt;
 
-	rcu_read_lock();
 	return mr_vif_seq_start(seq, pos);
 }
 
@@ -2292,11 +2306,13 @@ int ip6mr_get_route(struct net *net, struct sk_buff *skb, struct rtmsg *rtm,
 	struct mfc6_cache *cache;
 	struct rt6_info *rt = dst_rt6_info(skb_dst(skb));
 
-	mrt = ip6mr_get_table(net, RT6_TABLE_DFLT);
-	if (!mrt)
+	rcu_read_lock();
+	mrt = __ip6mr_get_table(net, RT6_TABLE_DFLT);
+	if (!mrt) {
+		rcu_read_unlock();
 		return -ENOENT;
+	}
 
-	rcu_read_lock();
 	cache = ip6mr_cache_find(mrt, &rt->rt6i_src.addr, &rt->rt6i_dst.addr);
 	if (!cache && skb->dev) {
 		int vif = ip6mr_find_vif(mrt, skb->dev);
@@ -2576,7 +2592,7 @@ static int ip6mr_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh,
 		grp = nla_get_in6_addr(tb[RTA_DST]);
 	tableid = nla_get_u32_default(tb[RTA_TABLE], 0);
 
-	mrt = ip6mr_get_table(net, tableid ?: RT_TABLE_DEFAULT);
+	mrt = __ip6mr_get_table(net, tableid ?: RT_TABLE_DEFAULT);
 	if (!mrt) {
 		NL_SET_ERR_MSG_MOD(extack, "MR table does not exist");
 		return -ENOENT;
@@ -2623,7 +2639,7 @@ static int ip6mr_rtm_dumproute(struct sk_buff *skb, struct netlink_callback *cb)
 	if (filter.table_id) {
 		struct mr_table *mrt;
 
-		mrt = ip6mr_get_table(sock_net(skb->sk), filter.table_id);
+		mrt = __ip6mr_get_table(sock_net(skb->sk), filter.table_id);
 		if (!mrt) {
 			if (rtnl_msg_family(cb->nlh) != RTNL_FAMILY_IP6MR)
 				return skb->len;
-- 
2.45.2


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

* [PATCH v2 net 3/3] ipmr: fix tables suspicious RCU usage
  2024-11-24 15:40 [PATCH v2 net 0/3] net: fix mcast RCU splats Paolo Abeni
  2024-11-24 15:40 ` [PATCH v2 net 1/3] ipmr: add debug check for mr table cleanup Paolo Abeni
  2024-11-24 15:40 ` [PATCH v2 net 2/3] ip6mr: fix tables suspicious RCU usage Paolo Abeni
@ 2024-11-24 15:40 ` Paolo Abeni
  2024-11-26 15:40   ` David Ahern
  2024-11-28  9:30 ` [PATCH v2 net 0/3] net: fix mcast RCU splats patchwork-bot+netdevbpf
  3 siblings, 1 reply; 8+ messages in thread
From: Paolo Abeni @ 2024-11-24 15:40 UTC (permalink / raw)
  To: netdev
  Cc: Eric Dumazet, David S. Miller, Jakub Kicinski, Simon Horman,
	stefan.wiehler, David Ahern

Similar to the previous patch, plumb the RCU lock inside
the ipmr_get_table(), provided a lockless variant and apply
the latter in the few spots were the lock is already held.

Fixes: 709b46e8d90b ("net: Add compat ioctl support for the ipv4 multicast ioctl SIOCGETSGCNT")
Fixes: f0ad0860d01e ("ipv4: ipmr: support multiple tables")
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
---
 net/ipv4/ipmr.c | 42 +++++++++++++++++++++++++++++-------------
 1 file changed, 29 insertions(+), 13 deletions(-)

diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c
index bac0776648e0..383ea8b91cc7 100644
--- a/net/ipv4/ipmr.c
+++ b/net/ipv4/ipmr.c
@@ -142,7 +142,7 @@ static struct mr_table *ipmr_mr_table_iter(struct net *net,
 	return ret;
 }
 
-static struct mr_table *ipmr_get_table(struct net *net, u32 id)
+static struct mr_table *__ipmr_get_table(struct net *net, u32 id)
 {
 	struct mr_table *mrt;
 
@@ -153,6 +153,16 @@ static struct mr_table *ipmr_get_table(struct net *net, u32 id)
 	return NULL;
 }
 
+static struct mr_table *ipmr_get_table(struct net *net, u32 id)
+{
+	struct mr_table *mrt;
+
+	rcu_read_lock();
+	mrt = __ipmr_get_table(net, id);
+	rcu_read_unlock();
+	return mrt;
+}
+
 static int ipmr_fib_lookup(struct net *net, struct flowi4 *flp4,
 			   struct mr_table **mrt)
 {
@@ -194,7 +204,7 @@ static int ipmr_rule_action(struct fib_rule *rule, struct flowi *flp,
 
 	arg->table = fib_rule_get_table(rule, arg);
 
-	mrt = ipmr_get_table(rule->fr_net, arg->table);
+	mrt = __ipmr_get_table(rule->fr_net, arg->table);
 	if (!mrt)
 		return -EAGAIN;
 	res->mrt = mrt;
@@ -325,6 +335,8 @@ static struct mr_table *ipmr_get_table(struct net *net, u32 id)
 	return net->ipv4.mrt;
 }
 
+#define __ipmr_get_table ipmr_get_table
+
 static int ipmr_fib_lookup(struct net *net, struct flowi4 *flp4,
 			   struct mr_table **mrt)
 {
@@ -413,7 +425,7 @@ static struct mr_table *ipmr_new_table(struct net *net, u32 id)
 	if (id != RT_TABLE_DEFAULT && id >= 1000000000)
 		return ERR_PTR(-EINVAL);
 
-	mrt = ipmr_get_table(net, id);
+	mrt = __ipmr_get_table(net, id);
 	if (mrt)
 		return mrt;
 
@@ -1388,7 +1400,7 @@ int ip_mroute_setsockopt(struct sock *sk, int optname, sockptr_t optval,
 		goto out_unlock;
 	}
 
-	mrt = ipmr_get_table(net, raw_sk(sk)->ipmr_table ? : RT_TABLE_DEFAULT);
+	mrt = __ipmr_get_table(net, raw_sk(sk)->ipmr_table ? : RT_TABLE_DEFAULT);
 	if (!mrt) {
 		ret = -ENOENT;
 		goto out_unlock;
@@ -2276,11 +2288,13 @@ int ipmr_get_route(struct net *net, struct sk_buff *skb,
 	struct mr_table *mrt;
 	int err;
 
-	mrt = ipmr_get_table(net, RT_TABLE_DEFAULT);
-	if (!mrt)
+	rcu_read_lock();
+	mrt = __ipmr_get_table(net, RT_TABLE_DEFAULT);
+	if (!mrt) {
+		rcu_read_unlock();
 		return -ENOENT;
+	}
 
-	rcu_read_lock();
 	cache = ipmr_cache_find(mrt, saddr, daddr);
 	if (!cache && skb->dev) {
 		int vif = ipmr_find_vif(mrt, skb->dev);
@@ -2564,7 +2578,7 @@ static int ipmr_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh,
 	grp = nla_get_in_addr_default(tb[RTA_DST], 0);
 	tableid = nla_get_u32_default(tb[RTA_TABLE], 0);
 
-	mrt = ipmr_get_table(net, tableid ? tableid : RT_TABLE_DEFAULT);
+	mrt = __ipmr_get_table(net, tableid ? tableid : RT_TABLE_DEFAULT);
 	if (!mrt) {
 		err = -ENOENT;
 		goto errout_free;
@@ -2618,7 +2632,7 @@ static int ipmr_rtm_dumproute(struct sk_buff *skb, struct netlink_callback *cb)
 	if (filter.table_id) {
 		struct mr_table *mrt;
 
-		mrt = ipmr_get_table(sock_net(skb->sk), filter.table_id);
+		mrt = __ipmr_get_table(sock_net(skb->sk), filter.table_id);
 		if (!mrt) {
 			if (rtnl_msg_family(cb->nlh) != RTNL_FAMILY_IPMR)
 				return skb->len;
@@ -2726,7 +2740,7 @@ static int rtm_to_ipmr_mfcc(struct net *net, struct nlmsghdr *nlh,
 			break;
 		}
 	}
-	mrt = ipmr_get_table(net, tblid);
+	mrt = __ipmr_get_table(net, tblid);
 	if (!mrt) {
 		ret = -ENOENT;
 		goto out;
@@ -2934,13 +2948,15 @@ static void *ipmr_vif_seq_start(struct seq_file *seq, loff_t *pos)
 	struct net *net = seq_file_net(seq);
 	struct mr_table *mrt;
 
-	mrt = ipmr_get_table(net, RT_TABLE_DEFAULT);
-	if (!mrt)
+	rcu_read_lock();
+	mrt = __ipmr_get_table(net, RT_TABLE_DEFAULT);
+	if (!mrt) {
+		rcu_read_unlock();
 		return ERR_PTR(-ENOENT);
+	}
 
 	iter->mrt = mrt;
 
-	rcu_read_lock();
 	return mr_vif_seq_start(seq, pos);
 }
 
-- 
2.45.2


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

* Re: [PATCH v2 net 1/3] ipmr: add debug check for mr table cleanup
  2024-11-24 15:40 ` [PATCH v2 net 1/3] ipmr: add debug check for mr table cleanup Paolo Abeni
@ 2024-11-26 15:34   ` David Ahern
  0 siblings, 0 replies; 8+ messages in thread
From: David Ahern @ 2024-11-26 15:34 UTC (permalink / raw)
  To: Paolo Abeni, netdev
  Cc: Eric Dumazet, David S. Miller, Jakub Kicinski, Simon Horman,
	stefan.wiehler

On 11/24/24 8:40 AM, Paolo Abeni wrote:
> The multicast route tables lifecycle, for both ipv4 and ipv6, is
> protected by RCU using the RTNL lock for write access. In many
> places a table pointer escapes the RCU (or RTNL) protected critical
> section, but such scenarios are actually safe because tables are
> deleted only at namespace cleanup time or just after allocation, in
> case of default rule creation failure.
> 
> Tables freed at namespace cleanup time are assured to be alive for the
> whole netns lifetime; tables freed just after creation time are never
> exposed to other possible users.
> 
> Ensure that the free conditions are respected in ip{,6}mr_free_table, to
> document the locking schema and to prevent future possible introduction
> of 'table del' operation from breaking it.
> 
> Signed-off-by: Paolo Abeni <pabeni@redhat.com>
> ---
> v1 -> v2:
>  - fix build errors with CONFIG_IP{,V6}_MROUTE_MULTIPLE_TABLES=n
> ---
>  net/ipv4/ipmr.c  | 14 ++++++++++++++
>  net/ipv6/ip6mr.c | 14 ++++++++++++++
>  2 files changed, 28 insertions(+)
> 

Reviewed-by: David Ahern <dsahern@kernel.org>



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

* Re: [PATCH v2 net 2/3] ip6mr: fix tables suspicious RCU usage
  2024-11-24 15:40 ` [PATCH v2 net 2/3] ip6mr: fix tables suspicious RCU usage Paolo Abeni
@ 2024-11-26 15:39   ` David Ahern
  0 siblings, 0 replies; 8+ messages in thread
From: David Ahern @ 2024-11-26 15:39 UTC (permalink / raw)
  To: Paolo Abeni, netdev
  Cc: Eric Dumazet, David S. Miller, Jakub Kicinski, Simon Horman,
	stefan.wiehler

On 11/24/24 8:40 AM, Paolo Abeni wrote:
> Several places call ip6mr_get_table() with no RCU nor RTNL lock.
> Add RCU protection inside such helper and provide a lockless variant
> for the few callers that already acquired the relevant lock.
> 
> Note that some users additionally reference the table outside the RCU
> lock. That is actually safe as the table deletion can happen only
> after all table accesses are completed.
> 
> Fixes: e2d57766e674 ("net: Provide compat support for SIOCGETMIFCNT_IN6 and SIOCGETSGCNT_IN6.")
> Fixes: d7c31cbde4bc ("net: ip6mr: add RTM_GETROUTE netlink op")
> Signed-off-by: Paolo Abeni <pabeni@redhat.com>
> ---
>  net/ipv6/ip6mr.c | 38 +++++++++++++++++++++++++++-----------
>  1 file changed, 27 insertions(+), 11 deletions(-)
> 

Reviewed-by: David Ahern <dsahern@kernel.org>



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

* Re: [PATCH v2 net 3/3] ipmr: fix tables suspicious RCU usage
  2024-11-24 15:40 ` [PATCH v2 net 3/3] ipmr: " Paolo Abeni
@ 2024-11-26 15:40   ` David Ahern
  0 siblings, 0 replies; 8+ messages in thread
From: David Ahern @ 2024-11-26 15:40 UTC (permalink / raw)
  To: Paolo Abeni, netdev
  Cc: Eric Dumazet, David S. Miller, Jakub Kicinski, Simon Horman,
	stefan.wiehler

On 11/24/24 8:40 AM, Paolo Abeni wrote:
> Similar to the previous patch, plumb the RCU lock inside
> the ipmr_get_table(), provided a lockless variant and apply
> the latter in the few spots were the lock is already held.
> 
> Fixes: 709b46e8d90b ("net: Add compat ioctl support for the ipv4 multicast ioctl SIOCGETSGCNT")
> Fixes: f0ad0860d01e ("ipv4: ipmr: support multiple tables")
> Signed-off-by: Paolo Abeni <pabeni@redhat.com>
> ---
>  net/ipv4/ipmr.c | 42 +++++++++++++++++++++++++++++-------------
>  1 file changed, 29 insertions(+), 13 deletions(-)
> 

Reviewed-by: David Ahern <dsahern@kernel.org>



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

* Re: [PATCH v2 net 0/3] net: fix mcast RCU splats
  2024-11-24 15:40 [PATCH v2 net 0/3] net: fix mcast RCU splats Paolo Abeni
                   ` (2 preceding siblings ...)
  2024-11-24 15:40 ` [PATCH v2 net 3/3] ipmr: " Paolo Abeni
@ 2024-11-28  9:30 ` patchwork-bot+netdevbpf
  3 siblings, 0 replies; 8+ messages in thread
From: patchwork-bot+netdevbpf @ 2024-11-28  9:30 UTC (permalink / raw)
  To: Paolo Abeni; +Cc: netdev, edumazet, davem, kuba, horms, stefan.wiehler, dsahern

Hello:

This series was applied to netdev/net.git (main)
by Paolo Abeni <pabeni@redhat.com>:

On Sun, 24 Nov 2024 16:40:55 +0100 you wrote:
> This series addresses the RCU splat triggered by the forwarding
> mroute tests.
> 
> The first patch does not address any specific issue, but makes the
> following ones more clear. Patch 2 and 3 address the issue for ipv6 and
> ipv4 respectively.
> 
> [...]

Here is the summary with links:
  - [v2,net,1/3] ipmr: add debug check for mr table cleanup
    https://git.kernel.org/netdev/net/c/11b6e701bce9
  - [v2,net,2/3] ip6mr: fix tables suspicious RCU usage
    https://git.kernel.org/netdev/net/c/f1553c9894b4
  - [v2,net,3/3] ipmr: fix tables suspicious RCU usage
    https://git.kernel.org/netdev/net/c/fc9c273d6daa

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] 8+ messages in thread

end of thread, other threads:[~2024-11-28  9:30 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-11-24 15:40 [PATCH v2 net 0/3] net: fix mcast RCU splats Paolo Abeni
2024-11-24 15:40 ` [PATCH v2 net 1/3] ipmr: add debug check for mr table cleanup Paolo Abeni
2024-11-26 15:34   ` David Ahern
2024-11-24 15:40 ` [PATCH v2 net 2/3] ip6mr: fix tables suspicious RCU usage Paolo Abeni
2024-11-26 15:39   ` David Ahern
2024-11-24 15:40 ` [PATCH v2 net 3/3] ipmr: " Paolo Abeni
2024-11-26 15:40   ` David Ahern
2024-11-28  9:30 ` [PATCH v2 net 0/3] net: fix mcast RCU splats 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).