diff mbox series

[net-next] ipv6: blackhole_netdev needs snmp6 counters

Message ID 20220214021056.389298-1-eric.dumazet@gmail.com (mailing list archive)
State Accepted
Commit dd263a8cb1941d2d34a55633bd5366d9bebf4be8
Delegated to: Netdev Maintainers
Headers show
Series [net-next] ipv6: blackhole_netdev needs snmp6 counters | expand

Checks

Context Check Description
netdev/tree_selection success Clearly marked for net-next
netdev/fixes_present success Fixes tag not required for -next series
netdev/subject_prefix success Link
netdev/cover_letter success Single patches do not need cover letters
netdev/patch_count success Link
netdev/header_inline success No static functions without inline keyword in header files
netdev/build_32bit success Errors and warnings before: 0 this patch: 0
netdev/cc_maintainers warning 2 maintainers not CCed: dsahern@kernel.org yoshfuji@linux-ipv6.org
netdev/build_clang success Errors and warnings before: 0 this patch: 0
netdev/module_param success Was 0 now: 0
netdev/verify_signedoff success Signed-off-by tag matches author and committer
netdev/verify_fixes success Fixes tag looks correct
netdev/build_allmodconfig_warn success Errors and warnings before: 0 this patch: 0
netdev/checkpatch success total: 0 errors, 0 warnings, 0 checks, 25 lines checked
netdev/kdoc success Errors and warnings before: 0 this patch: 0
netdev/source_inline success Was 0 now: 0

Commit Message

Eric Dumazet Feb. 14, 2022, 2:10 a.m. UTC
From: Ido Schimmel <idosch@nvidia.com>

Whenever rt6_uncached_list_flush_dev() swaps rt->rt6_idev
to the blackhole device, parts of IPv6 stack might still need
to increment one SNMP counter.

Root cause, patch from Ido, changelog from Eric :)

This bug suggests that we need to audit rt->rt6_idev usages
and make sure they are properly using RCU protection.

Fixes: e5f80fcf869a ("ipv6: give an IPv6 dev to blackhole_netdev")
Signed-off-by: Ido Schimmel <idosch@nvidia.com>
Signed-off-by: Eric Dumazet <edumazet@google.com>
Reported-by: syzbot <syzkaller@googlegroups.com>
---
 net/ipv6/addrconf.c | 18 +++++++++---------
 1 file changed, 9 insertions(+), 9 deletions(-)

Comments

Ido Schimmel Feb. 14, 2022, 7:44 a.m. UTC | #1
On Sun, Feb 13, 2022 at 06:10:56PM -0800, Eric Dumazet wrote:
> From: Ido Schimmel <idosch@nvidia.com>
> 
> Whenever rt6_uncached_list_flush_dev() swaps rt->rt6_idev
> to the blackhole device, parts of IPv6 stack might still need
> to increment one SNMP counter.
> 
> Root cause, patch from Ido, changelog from Eric :)
> 
> This bug suggests that we need to audit rt->rt6_idev usages
> and make sure they are properly using RCU protection.
> 
> Fixes: e5f80fcf869a ("ipv6: give an IPv6 dev to blackhole_netdev")
> Signed-off-by: Ido Schimmel <idosch@nvidia.com>
> Signed-off-by: Eric Dumazet <edumazet@google.com>
> Reported-by: syzbot <syzkaller@googlegroups.com>

Thanks for taking care of this, Eric. I applied the patch to our tree
last night before logging off and regression does look fine.
patchwork-bot+netdevbpf@kernel.org Feb. 14, 2022, 2:10 p.m. UTC | #2
Hello:

This patch was applied to netdev/net-next.git (master)
by David S. Miller <davem@davemloft.net>:

On Sun, 13 Feb 2022 18:10:56 -0800 you wrote:
> From: Ido Schimmel <idosch@nvidia.com>
> 
> Whenever rt6_uncached_list_flush_dev() swaps rt->rt6_idev
> to the blackhole device, parts of IPv6 stack might still need
> to increment one SNMP counter.
> 
> Root cause, patch from Ido, changelog from Eric :)
> 
> [...]

Here is the summary with links:
  - [net-next] ipv6: blackhole_netdev needs snmp6 counters
    https://git.kernel.org/netdev/net-next/c/dd263a8cb194

You are awesome, thank you!
diff mbox series

Patch

diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
index 02d31d4fcab3b3d529c4fe3260216ecee1108e82..57fbd6f03ff8d118e50d8aa6ea0ab938a1bb3cbc 100644
--- a/net/ipv6/addrconf.c
+++ b/net/ipv6/addrconf.c
@@ -400,16 +400,16 @@  static struct inet6_dev *ipv6_add_dev(struct net_device *dev)
 	/* We refer to the device */
 	dev_hold_track(dev, &ndev->dev_tracker, GFP_KERNEL);
 
-	if (dev != blackhole_netdev) {
-		if (snmp6_alloc_dev(ndev) < 0) {
-			netdev_dbg(dev, "%s: cannot allocate memory for statistics\n",
-				   __func__);
-			neigh_parms_release(&nd_tbl, ndev->nd_parms);
-			dev_put_track(dev, &ndev->dev_tracker);
-			kfree(ndev);
-			return ERR_PTR(err);
-		}
+	if (snmp6_alloc_dev(ndev) < 0) {
+		netdev_dbg(dev, "%s: cannot allocate memory for statistics\n",
+			   __func__);
+		neigh_parms_release(&nd_tbl, ndev->nd_parms);
+		dev_put_track(dev, &ndev->dev_tracker);
+		kfree(ndev);
+		return ERR_PTR(err);
+	}
 
+	if (dev != blackhole_netdev) {
 		if (snmp6_register_dev(ndev) < 0) {
 			netdev_dbg(dev, "%s: cannot create /proc/net/dev_snmp6/%s\n",
 				   __func__, dev->name);