From patchwork Thu Feb 10 21:42:28 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eric Dumazet X-Patchwork-Id: 12742440 X-Patchwork-Delegate: kuba@kernel.org Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id C7A75C433F5 for ; Thu, 10 Feb 2022 21:42:45 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1344784AbiBJVmn (ORCPT ); Thu, 10 Feb 2022 16:42:43 -0500 Received: from mxb-00190b01.gslb.pphosted.com ([23.128.96.19]:53148 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1344766AbiBJVml (ORCPT ); Thu, 10 Feb 2022 16:42:41 -0500 Received: from mail-pj1-x102a.google.com (mail-pj1-x102a.google.com [IPv6:2607:f8b0:4864:20::102a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3AE818F for ; Thu, 10 Feb 2022 13:42:39 -0800 (PST) Received: by mail-pj1-x102a.google.com with SMTP id h14-20020a17090a130e00b001b88991a305so9944367pja.3 for ; Thu, 10 Feb 2022 13:42:39 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=d2wuMAg/F1HyRPouNFzbcdYBb0XWDDW51cEAcSB8C9I=; b=SGPDSa8FNYFgkB8NpK6+u11TDucHcg6hDods0FkoaWpFqet3KMJjwW3vltXoi3lSZt 0DvhWF57z2DmetK//nwaTpeiMoXvRTlNFI22QvO32b/bOrNGLB0uVctLIs1kpkM1GC7b jkTlBUfFfXKunMP9jcPyGbeasXU90E14q+T0vvw/fPDxeYSKLn240mxVxo0nZvuDIE7i ftGfcNqCQpZIt73i8ZVJ3Aw3CUtvIMe6YQmMbVRgXWh68ucCgVYEHJ2UW/AIhNz5h2zV 8cdAzv7/C0EvofSaN4f/O3n7kb7QOec7TEF70xkJOQHa6pMpIXj00opEgNtO0DExOIyZ 0iEg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=d2wuMAg/F1HyRPouNFzbcdYBb0XWDDW51cEAcSB8C9I=; b=k1xUgN9pjlKsHxkAhN1BibE88BK+2kVak5jBIudBF4hekzwPVBGa1zTkjv8IX8Tsxz yjsHEJB41Snm+/5VXDT9Y6bA6yanpD5Ik8XiymOt/xhvtZCd3cKxgpcqE4VD8oR4LQo+ ohHclxkR67q4GagJ5IAZkZ24SN0nq94LQkp8uVcdHe9ypgjZhJSiB59oFz10CVxj2gu+ lnOGt7czzSdd/ghObkINvn7/gNvRYr8sTfBSxcwkhM5BiMce4ACSkkb9f5YYYnzRwqiB JmHfWbz+mxkpIY/V6CWOrJhIz6g56d3ID51DR+pN2SZTW+6fgUYxF/QvCWD4Z9lgKvCQ lX9g== X-Gm-Message-State: AOAM530mP+/EHmcl9FbjLx29vJce90pa2euQg/9t9uq/yC8ogHocSois bY5zXBOeJbduo/YbaFgLGhk= X-Google-Smtp-Source: ABdhPJzY4olX+egjpx/QQCyvGDNR6RuuB6HWc0MN8JkLo+k5DYrc2WN8gjOv3Xqf4OwvSN2rdyFb1g== X-Received: by 2002:a17:902:ced1:: with SMTP id d17mr9402601plg.37.1644529358681; Thu, 10 Feb 2022 13:42:38 -0800 (PST) Received: from edumazet1.svl.corp.google.com ([2620:15c:2c4:201:60c1:10c1:3f4f:199d]) by smtp.gmail.com with ESMTPSA id s19sm23824098pfu.34.2022.02.10.13.42.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 10 Feb 2022 13:42:38 -0800 (PST) From: Eric Dumazet To: "David S . Miller" , Jakub Kicinski Cc: netdev , Eric Dumazet , Mahesh Bandewar , Eric Dumazet Subject: [PATCH net-next 1/4] ipv6: get rid of net->ipv6.rt6_stats->fib_rt_uncache Date: Thu, 10 Feb 2022 13:42:28 -0800 Message-Id: <20220210214231.2420942-2-eric.dumazet@gmail.com> X-Mailer: git-send-email 2.35.1.265.g69c8d7142f-goog In-Reply-To: <20220210214231.2420942-1-eric.dumazet@gmail.com> References: <20220210214231.2420942-1-eric.dumazet@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org X-Patchwork-Delegate: kuba@kernel.org From: Eric Dumazet This counter has never been visible, there is little point trying to maintain it. Signed-off-by: Eric Dumazet --- include/net/ip6_fib.h | 3 +-- net/ipv6/route.c | 4 ---- net/ipv6/xfrm6_policy.c | 1 - 3 files changed, 1 insertion(+), 7 deletions(-) diff --git a/include/net/ip6_fib.h b/include/net/ip6_fib.h index 40ae8f1b18e502cece9f11b3a60c9cc30c2e1a5e..32c83bb688798b5c12f8aeea1c66debe866689d8 100644 --- a/include/net/ip6_fib.h +++ b/include/net/ip6_fib.h @@ -367,9 +367,8 @@ struct rt6_statistics { __u32 fib_rt_cache; /* cached rt entries in exception table */ __u32 fib_discarded_routes; /* total number of routes delete */ - /* The following stats are not protected by any lock */ + /* The following stat is not protected by any lock */ atomic_t fib_rt_alloc; /* total number of routes alloced */ - atomic_t fib_rt_uncache; /* rt entries in uncached list */ }; #define RTN_TL_ROOT 0x0001 diff --git a/net/ipv6/route.c b/net/ipv6/route.c index f4884cda13b92e72d041680cbabfee2e07ec0f10..53acd1568ebcceb1a1697579ed505cefc7a35a65 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c @@ -149,11 +149,9 @@ void rt6_uncached_list_del(struct rt6_info *rt) { if (!list_empty(&rt->rt6i_uncached)) { struct uncached_list *ul = rt->rt6i_uncached_list; - struct net *net = dev_net(rt->dst.dev); spin_lock_bh(&ul->lock); list_del(&rt->rt6i_uncached); - atomic_dec(&net->ipv6.rt6_stats->fib_rt_uncache); spin_unlock_bh(&ul->lock); } } @@ -2244,7 +2242,6 @@ struct rt6_info *ip6_pol_route(struct net *net, struct fib6_table *table, * if caller sets RT6_LOOKUP_F_DST_NOREF flag. */ rt6_uncached_list_add(rt); - atomic_inc(&net->ipv6.rt6_stats->fib_rt_uncache); rcu_read_unlock(); return rt; @@ -3287,7 +3284,6 @@ struct dst_entry *icmp6_dst_alloc(struct net_device *dev, * do proper release of the net_device */ rt6_uncached_list_add(rt); - atomic_inc(&net->ipv6.rt6_stats->fib_rt_uncache); dst = xfrm_lookup(net, &rt->dst, flowi6_to_flowi(fl6), NULL, 0); diff --git a/net/ipv6/xfrm6_policy.c b/net/ipv6/xfrm6_policy.c index fad687ee6dd81af9ee3591eb2333cfed8ceae8ce..55bb2cbae13ddc236e420fae37cd42bbad14d1b2 100644 --- a/net/ipv6/xfrm6_policy.c +++ b/net/ipv6/xfrm6_policy.c @@ -92,7 +92,6 @@ static int xfrm6_fill_dst(struct xfrm_dst *xdst, struct net_device *dev, xdst->u.rt6.rt6i_src = rt->rt6i_src; INIT_LIST_HEAD(&xdst->u.rt6.rt6i_uncached); rt6_uncached_list_add(&xdst->u.rt6); - atomic_inc(&dev_net(dev)->ipv6.rt6_stats->fib_rt_uncache); return 0; } From patchwork Thu Feb 10 21:42:29 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eric Dumazet X-Patchwork-Id: 12742441 X-Patchwork-Delegate: kuba@kernel.org Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 38C7BC433EF for ; Thu, 10 Feb 2022 21:42:47 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1344758AbiBJVmp (ORCPT ); Thu, 10 Feb 2022 16:42:45 -0500 Received: from mxb-00190b01.gslb.pphosted.com ([23.128.96.19]:53160 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240940AbiBJVmm (ORCPT ); Thu, 10 Feb 2022 16:42:42 -0500 Received: from mail-pj1-x1033.google.com (mail-pj1-x1033.google.com [IPv6:2607:f8b0:4864:20::1033]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id CAAB71D1 for ; Thu, 10 Feb 2022 13:42:42 -0800 (PST) Received: by mail-pj1-x1033.google.com with SMTP id a11-20020a17090a740b00b001b8b506c42fso10052992pjg.0 for ; Thu, 10 Feb 2022 13:42:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=njF4HQAZAt6kM3R0jZtNL7OgZ6d6AF7n7BTmiezE6WA=; b=bhW+fgGZIKWEufEeCdadEwlg6thJoUzanLFTVkr6D1UQjaETkRLUMzGtVuuIuTVv8E C6yj+QT+4l1ZSSmIBO0C0bi9FNqeuGWs2ejKbqNvspT5H78z8L2/SEvFEIi2HZGl3p01 x26m7FL6qrCjvq+XsDFbzk1XKY767qa6se/TJ2YAfsvvRDGdb8Wkp7VS03MyYyuSW7Ay EWybbYvuHLY86Ck74ikOgQmFrwOf5xFm83VAeSeo8cyyo+i4YBJ50SxXYMLIr9b6Es3h 06CIxOcQPjJ2dj2lmTpxHX0ge80hguD/rCl5th50tF3dGRblFbwnaLmRznNDij5o6Cdk vTgQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=njF4HQAZAt6kM3R0jZtNL7OgZ6d6AF7n7BTmiezE6WA=; b=kkVV6Y8H8VDZDh9rqzJwRQSp7d9aMuW9jfnN7UDADT+DvSbFdep+3vwuCzu5bblTvF EX/bdF5tpR4cnkfSEWFHhBe5VRqcB5Kvl8ExsWuBIQcBI7QAPkYRh+X3fFVMrSEKXE/u ndhJekCbUPrf7ZoacNmJMEf3Vxfk3gYUGfQVlVboWpmnpyvGP6hoRm0R8h/xb7YyKLd2 IThx2jfr9Dx6CTcTGRoLxcTm+jUJrS+dMoutgcJvj23CsyFyYDwAlmShCG4qPpAUWcCR SR1kBw1z/lZBmTUT+LUixgnzLGd1VTcKpS3bh8fz0vpqkQf+f/3Md4iZB1OKDyxWQuXt QWrQ== X-Gm-Message-State: AOAM530joaCK4qSBTndSoD3DgBrtJtKA+Y0rzQVqxMfkve4IrotTj6I8 6B8IKc5VRVqXGKalf4pHPUY= X-Google-Smtp-Source: ABdhPJy2tZOVsJsdeAQSV/eOOkVoaOjFczzIIrofTmbMb6xTu932trDFspv+XV5oPccqPiOJdrqRWw== X-Received: by 2002:a17:903:3009:: with SMTP id o9mr1752742pla.163.1644529361844; Thu, 10 Feb 2022 13:42:41 -0800 (PST) Received: from edumazet1.svl.corp.google.com ([2620:15c:2c4:201:60c1:10c1:3f4f:199d]) by smtp.gmail.com with ESMTPSA id s19sm23824098pfu.34.2022.02.10.13.42.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 10 Feb 2022 13:42:41 -0800 (PST) From: Eric Dumazet To: "David S . Miller" , Jakub Kicinski Cc: netdev , Eric Dumazet , Mahesh Bandewar , Eric Dumazet Subject: [PATCH net-next 2/4] ipv6: give an IPv6 dev to blackhole_netdev Date: Thu, 10 Feb 2022 13:42:29 -0800 Message-Id: <20220210214231.2420942-3-eric.dumazet@gmail.com> X-Mailer: git-send-email 2.35.1.265.g69c8d7142f-goog In-Reply-To: <20220210214231.2420942-1-eric.dumazet@gmail.com> References: <20220210214231.2420942-1-eric.dumazet@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org X-Patchwork-Delegate: kuba@kernel.org From: Eric Dumazet IPv6 addrconf notifiers wants the loopback device to be the last device being dismantled at netns deletion. This caused many limitations and work arounds. Back in linux-5.3, Mahesh added a per host blackhole_netdev that can be used whenever we need to make sure objects no longer refer to a disappearing device. If we attach to blackhole_netdev an ip6_ptr (allocate an idev), then we can use this special device (which is never freed) in place of the loopback_dev (which can be freed). This will permit improvements in netdev_run_todo() and other parts of the stack where had steps to make sure loopback_dev was the last device to disappear. Signed-off-by: Eric Dumazet Cc: Mahesh Bandewar --- net/ipv6/addrconf.c | 78 +++++++++++++++++++-------------------------- net/ipv6/route.c | 21 +++++------- 2 files changed, 40 insertions(+), 59 deletions(-) diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index 4f402bc38f056e08f3761e63a7bc7a51e54e9384..02d31d4fcab3b3d529c4fe3260216ecee1108e82 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c @@ -372,7 +372,7 @@ static struct inet6_dev *ipv6_add_dev(struct net_device *dev) ASSERT_RTNL(); - if (dev->mtu < IPV6_MIN_MTU) + if (dev->mtu < IPV6_MIN_MTU && dev != blackhole_netdev) return ERR_PTR(-EINVAL); ndev = kzalloc(sizeof(struct inet6_dev), GFP_KERNEL); @@ -400,21 +400,22 @@ 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 (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_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_register_dev(ndev) < 0) { - netdev_dbg(dev, "%s: cannot create /proc/net/dev_snmp6/%s\n", - __func__, dev->name); - goto err_release; + if (snmp6_register_dev(ndev) < 0) { + netdev_dbg(dev, "%s: cannot create /proc/net/dev_snmp6/%s\n", + __func__, dev->name); + goto err_release; + } } - /* One reference from device. */ refcount_set(&ndev->refcnt, 1); @@ -445,25 +446,28 @@ static struct inet6_dev *ipv6_add_dev(struct net_device *dev) ipv6_mc_init_dev(ndev); ndev->tstamp = jiffies; - err = addrconf_sysctl_register(ndev); - if (err) { - ipv6_mc_destroy_dev(ndev); - snmp6_unregister_dev(ndev); - goto err_release; + if (dev != blackhole_netdev) { + err = addrconf_sysctl_register(ndev); + if (err) { + ipv6_mc_destroy_dev(ndev); + snmp6_unregister_dev(ndev); + goto err_release; + } } /* protected by rtnl_lock */ rcu_assign_pointer(dev->ip6_ptr, ndev); - /* Join interface-local all-node multicast group */ - ipv6_dev_mc_inc(dev, &in6addr_interfacelocal_allnodes); + if (dev != blackhole_netdev) { + /* Join interface-local all-node multicast group */ + ipv6_dev_mc_inc(dev, &in6addr_interfacelocal_allnodes); - /* Join all-node multicast group */ - ipv6_dev_mc_inc(dev, &in6addr_linklocal_allnodes); - - /* Join all-router multicast group if forwarding is set */ - if (ndev->cnf.forwarding && (dev->flags & IFF_MULTICAST)) - ipv6_dev_mc_inc(dev, &in6addr_linklocal_allrouters); + /* Join all-node multicast group */ + ipv6_dev_mc_inc(dev, &in6addr_linklocal_allnodes); + /* Join all-router multicast group if forwarding is set */ + if (ndev->cnf.forwarding && (dev->flags & IFF_MULTICAST)) + ipv6_dev_mc_inc(dev, &in6addr_linklocal_allrouters); + } return ndev; err_release: @@ -7233,26 +7237,8 @@ int __init addrconf_init(void) goto out_nowq; } - /* The addrconf netdev notifier requires that loopback_dev - * has it's ipv6 private information allocated and setup - * before it can bring up and give link-local addresses - * to other devices which are up. - * - * Unfortunately, loopback_dev is not necessarily the first - * entry in the global dev_base list of net devices. In fact, - * it is likely to be the very last entry on that list. - * So this causes the notifier registry below to try and - * give link-local addresses to all devices besides loopback_dev - * first, then loopback_dev, which cases all the non-loopback_dev - * devices to fail to get a link-local address. - * - * So, as a temporary fix, allocate the ipv6 structure for - * loopback_dev first by hand. - * Longer term, all of the dependencies ipv6 has upon the loopback - * device and it being up should be removed. - */ rtnl_lock(); - idev = ipv6_add_dev(init_net.loopback_dev); + idev = ipv6_add_dev(blackhole_netdev); rtnl_unlock(); if (IS_ERR(idev)) { err = PTR_ERR(idev); diff --git a/net/ipv6/route.c b/net/ipv6/route.c index 53acd1568ebcceb1a1697579ed505cefc7a35a65..5fc1a1de9481c859adc332746ccfcf237db6541f 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c @@ -156,14 +156,10 @@ void rt6_uncached_list_del(struct rt6_info *rt) } } -static void rt6_uncached_list_flush_dev(struct net *net, struct net_device *dev) +static void rt6_uncached_list_flush_dev(struct net_device *dev) { - struct net_device *loopback_dev = net->loopback_dev; int cpu; - if (dev == loopback_dev) - return; - for_each_possible_cpu(cpu) { struct uncached_list *ul = per_cpu_ptr(&rt6_uncached_list, cpu); struct rt6_info *rt; @@ -174,7 +170,7 @@ static void rt6_uncached_list_flush_dev(struct net *net, struct net_device *dev) struct net_device *rt_dev = rt->dst.dev; if (rt_idev->dev == dev) { - rt->rt6i_idev = in6_dev_get(loopback_dev); + rt->rt6i_idev = in6_dev_get(blackhole_netdev); in6_dev_put(rt_idev); } @@ -371,13 +367,12 @@ static void ip6_dst_ifdown(struct dst_entry *dst, struct net_device *dev, { struct rt6_info *rt = (struct rt6_info *)dst; struct inet6_dev *idev = rt->rt6i_idev; - struct net_device *loopback_dev = - dev_net(dev)->loopback_dev; - if (idev && idev->dev != loopback_dev) { - struct inet6_dev *loopback_idev = in6_dev_get(loopback_dev); - if (loopback_idev) { - rt->rt6i_idev = loopback_idev; + if (idev && idev->dev != blackhole_netdev) { + struct inet6_dev *blackhole_idev = in6_dev_get(blackhole_netdev); + + if (blackhole_idev) { + rt->rt6i_idev = blackhole_idev; in6_dev_put(idev); } } @@ -4892,7 +4887,7 @@ void rt6_sync_down_dev(struct net_device *dev, unsigned long event) void rt6_disable_ip(struct net_device *dev, unsigned long event) { rt6_sync_down_dev(dev, event); - rt6_uncached_list_flush_dev(dev_net(dev), dev); + rt6_uncached_list_flush_dev(dev); neigh_ifdown(&nd_tbl, dev); } From patchwork Thu Feb 10 21:42:30 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eric Dumazet X-Patchwork-Id: 12742442 X-Patchwork-Delegate: kuba@kernel.org Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 77CC3C433F5 for ; Thu, 10 Feb 2022 21:42:48 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1344740AbiBJVmp (ORCPT ); Thu, 10 Feb 2022 16:42:45 -0500 Received: from mxb-00190b01.gslb.pphosted.com ([23.128.96.19]:53196 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1344766AbiBJVmo (ORCPT ); Thu, 10 Feb 2022 16:42:44 -0500 Received: from mail-pj1-x1032.google.com (mail-pj1-x1032.google.com [IPv6:2607:f8b0:4864:20::1032]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7052B197 for ; Thu, 10 Feb 2022 13:42:44 -0800 (PST) Received: by mail-pj1-x1032.google.com with SMTP id t4-20020a17090a510400b001b8c4a6cd5dso6893690pjh.5 for ; Thu, 10 Feb 2022 13:42:44 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=o7qxZjiOeYyr10sIEQm2OIgJQXTVAJpUcNUmvwaLp6s=; b=L+mJDbFwAnllOUL2CeVfIK8UxsD4IgxBVal6MdpZNojuFtbs11kvmenNwl8LwInFFw Gb8C6Us7OOQr4bsrLDlhnTlznA5IMkV4Fh78vEbobUBUg0npzA6U3ZbJaAtEfA0ZDyoA IBTrn5xd+n1gbYTXv6nwS1pmdTTry3nmrvXj/gxWtYmWziXG3efo2y+FbRZEBlofBOqE rJiWy4UOfgKopX1qGEDFra/JQu8tYZJsJMzSbYpBiiynWwPQHYyGERXQvBSZVpYd4ho6 St2/hPmEqO5uc25TcvMrwIIW3v07WTHZHg3eO+mEzOZ2BDmYs8KXN8wmEyBnoe0ZZqwH drLA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=o7qxZjiOeYyr10sIEQm2OIgJQXTVAJpUcNUmvwaLp6s=; b=ahymY/8QVP++Q7LU/2oMPGDKs/bkc9yKAAWjPmVc1qgr06OGCiP1ovOBpfhHdyJ1Kq Nb2UqSJIQz86rXzE8AS7oz0hXcL/NMqcNPVlT8wj8DbyDJ4itTroVKH2kd4l4RSCftbJ L/T1neFmJHpViFLlLRrpjSTnEs5e1szj2hlHsoCmkfu/CsCn5RxxLuY4IDjd0sm9UzrU Ghg/sO3s7E2gEseWu04ktV+2RZHdO/CA38wR5lZIMs1esPmU0aXHIQ5Y2L2g1UeqWWUF P3jMK6DBjMU/OrXhpX0ZkchzR6vnTIoVHbCDAfejI6JinVSnLZfAVqOtC5xI4tAnVoVn gzGQ== X-Gm-Message-State: AOAM532X+Yw8LvzVVWugjdEuiI4vfZ6LEaFBOJ6Aw2NpgcDu7jb1ij5I ICEqOtN3es0cFUzWhK6qvHI= X-Google-Smtp-Source: ABdhPJwklsFKRkwhSQ2bfLxqK94nVQp5p/SGhUN/FDErL+ExPJQVGi3N8qFZKrxYxk774zgUjx8gMA== X-Received: by 2002:a17:902:eb8c:: with SMTP id q12mr9639354plg.131.1644529363968; Thu, 10 Feb 2022 13:42:43 -0800 (PST) Received: from edumazet1.svl.corp.google.com ([2620:15c:2c4:201:60c1:10c1:3f4f:199d]) by smtp.gmail.com with ESMTPSA id s19sm23824098pfu.34.2022.02.10.13.42.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 10 Feb 2022 13:42:43 -0800 (PST) From: Eric Dumazet To: "David S . Miller" , Jakub Kicinski Cc: netdev , Eric Dumazet , Mahesh Bandewar , Eric Dumazet Subject: [PATCH net-next 3/4] ipv6: add (struct uncached_list)->quarantine list Date: Thu, 10 Feb 2022 13:42:30 -0800 Message-Id: <20220210214231.2420942-4-eric.dumazet@gmail.com> X-Mailer: git-send-email 2.35.1.265.g69c8d7142f-goog In-Reply-To: <20220210214231.2420942-1-eric.dumazet@gmail.com> References: <20220210214231.2420942-1-eric.dumazet@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org X-Patchwork-Delegate: kuba@kernel.org From: Eric Dumazet This is an optimization to keep the per-cpu lists as short as possible: Whenever rt6_uncached_list_flush_dev() changes one rt6_info matching the disappearing device, it can can transfer the object to a quarantine list, waiting for a final rt6_uncached_list_del(). Signed-off-by: Eric Dumazet --- net/ipv6/route.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/net/ipv6/route.c b/net/ipv6/route.c index 5fc1a1de9481c859adc332746ccfcf237db6541f..6690666c9b0e32e7e801ac481876ea4aa31e4ead 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c @@ -130,6 +130,7 @@ static struct fib6_info *rt6_get_route_info(struct net *net, struct uncached_list { spinlock_t lock; struct list_head head; + struct list_head quarantine; }; static DEFINE_PER_CPU_ALIGNED(struct uncached_list, rt6_uncached_list); @@ -151,7 +152,7 @@ void rt6_uncached_list_del(struct rt6_info *rt) struct uncached_list *ul = rt->rt6i_uncached_list; spin_lock_bh(&ul->lock); - list_del(&rt->rt6i_uncached); + list_del_init(&rt->rt6i_uncached); spin_unlock_bh(&ul->lock); } } @@ -162,16 +163,21 @@ static void rt6_uncached_list_flush_dev(struct net_device *dev) for_each_possible_cpu(cpu) { struct uncached_list *ul = per_cpu_ptr(&rt6_uncached_list, cpu); - struct rt6_info *rt; + struct rt6_info *rt, *safe; + + if (list_empty(&ul->head)) + continue; spin_lock_bh(&ul->lock); - list_for_each_entry(rt, &ul->head, rt6i_uncached) { + list_for_each_entry_safe(rt, safe, &ul->head, rt6i_uncached) { struct inet6_dev *rt_idev = rt->rt6i_idev; struct net_device *rt_dev = rt->dst.dev; + bool handled = false; if (rt_idev->dev == dev) { rt->rt6i_idev = in6_dev_get(blackhole_netdev); in6_dev_put(rt_idev); + handled = true; } if (rt_dev == dev) { @@ -179,7 +185,11 @@ static void rt6_uncached_list_flush_dev(struct net_device *dev) dev_replace_track(rt_dev, blackhole_netdev, &rt->dst.dev_tracker, GFP_ATOMIC); + handled = true; } + if (handled) + list_move(&rt->rt6i_uncached, + &ul->quarantine); } spin_unlock_bh(&ul->lock); } @@ -6721,6 +6731,7 @@ int __init ip6_route_init(void) struct uncached_list *ul = per_cpu_ptr(&rt6_uncached_list, cpu); INIT_LIST_HEAD(&ul->head); + INIT_LIST_HEAD(&ul->quarantine); spin_lock_init(&ul->lock); } From patchwork Thu Feb 10 21:42:31 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eric Dumazet X-Patchwork-Id: 12742443 X-Patchwork-Delegate: kuba@kernel.org Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 43863C433F5 for ; Thu, 10 Feb 2022 21:43:03 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1344769AbiBJVmy (ORCPT ); Thu, 10 Feb 2022 16:42:54 -0500 Received: from mxb-00190b01.gslb.pphosted.com ([23.128.96.19]:54216 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1344780AbiBJVmw (ORCPT ); Thu, 10 Feb 2022 16:42:52 -0500 Received: from mail-pl1-x636.google.com (mail-pl1-x636.google.com [IPv6:2607:f8b0:4864:20::636]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 153D838F for ; Thu, 10 Feb 2022 13:42:46 -0800 (PST) Received: by mail-pl1-x636.google.com with SMTP id 10so3027719plj.1 for ; Thu, 10 Feb 2022 13:42:46 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=qI5O0XuH+3yZN0d/+QqH9VaLKw3dLC9zY6iO3x506DA=; b=EXs9V/xVK+IAYNTRR+AmIyZxuXxMcDUz7tI5ZFVNgXKfDqA2vXK5abCJT+J8xeJMIG p6a9u3yT9iGNNL5QS+CkSgmHPOarKTJkF2o0sERcGL39vG005OfbKbKsWP6lVY0Oyddi NAXHzVr7WyjthyI2xe+HgSrusse5SnQ6SGoLYvh/hHXQXqoPHN9Zj10qeJks4kQWy6fv l4qyH13+AAQ47luHr8urgRsW3f0CXZ35lATesHoeBO/C7MbjqAPpf/n0wUqJOOCNnae1 fF7IVV1nmQ6EDMN9Mkk6bJWDTC3/FJ2E/Gq+jyS5kzVJfzB4/cfRe1oWOh3b9dXb8MsQ yj3g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=qI5O0XuH+3yZN0d/+QqH9VaLKw3dLC9zY6iO3x506DA=; b=PduF/PHKVdonskV0SpSnKrjW2XFSAIBv+e3lKzG0pBYdYBLeiXIeoVEU/we4xFT2kK 1S/YwLKRS+zW8CfbZSTNw38PqZIFFClZd1Z4WjlOuwy1RP8sEMkhf0Ku58+CkZBLpEj9 vbmrfkcbW7LwEI4Jjf8RTDUHB6ub/ufaljf+vb0pNwJqq0nMARI3kGB0YpyVO270sr3t guS76+mSMvMu3ko0grHzcmsYHbCrdZGHoAR5hjMfq07GhXLOAfgWXLpc4vtHy2aNqMSS zKAieHr9WlQBy/qKPj+eilfugb/sStoG6yGdiD2gO+h5j8SH+VjA3W76FoBeQ8Xe1BlU A3nw== X-Gm-Message-State: AOAM531H6R2T+nuocuWx933PXMEM+KUnuns97H6QFWTQdo9VmXcnaFIG Cha8tXB3AmQUGLGXFZpvLyP4ForpmXM= X-Google-Smtp-Source: ABdhPJwzm6SrY7xfxPQJpyCyj4QpIcFZlyQa24LtLH/zSue2L0AFvJQ+rblCww9ZZoyXUaC9XFg42Q== X-Received: by 2002:a17:902:ccd0:: with SMTP id z16mr9632442ple.13.1644529366581; Thu, 10 Feb 2022 13:42:46 -0800 (PST) Received: from edumazet1.svl.corp.google.com ([2620:15c:2c4:201:60c1:10c1:3f4f:199d]) by smtp.gmail.com with ESMTPSA id s19sm23824098pfu.34.2022.02.10.13.42.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 10 Feb 2022 13:42:45 -0800 (PST) From: Eric Dumazet To: "David S . Miller" , Jakub Kicinski Cc: netdev , Eric Dumazet , Mahesh Bandewar , Eric Dumazet Subject: [PATCH net-next 4/4] ipv4: add (struct uncached_list)->quarantine list Date: Thu, 10 Feb 2022 13:42:31 -0800 Message-Id: <20220210214231.2420942-5-eric.dumazet@gmail.com> X-Mailer: git-send-email 2.35.1.265.g69c8d7142f-goog In-Reply-To: <20220210214231.2420942-1-eric.dumazet@gmail.com> References: <20220210214231.2420942-1-eric.dumazet@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org X-Patchwork-Delegate: kuba@kernel.org From: Eric Dumazet This is an optimization to keep the per-cpu lists as short as possible: Whenever rt_flush_dev() changes one rtable dst.dev matching the disappearing device, it can can transfer the object to a quarantine list, waiting for a final rt_del_uncached_list(). Signed-off-by: Eric Dumazet --- net/ipv4/route.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/net/ipv4/route.c b/net/ipv4/route.c index 634766e6c7cc8a472e912f7d4e99bb6be0397bb6..202d6b1fff43fb095427720ec36fe3744aeb7149 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c @@ -1485,6 +1485,7 @@ static bool rt_cache_route(struct fib_nh_common *nhc, struct rtable *rt) struct uncached_list { spinlock_t lock; struct list_head head; + struct list_head quarantine; }; static DEFINE_PER_CPU_ALIGNED(struct uncached_list, rt_uncached_list); @@ -1506,7 +1507,7 @@ void rt_del_uncached_list(struct rtable *rt) struct uncached_list *ul = rt->rt_uncached_list; spin_lock_bh(&ul->lock); - list_del(&rt->rt_uncached); + list_del_init(&rt->rt_uncached); spin_unlock_bh(&ul->lock); } } @@ -1521,20 +1522,24 @@ static void ipv4_dst_destroy(struct dst_entry *dst) void rt_flush_dev(struct net_device *dev) { - struct rtable *rt; + struct rtable *rt, *safe; int cpu; for_each_possible_cpu(cpu) { struct uncached_list *ul = &per_cpu(rt_uncached_list, cpu); + if (list_empty(&ul->head)) + continue; + spin_lock_bh(&ul->lock); - list_for_each_entry(rt, &ul->head, rt_uncached) { + list_for_each_entry_safe(rt, safe, &ul->head, rt_uncached) { if (rt->dst.dev != dev) continue; rt->dst.dev = blackhole_netdev; dev_replace_track(dev, blackhole_netdev, &rt->dst.dev_tracker, GFP_ATOMIC); + list_move(&rt->rt_uncached, &ul->quarantine); } spin_unlock_bh(&ul->lock); } @@ -3706,6 +3711,7 @@ int __init ip_rt_init(void) struct uncached_list *ul = &per_cpu(rt_uncached_list, cpu); INIT_LIST_HEAD(&ul->head); + INIT_LIST_HEAD(&ul->quarantine); spin_lock_init(&ul->lock); } #ifdef CONFIG_IP_ROUTE_CLASSID