From patchwork Thu Feb 22 10:50:08 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eric Dumazet X-Patchwork-Id: 13567040 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-yb1-f202.google.com (mail-yb1-f202.google.com [209.85.219.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 03845405F4 for ; Thu, 22 Feb 2024 10:50:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1708599027; cv=none; b=NXp43nRdGruxdPPvh05STg/OUG5dz4bNyKqb/oZOJD/PuswWduvYJG6Ocl75bNoc1LBakEVQayX1ByI7gg4OC2nxcHd08gw0QB6c67z1BB6dSF/VLY4Kp6Frvoq6DPNaGalhphb7IxWEs5Z6sCv423KmpatknSYJXI0VTXxxqIg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1708599027; c=relaxed/simple; bh=24FW6iElS06uKgiA5Pl0q5efeDqn37dMPZJXKTFbSgE=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=iRKBZywm3fIHG4P+5lGWCmF6cFxh3bb+GsDfZSrcRo805s05gfw6NJdwvI7PaEHN2vMyLnGmSErRn5RA6XEoZhnvBpsth7h6jwP3LBf4ot3/q8fGS5R5UGnD2kNScCul/xtpttdVaS128F8h+I7Fib77bEuGyc2iLMUgjAstNd0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--edumazet.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=IM9SKYLE; arc=none smtp.client-ip=209.85.219.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--edumazet.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="IM9SKYLE" Received: by mail-yb1-f202.google.com with SMTP id 3f1490d57ef6-dcc05887ee9so9607093276.1 for ; Thu, 22 Feb 2024 02:50:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1708599025; x=1709203825; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=DIr9rYGLsaCc7qNWGLVCtVkmvuSVIbaWAGNMNlJV7qc=; b=IM9SKYLEvspNlxHoKQy00iHwSVy4sbeFDbwt+YBuu5yvxmbFF09F6UbbWd8/VtM15d 1yI7qCu/9yVQ1XAxqaf5rcX1HxrHvITBcy/e8OKlxhhQqafwZ7GpmMNgcRZ5nGt3Md/G 8RiVbhsDd6WpVnVX/jxPyQrYWXT56pn4UIiZnbdAaHBSFDgr5F5UOLhtIErhNbmrTgM4 rKlDvovEVRLsC6iUPH0hQhMG6EfbFDEPlTW1ii52ObfSsPFZyQeEBz98d9vdZTCEXLP8 chxVWd0SxE8zO8kfbMLTXHl/Sky7+k32z20Tfzu7MER08AuSbz7DGWyOAcaxkDodJT5P Yihg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1708599025; x=1709203825; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=DIr9rYGLsaCc7qNWGLVCtVkmvuSVIbaWAGNMNlJV7qc=; b=KngHlz7IdP7kO8vPWNGiZTN6a3e/GxpO+PblMUaJL7SLf6Q81UepJMAsyxfKsvphhO UjGa0+7DOiuFU0e9Qjepp+gPXM7GQqITgI/EXvu1XEttYpcJJFkZMMHZGNS2WTrHsy4n J5bcSGWNV4uCxvrlxY0i9dxzXk580bPwOCO34ixydujfTbWzaaKGQeBagIo19sp3V1ce Qg8ZiCMKoWYi5SH2sIUBLurw33T6LCOPfqmX7tNCiAuJZBx2UwX8y9pn4HM5Z+8N8sLQ mXYPErL6CMxP5TBBJWGjmCPbO5q3lnNT3t2Suzbb993GT4jlD/Bia61aeIjjDctDD4+X kjNA== X-Gm-Message-State: AOJu0Ywq6j9GlK3wjSr/MnFz4fBncT9M4HzZqHPEbPTcVY9iysCaprmb AgW9z6KPGFTGKooWjqq8GolLYGjf4/qXn6Te7Kdi3qlKbU+oq5ros2TuM0uvvf+UbLw0cLapI6Q pVKuGre+yqg== X-Google-Smtp-Source: AGHT+IF6NPwUc2EikrViIppg8LQX10oUb+YfaRsEqdceB4uQ/B5pUHbHTNHKyanZr4TBQ9A1/fB6yuvJJPdo7Q== X-Received: from edumazet1.c.googlers.com ([fda3:e722:ac3:cc00:2b:7d90:c0a8:395a]) (user=edumazet job=sendgmr) by 2002:a05:6902:1008:b0:dbe:387d:a8ef with SMTP id w8-20020a056902100800b00dbe387da8efmr58636ybt.1.1708599025070; Thu, 22 Feb 2024 02:50:25 -0800 (PST) Date: Thu, 22 Feb 2024 10:50:08 +0000 In-Reply-To: <20240222105021.1943116-1-edumazet@google.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20240222105021.1943116-1-edumazet@google.com> X-Mailer: git-send-email 2.44.0.rc1.240.g4c46232300-goog Message-ID: <20240222105021.1943116-2-edumazet@google.com> Subject: [PATCH v2 net-next 01/14] rtnetlink: prepare nla_put_iflink() to run under RCU From: Eric Dumazet To: "David S . Miller" , Jakub Kicinski , Paolo Abeni Cc: netdev@vger.kernel.org, Ido Schimmel , Jiri Pirko , eric.dumazet@gmail.com, Eric Dumazet X-Patchwork-Delegate: kuba@kernel.org We want to be able to run rtnl_fill_ifinfo() under RCU protection instead of RTNL in the future. This patch prepares dev_get_iflink() and nla_put_iflink() to run either with RTNL or RCU held. Signed-off-by: Eric Dumazet --- drivers/infiniband/ulp/ipoib/ipoib_main.c | 4 ++-- drivers/net/can/vxcan.c | 2 +- drivers/net/ethernet/qualcomm/rmnet/rmnet_vnd.c | 2 +- drivers/net/ipvlan/ipvlan_main.c | 2 +- drivers/net/macsec.c | 2 +- drivers/net/macvlan.c | 2 +- drivers/net/netkit.c | 2 +- drivers/net/veth.c | 2 +- drivers/net/wireless/virtual/virt_wifi.c | 2 +- net/8021q/vlan_dev.c | 4 ++-- net/core/dev.c | 2 +- net/core/rtnetlink.c | 6 +++--- net/dsa/user.c | 2 +- net/ieee802154/6lowpan/core.c | 2 +- net/ipv6/ip6_tunnel.c | 2 +- net/xfrm/xfrm_interface_core.c | 2 +- 16 files changed, 20 insertions(+), 20 deletions(-) diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c index 7a5be705d71830d5bb3aa26a96a4463df03883a4..6f2a688fccbfb02ae7bdf3d55cca0e77fa9b56b4 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_main.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c @@ -1272,10 +1272,10 @@ static int ipoib_get_iflink(const struct net_device *dev) /* parent interface */ if (!test_bit(IPOIB_FLAG_SUBINTERFACE, &priv->flags)) - return dev->ifindex; + return READ_ONCE(dev->ifindex); /* child/vlan interface */ - return priv->parent->ifindex; + return READ_ONCE(priv->parent->ifindex); } static u32 ipoib_addr_hash(struct ipoib_neigh_hash *htbl, u8 *daddr) diff --git a/drivers/net/can/vxcan.c b/drivers/net/can/vxcan.c index 98c669ad5141479b509ee924ddba3da6bca554cd..f7fabba707ea640cab8863e63bb19294e333ba2c 100644 --- a/drivers/net/can/vxcan.c +++ b/drivers/net/can/vxcan.c @@ -119,7 +119,7 @@ static int vxcan_get_iflink(const struct net_device *dev) rcu_read_lock(); peer = rcu_dereference(priv->peer); - iflink = peer ? peer->ifindex : 0; + iflink = peer ? READ_ONCE(peer->ifindex) : 0; rcu_read_unlock(); return iflink; diff --git a/drivers/net/ethernet/qualcomm/rmnet/rmnet_vnd.c b/drivers/net/ethernet/qualcomm/rmnet/rmnet_vnd.c index 046b5f7d8e7cab33a9f09079858bac2a972e968a..9d2a9562c96ff4937da7a389c773acce01508ca3 100644 --- a/drivers/net/ethernet/qualcomm/rmnet/rmnet_vnd.c +++ b/drivers/net/ethernet/qualcomm/rmnet/rmnet_vnd.c @@ -98,7 +98,7 @@ static int rmnet_vnd_get_iflink(const struct net_device *dev) { struct rmnet_priv *priv = netdev_priv(dev); - return priv->real_dev->ifindex; + return READ_ONCE(priv->real_dev->ifindex); } static int rmnet_vnd_init(struct net_device *dev) diff --git a/drivers/net/ipvlan/ipvlan_main.c b/drivers/net/ipvlan/ipvlan_main.c index df7c43a109e1a7376c6ce3216cb3dd4223eac04c..5920f7e6335230cf07a3da528e4ac7a050c2fd41 100644 --- a/drivers/net/ipvlan/ipvlan_main.c +++ b/drivers/net/ipvlan/ipvlan_main.c @@ -349,7 +349,7 @@ static int ipvlan_get_iflink(const struct net_device *dev) { struct ipvl_dev *ipvlan = netdev_priv(dev); - return ipvlan->phy_dev->ifindex; + return READ_ONCE(ipvlan->phy_dev->ifindex); } static const struct net_device_ops ipvlan_netdev_ops = { diff --git a/drivers/net/macsec.c b/drivers/net/macsec.c index 7f5426285c61b1e35afd74d4c044f80c77f34e7f..4b5513c9c2befe42e054fee6ecdadc9aabb0ce19 100644 --- a/drivers/net/macsec.c +++ b/drivers/net/macsec.c @@ -3753,7 +3753,7 @@ static void macsec_get_stats64(struct net_device *dev, static int macsec_get_iflink(const struct net_device *dev) { - return macsec_priv(dev)->real_dev->ifindex; + return READ_ONCE(macsec_priv(dev)->real_dev->ifindex); } static const struct net_device_ops macsec_netdev_ops = { diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c index a3cc665757e8727d3ffb24d8dbfbcd321fc93ffd..0cec2783a3e712b7769572482bf59aa336b9ca15 100644 --- a/drivers/net/macvlan.c +++ b/drivers/net/macvlan.c @@ -1158,7 +1158,7 @@ static int macvlan_dev_get_iflink(const struct net_device *dev) { struct macvlan_dev *vlan = netdev_priv(dev); - return vlan->lowerdev->ifindex; + return READ_ONCE(vlan->lowerdev->ifindex); } static const struct ethtool_ops macvlan_ethtool_ops = { diff --git a/drivers/net/netkit.c b/drivers/net/netkit.c index 39171380ccf29e27412bb2b9cee7102acc4a83ab..a4d2e76a8d587cc6ce7ad7f98e382a1c81f76e67 100644 --- a/drivers/net/netkit.c +++ b/drivers/net/netkit.c @@ -145,7 +145,7 @@ static int netkit_get_iflink(const struct net_device *dev) rcu_read_lock(); peer = rcu_dereference(nk->peer); if (peer) - iflink = peer->ifindex; + iflink = READ_ONCE(peer->ifindex); rcu_read_unlock(); return iflink; } diff --git a/drivers/net/veth.c b/drivers/net/veth.c index 500b9dfccd08ee8f91b22d78e3d8195f3de26088..dd5aa8ab65a865dc9dbaa596861671d189bfe1af 100644 --- a/drivers/net/veth.c +++ b/drivers/net/veth.c @@ -1461,7 +1461,7 @@ static int veth_get_iflink(const struct net_device *dev) rcu_read_lock(); peer = rcu_dereference(priv->peer); - iflink = peer ? peer->ifindex : 0; + iflink = peer ? READ_ONCE(peer->ifindex) : 0; rcu_read_unlock(); return iflink; diff --git a/drivers/net/wireless/virtual/virt_wifi.c b/drivers/net/wireless/virtual/virt_wifi.c index ba14d83353a4b226e44d420a16e33460a9dc762d..6a84ec58d618bcbf966dab6e38cfe02b886a712f 100644 --- a/drivers/net/wireless/virtual/virt_wifi.c +++ b/drivers/net/wireless/virtual/virt_wifi.c @@ -453,7 +453,7 @@ static int virt_wifi_net_device_get_iflink(const struct net_device *dev) { struct virt_wifi_netdev_priv *priv = netdev_priv(dev); - return priv->lowerdev->ifindex; + return READ_ONCE(priv->lowerdev->ifindex); } static const struct net_device_ops virt_wifi_ops = { diff --git a/net/8021q/vlan_dev.c b/net/8021q/vlan_dev.c index df55525182517e49b2cfbffe7f102967c66b5952..39876eff51d21f830c3bde1682e07aac698c633e 100644 --- a/net/8021q/vlan_dev.c +++ b/net/8021q/vlan_dev.c @@ -762,9 +762,9 @@ static void vlan_dev_netpoll_cleanup(struct net_device *dev) static int vlan_dev_get_iflink(const struct net_device *dev) { - struct net_device *real_dev = vlan_dev_priv(dev)->real_dev; + const struct net_device *real_dev = vlan_dev_priv(dev)->real_dev; - return real_dev->ifindex; + return READ_ONCE(real_dev->ifindex); } static int vlan_dev_fill_forward_path(struct net_device_path_ctx *ctx, diff --git a/net/core/dev.c b/net/core/dev.c index c588808be77f563c429eb4a2eaee5c8062d99582..0628d8ff1ed932efdd45ab7b79599dcfcca6c4eb 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -641,7 +641,7 @@ int dev_get_iflink(const struct net_device *dev) if (dev->netdev_ops && dev->netdev_ops->ndo_get_iflink) return dev->netdev_ops->ndo_get_iflink(dev); - return dev->ifindex; + return READ_ONCE(dev->ifindex); } EXPORT_SYMBOL(dev_get_iflink); diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index c54dbe05c4c5df126d0b58403049ebc1d272907e..060543fe7919c13c7a5c6cf22f9e7606d0897345 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c @@ -1611,10 +1611,10 @@ static int put_master_ifindex(struct sk_buff *skb, struct net_device *dev) static int nla_put_iflink(struct sk_buff *skb, const struct net_device *dev, bool force) { - int ifindex = dev_get_iflink(dev); + int iflink = dev_get_iflink(dev); - if (force || dev->ifindex != ifindex) - return nla_put_u32(skb, IFLA_LINK, ifindex); + if (force || READ_ONCE(dev->ifindex) != iflink) + return nla_put_u32(skb, IFLA_LINK, iflink); return 0; } diff --git a/net/dsa/user.c b/net/dsa/user.c index 4d53c76a9840a789511b9ee0d9a39c70de77f72c..9c42a6edcdc8a8de94241ce4a238f31583b738ec 100644 --- a/net/dsa/user.c +++ b/net/dsa/user.c @@ -352,7 +352,7 @@ void dsa_user_mii_bus_init(struct dsa_switch *ds) /* user device handling ****************************************************/ static int dsa_user_get_iflink(const struct net_device *dev) { - return dsa_user_to_conduit(dev)->ifindex; + return READ_ONCE(dsa_user_to_conduit(dev)->ifindex); } static int dsa_user_open(struct net_device *dev) diff --git a/net/ieee802154/6lowpan/core.c b/net/ieee802154/6lowpan/core.c index e643f52663f9bed8c4707b205a73d0d2bad5bb73..77b4e92027c5dfdadefc3019ca82ee8967a9006e 100644 --- a/net/ieee802154/6lowpan/core.c +++ b/net/ieee802154/6lowpan/core.c @@ -93,7 +93,7 @@ static int lowpan_neigh_construct(struct net_device *dev, struct neighbour *n) static int lowpan_get_iflink(const struct net_device *dev) { - return lowpan_802154_dev(dev)->wdev->ifindex; + return READ_ONCE(lowpan_802154_dev(dev)->wdev->ifindex); } static const struct net_device_ops lowpan_netdev_ops = { diff --git a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c index 44406c28445dc457fb47a7cdec295778eb30b31f..5fd07581efafe3c57cc8732ddaae9910d6726f30 100644 --- a/net/ipv6/ip6_tunnel.c +++ b/net/ipv6/ip6_tunnel.c @@ -1756,7 +1756,7 @@ int ip6_tnl_get_iflink(const struct net_device *dev) { struct ip6_tnl *t = netdev_priv(dev); - return t->parms.link; + return READ_ONCE(t->parms.link); } EXPORT_SYMBOL(ip6_tnl_get_iflink); diff --git a/net/xfrm/xfrm_interface_core.c b/net/xfrm/xfrm_interface_core.c index dafefef3cf51a79fd6701a8b78c3f8fcfd10615d..717855b9acf1c413d506f681aec636af9b075af5 100644 --- a/net/xfrm/xfrm_interface_core.c +++ b/net/xfrm/xfrm_interface_core.c @@ -727,7 +727,7 @@ static int xfrmi_get_iflink(const struct net_device *dev) { struct xfrm_if *xi = netdev_priv(dev); - return xi->p.link; + return READ_ONCE(xi->p.link); } static const struct net_device_ops xfrmi_netdev_ops = { From patchwork Thu Feb 22 10:50:09 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eric Dumazet X-Patchwork-Id: 13567041 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-yw1-f201.google.com (mail-yw1-f201.google.com [209.85.128.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A948E42078 for ; Thu, 22 Feb 2024 10:50:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1708599029; cv=none; b=h8n0VN01dgmLerM2GWhxRUy26OgH86SINTATNDyU0fS6ecHahaznGmGe3GE3VBjrq9MA/gGNzpXXVaQss8tiS/zeSpK7B03JA7fsZdU3zIXQEDV8r3yB09MM/gcx5Rm021GZimuO/qZ9znxmzUcTn9OxhDGwcbo6b0sLtqitfls= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1708599029; c=relaxed/simple; bh=fcmBwIN58IJiOTUEkR60uxcVdVJsSDOo5yd3gkSEC7I=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=fBHW32ig48EmxylHId91I0aCcHA7r8qU3+0RrVp7qw85ixjk1849N4R+NqOqfcBeUWdOj0WWnbdZAsKiITyTVn9hAeMsaRawg9Ol9fwHZWKcAW8eZHWKcIvERu6rD+yf8D76El/QfYHaUx1aEpsSI5rb35bh0KXSk7MzBigUYeY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--edumazet.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=LvlUcLR7; arc=none smtp.client-ip=209.85.128.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--edumazet.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="LvlUcLR7" Received: by mail-yw1-f201.google.com with SMTP id 00721157ae682-5efe82b835fso171540257b3.0 for ; Thu, 22 Feb 2024 02:50:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1708599026; x=1709203826; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=gObX+menG7WcbaSJNBmjWE+0+fNG0eboaHUR8hglJLs=; b=LvlUcLR7MDX7xsBTOrwEceTtSsi6bi3v4NJbD2TLENfGPkf5r2Y5hAvq4TVm++9FuM 6+iwOoAesTvj3lhbDWDOwbGApmh9YTCr45/fNRSdQyq2YDcJdvSrzuLjCzLOrAfz2C9u 74gaIF8JfSWAd7NocvThiBimvotFfPrQrZz1ndOmHxldfVMDJmH7UlT98/UiP016YjSG WCnAsY3CqWjplsA926yiXdI2GoA/vW878SmH3MqQP7rs3Ph9IZXvPuJX6ygQPeRQB1YM 2z5lY4khL59xk0xhyPSagWO2J7nOFnU9Dqx+RFdIF+IdEv2BSMPZFawTJRhNFDEinIhm TmYg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1708599026; x=1709203826; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=gObX+menG7WcbaSJNBmjWE+0+fNG0eboaHUR8hglJLs=; b=L4E7hIXTCBSgqQ6Pt0tAKCbdtr1hzOkggqAhYI5GuH6gOl/s6q8GvtwaCLBECRtxSb vpx4SXOHaAF6lFm5dxL3bi4pnyrDYlW5GBXLXRv/Cd5iC5FTzsNGMU3AuBuX1E6YYYfL 5QfSGl8ri2s1T1IQJy/zfGCwpy3o3QbdYKqYUvHEzGjjOW04j7tsn44qr68jGqilzW35 Vj/URsZx68MId/W8S+WVOPAoSB+xaUvWgNkgG8IyEI7UisV/d2IoZh3nk1sysLTD+wWb U4RE1YpUZT3BVLk7TaOY/wO/eq2zWYK24k8RG7h4x5wB1BGE7QekRNJKTaMN24/2BxJ7 qDPA== X-Gm-Message-State: AOJu0Yx7KU9o2CsZ+7xLKizJLl/H6pI7zT3vAB5IY7505YWDCj1Cp/ca MWIHoKkZ2JFzuNJtbWY2KmdqSMS56MV+HBe2yevWkiqoM/GrbLFuDw+vK//9nOGhdOSlo/OhZEy 90sxgJEhryg== X-Google-Smtp-Source: AGHT+IElmZKaA0bbKvqMp8wWvSvYVvRh/4tCOCbPXsQFcPIPMjc97w8DdFI1Wnvmv7vxKQeqD+FL9UOhggwzrQ== X-Received: from edumazet1.c.googlers.com ([fda3:e722:ac3:cc00:2b:7d90:c0a8:395a]) (user=edumazet job=sendgmr) by 2002:a25:9009:0:b0:dc7:9218:df47 with SMTP id s9-20020a259009000000b00dc79218df47mr545652ybl.5.1708599026561; Thu, 22 Feb 2024 02:50:26 -0800 (PST) Date: Thu, 22 Feb 2024 10:50:09 +0000 In-Reply-To: <20240222105021.1943116-1-edumazet@google.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20240222105021.1943116-1-edumazet@google.com> X-Mailer: git-send-email 2.44.0.rc1.240.g4c46232300-goog Message-ID: <20240222105021.1943116-3-edumazet@google.com> Subject: [PATCH v2 net-next 02/14] ipv6: prepare inet6_fill_ifla6_attrs() for RCU From: Eric Dumazet To: "David S . Miller" , Jakub Kicinski , Paolo Abeni Cc: netdev@vger.kernel.org, Ido Schimmel , Jiri Pirko , eric.dumazet@gmail.com, Eric Dumazet X-Patchwork-Delegate: kuba@kernel.org We want to no longer hold RTNL while calling inet6_fill_ifla6_attrs() in the future. Add needed READ_ONCE()/WRITE_ONCE() annotations. Signed-off-by: Eric Dumazet Reviewed-by: Donald Hunter --- net/ipv6/addrconf.c | 163 ++++++++++++++++++++++++-------------------- net/ipv6/ndisc.c | 2 +- 2 files changed, 90 insertions(+), 75 deletions(-) diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index d3f4b7b9cf1fe380757225a110153fbad51bf763..3c8bdad0105dc9542489b612890ba86de9c44bdc 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c @@ -3477,7 +3477,8 @@ static void addrconf_dev_config(struct net_device *dev) /* this device type has no EUI support */ if (dev->type == ARPHRD_NONE && idev->cnf.addr_gen_mode == IN6_ADDR_GEN_MODE_EUI64) - idev->cnf.addr_gen_mode = IN6_ADDR_GEN_MODE_RANDOM; + WRITE_ONCE(idev->cnf.addr_gen_mode, + IN6_ADDR_GEN_MODE_RANDOM); addrconf_addr_gen(idev, false); } @@ -3749,7 +3750,7 @@ static int addrconf_notify(struct notifier_block *this, unsigned long event, rt6_mtu_change(dev, dev->mtu); idev->cnf.mtu6 = dev->mtu; } - idev->tstamp = jiffies; + WRITE_ONCE(idev->tstamp, jiffies); inet6_ifinfo_notify(RTM_NEWLINK, idev); /* @@ -3991,7 +3992,7 @@ static int addrconf_ifdown(struct net_device *dev, bool unregister) ipv6_mc_down(idev); } - idev->tstamp = jiffies; + WRITE_ONCE(idev->tstamp, jiffies); idev->ra_mtu = 0; /* Last: Shot the device (if unregistered) */ @@ -5619,87 +5620,97 @@ static void inet6_ifa_notify(int event, struct inet6_ifaddr *ifa) rtnl_set_sk_err(net, RTNLGRP_IPV6_IFADDR, err); } -static inline void ipv6_store_devconf(struct ipv6_devconf *cnf, - __s32 *array, int bytes) +static void ipv6_store_devconf(const struct ipv6_devconf *cnf, + __s32 *array, int bytes) { BUG_ON(bytes < (DEVCONF_MAX * 4)); memset(array, 0, bytes); - array[DEVCONF_FORWARDING] = cnf->forwarding; - array[DEVCONF_HOPLIMIT] = cnf->hop_limit; - array[DEVCONF_MTU6] = cnf->mtu6; - array[DEVCONF_ACCEPT_RA] = cnf->accept_ra; - array[DEVCONF_ACCEPT_REDIRECTS] = cnf->accept_redirects; - array[DEVCONF_AUTOCONF] = cnf->autoconf; - array[DEVCONF_DAD_TRANSMITS] = cnf->dad_transmits; - array[DEVCONF_RTR_SOLICITS] = cnf->rtr_solicits; + array[DEVCONF_FORWARDING] = READ_ONCE(cnf->forwarding); + array[DEVCONF_HOPLIMIT] = READ_ONCE(cnf->hop_limit); + array[DEVCONF_MTU6] = READ_ONCE(cnf->mtu6); + array[DEVCONF_ACCEPT_RA] = READ_ONCE(cnf->accept_ra); + array[DEVCONF_ACCEPT_REDIRECTS] = READ_ONCE(cnf->accept_redirects); + array[DEVCONF_AUTOCONF] = READ_ONCE(cnf->autoconf); + array[DEVCONF_DAD_TRANSMITS] = READ_ONCE(cnf->dad_transmits); + array[DEVCONF_RTR_SOLICITS] = READ_ONCE(cnf->rtr_solicits); array[DEVCONF_RTR_SOLICIT_INTERVAL] = - jiffies_to_msecs(cnf->rtr_solicit_interval); + jiffies_to_msecs(READ_ONCE(cnf->rtr_solicit_interval)); array[DEVCONF_RTR_SOLICIT_MAX_INTERVAL] = - jiffies_to_msecs(cnf->rtr_solicit_max_interval); + jiffies_to_msecs(READ_ONCE(cnf->rtr_solicit_max_interval)); array[DEVCONF_RTR_SOLICIT_DELAY] = - jiffies_to_msecs(cnf->rtr_solicit_delay); - array[DEVCONF_FORCE_MLD_VERSION] = cnf->force_mld_version; + jiffies_to_msecs(READ_ONCE(cnf->rtr_solicit_delay)); + array[DEVCONF_FORCE_MLD_VERSION] = READ_ONCE(cnf->force_mld_version); array[DEVCONF_MLDV1_UNSOLICITED_REPORT_INTERVAL] = - jiffies_to_msecs(cnf->mldv1_unsolicited_report_interval); + jiffies_to_msecs(READ_ONCE(cnf->mldv1_unsolicited_report_interval)); array[DEVCONF_MLDV2_UNSOLICITED_REPORT_INTERVAL] = - jiffies_to_msecs(cnf->mldv2_unsolicited_report_interval); - array[DEVCONF_USE_TEMPADDR] = cnf->use_tempaddr; - array[DEVCONF_TEMP_VALID_LFT] = cnf->temp_valid_lft; - array[DEVCONF_TEMP_PREFERED_LFT] = cnf->temp_prefered_lft; - array[DEVCONF_REGEN_MAX_RETRY] = cnf->regen_max_retry; - array[DEVCONF_MAX_DESYNC_FACTOR] = cnf->max_desync_factor; - array[DEVCONF_MAX_ADDRESSES] = cnf->max_addresses; - array[DEVCONF_ACCEPT_RA_DEFRTR] = cnf->accept_ra_defrtr; - array[DEVCONF_RA_DEFRTR_METRIC] = cnf->ra_defrtr_metric; - array[DEVCONF_ACCEPT_RA_MIN_HOP_LIMIT] = cnf->accept_ra_min_hop_limit; - array[DEVCONF_ACCEPT_RA_PINFO] = cnf->accept_ra_pinfo; + jiffies_to_msecs(READ_ONCE(cnf->mldv2_unsolicited_report_interval)); + array[DEVCONF_USE_TEMPADDR] = READ_ONCE(cnf->use_tempaddr); + array[DEVCONF_TEMP_VALID_LFT] = READ_ONCE(cnf->temp_valid_lft); + array[DEVCONF_TEMP_PREFERED_LFT] = READ_ONCE(cnf->temp_prefered_lft); + array[DEVCONF_REGEN_MAX_RETRY] = READ_ONCE(cnf->regen_max_retry); + array[DEVCONF_MAX_DESYNC_FACTOR] = READ_ONCE(cnf->max_desync_factor); + array[DEVCONF_MAX_ADDRESSES] = READ_ONCE(cnf->max_addresses); + array[DEVCONF_ACCEPT_RA_DEFRTR] = READ_ONCE(cnf->accept_ra_defrtr); + array[DEVCONF_RA_DEFRTR_METRIC] = READ_ONCE(cnf->ra_defrtr_metric); + array[DEVCONF_ACCEPT_RA_MIN_HOP_LIMIT] = + READ_ONCE(cnf->accept_ra_min_hop_limit); + array[DEVCONF_ACCEPT_RA_PINFO] = READ_ONCE(cnf->accept_ra_pinfo); #ifdef CONFIG_IPV6_ROUTER_PREF - array[DEVCONF_ACCEPT_RA_RTR_PREF] = cnf->accept_ra_rtr_pref; + array[DEVCONF_ACCEPT_RA_RTR_PREF] = READ_ONCE(cnf->accept_ra_rtr_pref); array[DEVCONF_RTR_PROBE_INTERVAL] = - jiffies_to_msecs(cnf->rtr_probe_interval); + jiffies_to_msecs(READ_ONCE(cnf->rtr_probe_interval)); #ifdef CONFIG_IPV6_ROUTE_INFO - array[DEVCONF_ACCEPT_RA_RT_INFO_MIN_PLEN] = cnf->accept_ra_rt_info_min_plen; - array[DEVCONF_ACCEPT_RA_RT_INFO_MAX_PLEN] = cnf->accept_ra_rt_info_max_plen; + array[DEVCONF_ACCEPT_RA_RT_INFO_MIN_PLEN] = + READ_ONCE(cnf->accept_ra_rt_info_min_plen); + array[DEVCONF_ACCEPT_RA_RT_INFO_MAX_PLEN] = + READ_ONCE(cnf->accept_ra_rt_info_max_plen); #endif #endif - array[DEVCONF_PROXY_NDP] = cnf->proxy_ndp; - array[DEVCONF_ACCEPT_SOURCE_ROUTE] = cnf->accept_source_route; + array[DEVCONF_PROXY_NDP] = READ_ONCE(cnf->proxy_ndp); + array[DEVCONF_ACCEPT_SOURCE_ROUTE] = + READ_ONCE(cnf->accept_source_route); #ifdef CONFIG_IPV6_OPTIMISTIC_DAD - array[DEVCONF_OPTIMISTIC_DAD] = cnf->optimistic_dad; - array[DEVCONF_USE_OPTIMISTIC] = cnf->use_optimistic; + array[DEVCONF_OPTIMISTIC_DAD] = READ_ONCE(cnf->optimistic_dad); + array[DEVCONF_USE_OPTIMISTIC] = READ_ONCE(cnf->use_optimistic); #endif #ifdef CONFIG_IPV6_MROUTE array[DEVCONF_MC_FORWARDING] = atomic_read(&cnf->mc_forwarding); #endif - array[DEVCONF_DISABLE_IPV6] = cnf->disable_ipv6; - array[DEVCONF_ACCEPT_DAD] = cnf->accept_dad; - array[DEVCONF_FORCE_TLLAO] = cnf->force_tllao; - array[DEVCONF_NDISC_NOTIFY] = cnf->ndisc_notify; - array[DEVCONF_SUPPRESS_FRAG_NDISC] = cnf->suppress_frag_ndisc; - array[DEVCONF_ACCEPT_RA_FROM_LOCAL] = cnf->accept_ra_from_local; - array[DEVCONF_ACCEPT_RA_MTU] = cnf->accept_ra_mtu; - array[DEVCONF_IGNORE_ROUTES_WITH_LINKDOWN] = cnf->ignore_routes_with_linkdown; + array[DEVCONF_DISABLE_IPV6] = READ_ONCE(cnf->disable_ipv6); + array[DEVCONF_ACCEPT_DAD] = READ_ONCE(cnf->accept_dad); + array[DEVCONF_FORCE_TLLAO] = READ_ONCE(cnf->force_tllao); + array[DEVCONF_NDISC_NOTIFY] = READ_ONCE(cnf->ndisc_notify); + array[DEVCONF_SUPPRESS_FRAG_NDISC] = + READ_ONCE(cnf->suppress_frag_ndisc); + array[DEVCONF_ACCEPT_RA_FROM_LOCAL] = + READ_ONCE(cnf->accept_ra_from_local); + array[DEVCONF_ACCEPT_RA_MTU] = READ_ONCE(cnf->accept_ra_mtu); + array[DEVCONF_IGNORE_ROUTES_WITH_LINKDOWN] = + READ_ONCE(cnf->ignore_routes_with_linkdown); /* we omit DEVCONF_STABLE_SECRET for now */ - array[DEVCONF_USE_OIF_ADDRS_ONLY] = cnf->use_oif_addrs_only; - array[DEVCONF_DROP_UNICAST_IN_L2_MULTICAST] = cnf->drop_unicast_in_l2_multicast; - array[DEVCONF_DROP_UNSOLICITED_NA] = cnf->drop_unsolicited_na; - array[DEVCONF_KEEP_ADDR_ON_DOWN] = cnf->keep_addr_on_down; - array[DEVCONF_SEG6_ENABLED] = cnf->seg6_enabled; + array[DEVCONF_USE_OIF_ADDRS_ONLY] = READ_ONCE(cnf->use_oif_addrs_only); + array[DEVCONF_DROP_UNICAST_IN_L2_MULTICAST] = + READ_ONCE(cnf->drop_unicast_in_l2_multicast); + array[DEVCONF_DROP_UNSOLICITED_NA] = READ_ONCE(cnf->drop_unsolicited_na); + array[DEVCONF_KEEP_ADDR_ON_DOWN] = READ_ONCE(cnf->keep_addr_on_down); + array[DEVCONF_SEG6_ENABLED] = READ_ONCE(cnf->seg6_enabled); #ifdef CONFIG_IPV6_SEG6_HMAC - array[DEVCONF_SEG6_REQUIRE_HMAC] = cnf->seg6_require_hmac; + array[DEVCONF_SEG6_REQUIRE_HMAC] = READ_ONCE(cnf->seg6_require_hmac); #endif - array[DEVCONF_ENHANCED_DAD] = cnf->enhanced_dad; - array[DEVCONF_ADDR_GEN_MODE] = cnf->addr_gen_mode; - array[DEVCONF_DISABLE_POLICY] = cnf->disable_policy; - array[DEVCONF_NDISC_TCLASS] = cnf->ndisc_tclass; - array[DEVCONF_RPL_SEG_ENABLED] = cnf->rpl_seg_enabled; - array[DEVCONF_IOAM6_ENABLED] = cnf->ioam6_enabled; - array[DEVCONF_IOAM6_ID] = cnf->ioam6_id; - array[DEVCONF_IOAM6_ID_WIDE] = cnf->ioam6_id_wide; - array[DEVCONF_NDISC_EVICT_NOCARRIER] = cnf->ndisc_evict_nocarrier; - array[DEVCONF_ACCEPT_UNTRACKED_NA] = cnf->accept_untracked_na; - array[DEVCONF_ACCEPT_RA_MIN_LFT] = cnf->accept_ra_min_lft; + array[DEVCONF_ENHANCED_DAD] = READ_ONCE(cnf->enhanced_dad); + array[DEVCONF_ADDR_GEN_MODE] = READ_ONCE(cnf->addr_gen_mode); + array[DEVCONF_DISABLE_POLICY] = READ_ONCE(cnf->disable_policy); + array[DEVCONF_NDISC_TCLASS] = READ_ONCE(cnf->ndisc_tclass); + array[DEVCONF_RPL_SEG_ENABLED] = READ_ONCE(cnf->rpl_seg_enabled); + array[DEVCONF_IOAM6_ENABLED] = READ_ONCE(cnf->ioam6_enabled); + array[DEVCONF_IOAM6_ID] = READ_ONCE(cnf->ioam6_id); + array[DEVCONF_IOAM6_ID_WIDE] = READ_ONCE(cnf->ioam6_id_wide); + array[DEVCONF_NDISC_EVICT_NOCARRIER] = + READ_ONCE(cnf->ndisc_evict_nocarrier); + array[DEVCONF_ACCEPT_UNTRACKED_NA] = + READ_ONCE(cnf->accept_untracked_na); + array[DEVCONF_ACCEPT_RA_MIN_LFT] = READ_ONCE(cnf->accept_ra_min_lft); } static inline size_t inet6_ifla6_size(void) @@ -5779,13 +5790,14 @@ static void snmp6_fill_stats(u64 *stats, struct inet6_dev *idev, int attrtype, static int inet6_fill_ifla6_attrs(struct sk_buff *skb, struct inet6_dev *idev, u32 ext_filter_mask) { - struct nlattr *nla; struct ifla_cacheinfo ci; + struct nlattr *nla; + u32 ra_mtu; - if (nla_put_u32(skb, IFLA_INET6_FLAGS, idev->if_flags)) + if (nla_put_u32(skb, IFLA_INET6_FLAGS, READ_ONCE(idev->if_flags))) goto nla_put_failure; ci.max_reasm_len = IPV6_MAXPLEN; - ci.tstamp = cstamp_delta(idev->tstamp); + ci.tstamp = cstamp_delta(READ_ONCE(idev->tstamp)); ci.reachable_time = jiffies_to_msecs(idev->nd_parms->reachable_time); ci.retrans_time = jiffies_to_msecs(NEIGH_VAR(idev->nd_parms, RETRANS_TIME)); if (nla_put(skb, IFLA_INET6_CACHEINFO, sizeof(ci), &ci)) @@ -5817,11 +5829,12 @@ static int inet6_fill_ifla6_attrs(struct sk_buff *skb, struct inet6_dev *idev, memcpy(nla_data(nla), idev->token.s6_addr, nla_len(nla)); read_unlock_bh(&idev->lock); - if (nla_put_u8(skb, IFLA_INET6_ADDR_GEN_MODE, idev->cnf.addr_gen_mode)) + if (nla_put_u8(skb, IFLA_INET6_ADDR_GEN_MODE, + READ_ONCE(idev->cnf.addr_gen_mode))) goto nla_put_failure; - if (idev->ra_mtu && - nla_put_u32(skb, IFLA_INET6_RA_MTU, idev->ra_mtu)) + ra_mtu = READ_ONCE(idev->ra_mtu); + if (ra_mtu && nla_put_u32(skb, IFLA_INET6_RA_MTU, ra_mtu)) goto nla_put_failure; return 0; @@ -6022,7 +6035,7 @@ static int inet6_set_link_af(struct net_device *dev, const struct nlattr *nla, if (tb[IFLA_INET6_ADDR_GEN_MODE]) { u8 mode = nla_get_u8(tb[IFLA_INET6_ADDR_GEN_MODE]); - idev->cnf.addr_gen_mode = mode; + WRITE_ONCE(idev->cnf.addr_gen_mode, mode); } return 0; @@ -6501,7 +6514,7 @@ static int addrconf_sysctl_addr_gen_mode(struct ctl_table *ctl, int write, } if (idev->cnf.addr_gen_mode != new_val) { - idev->cnf.addr_gen_mode = new_val; + WRITE_ONCE(idev->cnf.addr_gen_mode, new_val); addrconf_init_auto_addrs(idev->dev); } } else if (&net->ipv6.devconf_all->addr_gen_mode == ctl->data) { @@ -6512,7 +6525,8 @@ static int addrconf_sysctl_addr_gen_mode(struct ctl_table *ctl, int write, idev = __in6_dev_get(dev); if (idev && idev->cnf.addr_gen_mode != new_val) { - idev->cnf.addr_gen_mode = new_val; + WRITE_ONCE(idev->cnf.addr_gen_mode, + new_val); addrconf_init_auto_addrs(idev->dev); } } @@ -6577,14 +6591,15 @@ static int addrconf_sysctl_stable_secret(struct ctl_table *ctl, int write, struct inet6_dev *idev = __in6_dev_get(dev); if (idev) { - idev->cnf.addr_gen_mode = - IN6_ADDR_GEN_MODE_STABLE_PRIVACY; + WRITE_ONCE(idev->cnf.addr_gen_mode, + IN6_ADDR_GEN_MODE_STABLE_PRIVACY); } } } else { struct inet6_dev *idev = ctl->extra1; - idev->cnf.addr_gen_mode = IN6_ADDR_GEN_MODE_STABLE_PRIVACY; + WRITE_ONCE(idev->cnf.addr_gen_mode, + IN6_ADDR_GEN_MODE_STABLE_PRIVACY); } out: diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c index 73cb31afe93542285e3f11b7140d2cc1619006e7..8523f0595b01899a9f6cf82809c1b4bcfc233202 100644 --- a/net/ipv6/ndisc.c +++ b/net/ipv6/ndisc.c @@ -1975,7 +1975,7 @@ int ndisc_ifinfo_sysctl_change(struct ctl_table *ctl, int write, void *buffer, if (ctl->data == &NEIGH_VAR(idev->nd_parms, BASE_REACHABLE_TIME)) idev->nd_parms->reachable_time = neigh_rand_reach_time(NEIGH_VAR(idev->nd_parms, BASE_REACHABLE_TIME)); - idev->tstamp = jiffies; + WRITE_ONCE(idev->tstamp, jiffies); inet6_ifinfo_notify(RTM_NEWLINK, idev); in6_dev_put(idev); } From patchwork Thu Feb 22 10:50:10 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eric Dumazet X-Patchwork-Id: 13567042 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-yb1-f201.google.com (mail-yb1-f201.google.com [209.85.219.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D421F4439E for ; Thu, 22 Feb 2024 10:50:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1708599030; cv=none; b=kU3un4Eo4a64iigSo7spVwux6+vscDPL+4oGvTNW3fgZd0MR3cLZmjR3mBO8aAkQo3Qe1/S9RB4rzFHtQayuF5D8PVAbGlL7q0ibpG34d7Q7f2y2mWFLKVQU4Tro+xYt20Uyq0Dvj10jXFMyujEvLo2jTgJ0infJSRKiycPK/UU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1708599030; c=relaxed/simple; bh=RcqcDErl6lA4sLqE3Cw2HX80Icq/aN5kj3hhDH8zqyE=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=k0koeq9qsDBXowzKJT73EtUjBz3qjPRPwwJGtFhFfdECikD+vejFbSabvsYtsWxu8nx2oe56j9U4ZC7kbG9j7zZX30d71FfdB26S2miv4OxwVSB81GHKAmimfhZ0Wj+Q2bY58FKP4oSAL7io+mzop2UZW4V8ggFDDjUTODvJTUE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--edumazet.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=yUZcwo4m; arc=none smtp.client-ip=209.85.219.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--edumazet.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="yUZcwo4m" Received: by mail-yb1-f201.google.com with SMTP id 3f1490d57ef6-dc64b659a9cso13762716276.3 for ; Thu, 22 Feb 2024 02:50:28 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1708599028; x=1709203828; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=XoepgBYSf5d/A/v4bXmQgwvkojurMRkB/JCaRlBwAT8=; b=yUZcwo4mp6dB2BPjIMInTo7Ls6mzWP61TGyJh3HfGT8xcUMvfPfn470uqRItMBhdZL gE3kdwPc4IkbWc4maK7AwTNxiPEcT4T3in4mtQxUfc6JoUi9UmaXVCaYzuvpRcUjR5M8 7ANwn3POqHZK/+sF0f+IUrTXu8Sgl+K0F9RMtHxo2oQIbzAQvUo/y6bqdL1YuNx0jFeQ SFRqEL5fimMMY613/pb99mNJgJD6NmXn9qF+vfUwtN7gw6X24idG0AeYXfnFsmTrr6// Hsmj1NYJnk4AJO+dzl5ds7Z+yZW1On/ubwu9Zu3WmNyM3W2BuPOCtFfW11URLKoUdEld BxUA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1708599028; x=1709203828; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=XoepgBYSf5d/A/v4bXmQgwvkojurMRkB/JCaRlBwAT8=; b=b0dt8LBWUSLJtgtHMmXqH4cObv+MwEOkPnNvoq5YpZS6mjsRe7PpkK8mGEtTNnwzoT 1MTHHtUqSs97qfCQVQss//JvJEpQ0dTyBh13YGeX+dUoILOpJLPg/UnL7jIbIgO3kdLW XH0v0xlcbTKlemzUrpe1isbozF1d+5tsApY+FOwZ1HAizdfob4JToFR0SMEB4MaDuKxR y7U5IKMwRoWgRdnX/LA4k9y7JVnOA4CkVU0sUJPYzxp+3LqMigytl5RobCe3E8mV7sFG js+QNQ6M6LnC7e3EDjKa68kvMZeNIx6hjcCiuI/RxIOJWTtJ59hqDCLcw899QWtenqWg UUCg== X-Gm-Message-State: AOJu0YzmIyVQ6qjLIGmG7GA7toV5rN9K2JPUQHLwAcIOqiWGhPfvNpIi C7WWaS7Ii+MxTEcZc+Td8SyYfLmKE9XgpOBOR2/kIH1KY/15UUdu+uT0ZI1up2FNsKlptre78Ru QigEieVcx5Q== X-Google-Smtp-Source: AGHT+IE6E/mrOGFsOfEUFDOYGBow8q//YsHBvQZnLxtlfDCukXKEFJVCz93CzhjZN7ew6+Lm4npLj9dtKyRzxw== X-Received: from edumazet1.c.googlers.com ([fda3:e722:ac3:cc00:2b:7d90:c0a8:395a]) (user=edumazet job=sendgmr) by 2002:a05:6902:1109:b0:dc2:4ab7:3d89 with SMTP id o9-20020a056902110900b00dc24ab73d89mr508829ybu.1.1708599027861; Thu, 22 Feb 2024 02:50:27 -0800 (PST) Date: Thu, 22 Feb 2024 10:50:10 +0000 In-Reply-To: <20240222105021.1943116-1-edumazet@google.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20240222105021.1943116-1-edumazet@google.com> X-Mailer: git-send-email 2.44.0.rc1.240.g4c46232300-goog Message-ID: <20240222105021.1943116-4-edumazet@google.com> Subject: [PATCH v2 net-next 03/14] ipv6: prepare inet6_fill_ifinfo() for RCU protection From: Eric Dumazet To: "David S . Miller" , Jakub Kicinski , Paolo Abeni Cc: netdev@vger.kernel.org, Ido Schimmel , Jiri Pirko , eric.dumazet@gmail.com, Eric Dumazet X-Patchwork-Delegate: kuba@kernel.org We want to use RCU protection instead of RTNL for inet6_fill_ifinfo(). Signed-off-by: Eric Dumazet --- include/linux/netdevice.h | 6 ++++-- net/core/dev.c | 4 ++-- net/ipv6/addrconf.c | 11 +++++++---- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index f07c8374f29cb936fe11236fc63e06e741b1c965..09023e44db4e2c3a2133afc52ba5a335d6030646 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -4354,8 +4354,10 @@ static inline bool netif_testing(const struct net_device *dev) */ static inline bool netif_oper_up(const struct net_device *dev) { - return (dev->operstate == IF_OPER_UP || - dev->operstate == IF_OPER_UNKNOWN /* backward compat */); + unsigned int operstate = READ_ONCE(dev->operstate); + + return operstate == IF_OPER_UP || + operstate == IF_OPER_UNKNOWN /* backward compat */; } /** diff --git a/net/core/dev.c b/net/core/dev.c index 0628d8ff1ed932efdd45ab7b79599dcfcca6c4eb..275fd5259a4a92d0bd2e145d66a716248b6c2804 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -8632,12 +8632,12 @@ unsigned int dev_get_flags(const struct net_device *dev) { unsigned int flags; - flags = (dev->flags & ~(IFF_PROMISC | + flags = (READ_ONCE(dev->flags) & ~(IFF_PROMISC | IFF_ALLMULTI | IFF_RUNNING | IFF_LOWER_UP | IFF_DORMANT)) | - (dev->gflags & (IFF_PROMISC | + (READ_ONCE(dev->gflags) & (IFF_PROMISC | IFF_ALLMULTI)); if (netif_running(dev)) { diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index 3c8bdad0105dc9542489b612890ba86de9c44bdc..df3c6feea74e2d95144140eceb6df5cef2dce1f4 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c @@ -6047,6 +6047,7 @@ static int inet6_fill_ifinfo(struct sk_buff *skb, struct inet6_dev *idev, struct net_device *dev = idev->dev; struct ifinfomsg *hdr; struct nlmsghdr *nlh; + int ifindex, iflink; void *protoinfo; nlh = nlmsg_put(skb, portid, seq, event, sizeof(*hdr), flags); @@ -6057,16 +6058,18 @@ static int inet6_fill_ifinfo(struct sk_buff *skb, struct inet6_dev *idev, hdr->ifi_family = AF_INET6; hdr->__ifi_pad = 0; hdr->ifi_type = dev->type; - hdr->ifi_index = dev->ifindex; + ifindex = READ_ONCE(dev->ifindex); + hdr->ifi_index = ifindex; hdr->ifi_flags = dev_get_flags(dev); hdr->ifi_change = 0; + iflink = dev_get_iflink(dev); if (nla_put_string(skb, IFLA_IFNAME, dev->name) || (dev->addr_len && nla_put(skb, IFLA_ADDRESS, dev->addr_len, dev->dev_addr)) || - nla_put_u32(skb, IFLA_MTU, dev->mtu) || - (dev->ifindex != dev_get_iflink(dev) && - nla_put_u32(skb, IFLA_LINK, dev_get_iflink(dev))) || + nla_put_u32(skb, IFLA_MTU, READ_ONCE(dev->mtu)) || + (ifindex != iflink && + nla_put_u32(skb, IFLA_LINK, iflink)) || nla_put_u8(skb, IFLA_OPERSTATE, netif_running(dev) ? READ_ONCE(dev->operstate) : IF_OPER_DOWN)) goto nla_put_failure; From patchwork Thu Feb 22 10:50:11 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eric Dumazet X-Patchwork-Id: 13567043 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-yw1-f202.google.com (mail-yw1-f202.google.com [209.85.128.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 779BD44C84 for ; Thu, 22 Feb 2024 10:50:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1708599032; cv=none; b=pqVH/M4V5CqkYTPJSL8IOW5R1ulHVhG5Ck+FY0+kT4lKeDwXvzSa0Rgan087XGDlIvd5xRjlhIkE2Uq1iquYBiyPbujdygOccJ7Ly9FEih0zDkTba+OqzzzYGJTPvtS9XPg9FSgr2ThfTTcASN9pql6KiLmGvv+vP+z4dvca/ao= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1708599032; c=relaxed/simple; bh=yAuw9NcokKQt3vDKO0nI8Z/lV2mVAHlNYUQ892v6+Tg=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=J9CL9KcNG+KEe0glc/ZPmDS+dU1gnHji0EDNJapDXQ8NpTZWimLJjs6OgVIAXObwpEoekkcV4DnI1v4gmb1LF4SoNTss+AFsxGQZw9S/nzWqxmMadyrju6723elybHY7q6Erl7kl/cPLJkmPtZGmDWi2n4l8ZWYdWGRePERNzc4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--edumazet.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=nFZaBo5K; arc=none smtp.client-ip=209.85.128.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--edumazet.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="nFZaBo5K" Received: by mail-yw1-f202.google.com with SMTP id 00721157ae682-6047a047f58so124381307b3.3 for ; Thu, 22 Feb 2024 02:50:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1708599029; x=1709203829; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=5id54P25+TJipOJgL9vLNvIfegTcV21bvu/osxFDOtY=; b=nFZaBo5KZVZd2JeevwpAnAZzyxIcwRydUOiGALL3eYvLxmfSSAMDIq2Nm4PtVz55gZ BeFWAuPGTbyEsYiFSswJSPRM7DkGz4WfE9Y/mIZhgCFX2pX6TXOypRMmlR9Hu9Q1yYsw Ww4GCqejkGrppGA4ExuAqFZ/OWc3KHHWrf8tgjvnB4zsM9lzRWYtQDTCcn/7EugqGXwY zxiuv/X5qupl5Z8xHO/qUtEpEwvSqrizNYbNeqjcTrvMt/45CnZhg/QD3jY2mL1ClBwK on7iWg63j/xl0+9bRpL86zRNgw7SefFx26Ro66uhJv10NdIX6dxkSLze1/7s9Mne4o79 XNdg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1708599029; x=1709203829; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=5id54P25+TJipOJgL9vLNvIfegTcV21bvu/osxFDOtY=; b=ri4kC9W3ndbNWx8x92kZdQ2SqJCZfTBTiL50EyqY6YHSCmgWbmyEE2+KsXor0/AwLN dWPym0NQ2LGiNVGO8SPzYjoL1WK5z/2ewzFa+k+SC3wYso7aNvLbIE3Nfts1ifzk1LqS cD08Cxefjo3SWEX9UbLyjA2eazA30ab78UiJ+Cz+wYjnSgp4IR+Yg16PogWvXX9mgpDb E/u8K7+RkzIYvxPxEnaCPwaqf/KEmIxAVaBMX3gIE+p5+bM2ZPZYk+5O8Q7acjQ7d+os vaH2OCc4N5JTjNpm4rKVrw8Ik8OZymvWl3jOr3kkcFGRx1EJ7RPLINH7eLioaIPxq0Il O/Uw== X-Gm-Message-State: AOJu0YyHt8ZQ9ZxO4IMbo4Wc21xahEiXIlNsVx6fnzfO1gwpUs5PpyH9 iPzPcUvFdHarKFspn+le6C87jhnbiSLq7Okauq3iZYL8qwVvzmkECW46KW5OXC4j4iIO4G1adSM rw1O6w/y/Bg== X-Google-Smtp-Source: AGHT+IHhb9rf+grlrqEWfQ0pY2Ar20jPWYJA7Wn1BJNeltygLpQwRQoAqS2A7S41VP1keqbcE+O6o/giBkEkaQ== X-Received: from edumazet1.c.googlers.com ([fda3:e722:ac3:cc00:2b:7d90:c0a8:395a]) (user=edumazet job=sendgmr) by 2002:a05:690c:360a:b0:608:1dad:a37e with SMTP id ft10-20020a05690c360a00b006081dada37emr3359953ywb.1.1708599029495; Thu, 22 Feb 2024 02:50:29 -0800 (PST) Date: Thu, 22 Feb 2024 10:50:11 +0000 In-Reply-To: <20240222105021.1943116-1-edumazet@google.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20240222105021.1943116-1-edumazet@google.com> X-Mailer: git-send-email 2.44.0.rc1.240.g4c46232300-goog Message-ID: <20240222105021.1943116-5-edumazet@google.com> Subject: [PATCH v2 net-next 04/14] ipv6: use xarray iterator to implement inet6_dump_ifinfo() From: Eric Dumazet To: "David S . Miller" , Jakub Kicinski , Paolo Abeni Cc: netdev@vger.kernel.org, Ido Schimmel , Jiri Pirko , eric.dumazet@gmail.com, Eric Dumazet X-Patchwork-Delegate: kuba@kernel.org Prepare inet6_dump_ifinfo() to run with RCU protection instead of RTNL and use for_each_netdev_dump() interface. Also properly return 0 at the end of a dump, avoiding an extra recvmsg() system call and RTNL acquisition. Note that RTNL-less dumps need core changes, coming later in the series. Signed-off-by: Eric Dumazet Reviewed-by: Ido Schimmel Reviewed-by: Donald Hunter --- net/ipv6/addrconf.c | 46 +++++++++++++++++++-------------------------- 1 file changed, 19 insertions(+), 27 deletions(-) diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index df3c6feea74e2d95144140eceb6df5cef2dce1f4..8994ddc6c859e6bc68303e6e61663baf330aee00 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c @@ -6117,50 +6117,42 @@ static int inet6_valid_dump_ifinfo(const struct nlmsghdr *nlh, static int inet6_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb) { struct net *net = sock_net(skb->sk); - int h, s_h; - int idx = 0, s_idx; + struct { + unsigned long ifindex; + } *ctx = (void *)cb->ctx; struct net_device *dev; struct inet6_dev *idev; - struct hlist_head *head; + int err; /* only requests using strict checking can pass data to * influence the dump */ if (cb->strict_check) { - int err = inet6_valid_dump_ifinfo(cb->nlh, cb->extack); + err = inet6_valid_dump_ifinfo(cb->nlh, cb->extack); if (err < 0) return err; } - s_h = cb->args[0]; - s_idx = cb->args[1]; - + err = 0; rcu_read_lock(); - for (h = s_h; h < NETDEV_HASHENTRIES; h++, s_idx = 0) { - idx = 0; - head = &net->dev_index_head[h]; - hlist_for_each_entry_rcu(dev, head, index_hlist) { - if (idx < s_idx) - goto cont; - idev = __in6_dev_get(dev); - if (!idev) - goto cont; - if (inet6_fill_ifinfo(skb, idev, - NETLINK_CB(cb->skb).portid, - cb->nlh->nlmsg_seq, - RTM_NEWLINK, NLM_F_MULTI) < 0) - goto out; -cont: - idx++; + for_each_netdev_dump(net, dev, ctx->ifindex) { + idev = __in6_dev_get(dev); + if (!idev) + continue; + err = inet6_fill_ifinfo(skb, idev, + NETLINK_CB(cb->skb).portid, + cb->nlh->nlmsg_seq, + RTM_NEWLINK, NLM_F_MULTI); + if (err < 0) { + if (likely(skb->len)) + err = skb->len; + break; } } -out: rcu_read_unlock(); - cb->args[1] = idx; - cb->args[0] = h; - return skb->len; + return err; } void inet6_ifinfo_notify(int event, struct inet6_dev *idev) From patchwork Thu Feb 22 10:50:12 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eric Dumazet X-Patchwork-Id: 13567044 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-qk1-f202.google.com (mail-qk1-f202.google.com [209.85.222.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 201513F9F5 for ; Thu, 22 Feb 2024 10:50:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1708599033; cv=none; b=PxlBQ0Q0XruVWse5j3DxqqhVjaLmXfxjqhXRBje+n9FaTtcmxa/ufyJx0CizFKqDhPVdIT31+xEweOh7AxuBtZo9nu0GIJAujrrXSV/i9/hHogrpHt0R2cCbvG2sgaiPlMznUjHj9IJbW9CDhLRakeDvRU2WYSSfTGu/Zmc20DI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1708599033; c=relaxed/simple; bh=lwNIvZDZLExwPjBTRdtAdUNymQznBK3uysM53tCYtAw=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=RdcDA6AHYf+aEfQlF8UbzXReW5NcxpaocCKDNyeHMyAg/UJKoLMPDpf7codQ27B98bRWPIYUBfFHXfkloUQoPQBxNSbudgQA+uOpM7F7ve/NZb2AZLW2Nl5tLxX9hL8dlXxzp2mUCTrhiN2mPgdSza+SBINy+Ah4nCtXCRUOdSQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--edumazet.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=txcTRq/k; arc=none smtp.client-ip=209.85.222.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--edumazet.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="txcTRq/k" Received: by mail-qk1-f202.google.com with SMTP id af79cd13be357-7873e819853so655736385a.0 for ; Thu, 22 Feb 2024 02:50:31 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1708599031; x=1709203831; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=002344eBGzEWpuOidpRheP4s8jUhv7SoQO5BKVmyoIY=; b=txcTRq/k0MTR6vEbpvrbiOmB4pXe6E28TCGElS/Ei4b/NOSg/JBjZTFedv4JRUP/FM cpqVZSMnMQz/DjEknFhyZfjuU1nuNPCDuQQw/99tgw30l298zvirZCToK5gHzn1r4nTk 1shXs8M+yCB3hwMWmAU8lZCxWbnyOKy50UyZ9ParW1i1LhMF6qYMbSt/C/rIAosA1Mqx dZ43HxfW8Vqi/JPUNKKF8JtKJx4d4GlNxJnaOmQo8hEDUHztfMQM3vssI6SMug4H7gSJ 8kOxtooYx3Cx+U3NWoSK/goesAuuncgkRlOWjpz9XmEN6dfs2vofjYUZbs+U9NIsTCgz bQgg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1708599031; x=1709203831; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=002344eBGzEWpuOidpRheP4s8jUhv7SoQO5BKVmyoIY=; b=e+wY4YeI+FAukqsxgGWMoWYQkw6fhV1yEii6nRjFYpJ7T8Oyc07ZJGu9YG4ZpYAcwU SVZHv8rDhPhLVlZGjAnBYfXpv5Nh1OLXtFVmSRKpX8n+1EmA9RG+kV04MKpQxjkAz/Oz 3ovE/Lri/y8yrmWEh0w73fXhXliQUEXQuF4hjicUGKg9MtsuehXoKZwZANcXIO//fUpt pX2plzY1SLWt2JAv2tA4MmlF/x4DGzA++BC2eMxyZZ/Tbj3y1UbVqxIIW5a9nh0oTatw +REZRdRDgrz+HewVjHYJml+o4bsoRjz+DKsJJQo3J7MgD9/5QMFFNFpUoc0qS1F1E+6A +1aA== X-Gm-Message-State: AOJu0YzWoX0I09gdZw7ms595awOMqQLKArnORN5IuKalPBQE4GaqWXfs vT9Nk+7nXC5Yc0mml6mcWUK6fXDWoggy7EqwLt+NKI4Mdp7ea90TufszHmMMJQVXBLH9XDN7R74 BdSAUrgS7UA== X-Google-Smtp-Source: AGHT+IFWrIXUs8jnFjXgyOVCcxe5uojFZ3J3MgjU2sNy55yyQ3eB5Zyhh9sWntenk7D0dVqsPkiIyrBEj3Rf0Q== X-Received: from edumazet1.c.googlers.com ([fda3:e722:ac3:cc00:2b:7d90:c0a8:395a]) (user=edumazet job=sendgmr) by 2002:a05:620a:2850:b0:787:3fa6:51fd with SMTP id h16-20020a05620a285000b007873fa651fdmr133700qkp.8.1708599031058; Thu, 22 Feb 2024 02:50:31 -0800 (PST) Date: Thu, 22 Feb 2024 10:50:12 +0000 In-Reply-To: <20240222105021.1943116-1-edumazet@google.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20240222105021.1943116-1-edumazet@google.com> X-Mailer: git-send-email 2.44.0.rc1.240.g4c46232300-goog Message-ID: <20240222105021.1943116-6-edumazet@google.com> Subject: [PATCH v2 net-next 05/14] netlink: fix netlink_diag_dump() return value From: Eric Dumazet To: "David S . Miller" , Jakub Kicinski , Paolo Abeni Cc: netdev@vger.kernel.org, Ido Schimmel , Jiri Pirko , eric.dumazet@gmail.com, Eric Dumazet X-Patchwork-Delegate: kuba@kernel.org __netlink_diag_dump() returns 1 if the dump is not complete, zero if no error occurred. If err variable is zero, this means the dump is complete: We should not return skb->len in this case, but 0. This allows NLMSG_DONE to be appended to the skb. User space does not have to call us again only to get NLMSG_DONE. Signed-off-by: Eric Dumazet Reviewed-by: Donald Hunter --- net/netlink/diag.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/net/netlink/diag.c b/net/netlink/diag.c index e12c90d5f6ad29446ea1990c88c19bcb0ee856c3..61981e01fd6ff189dcb46a06a4d265cf6029b840 100644 --- a/net/netlink/diag.c +++ b/net/netlink/diag.c @@ -207,7 +207,7 @@ static int netlink_diag_dump(struct sk_buff *skb, struct netlink_callback *cb) err = __netlink_diag_dump(skb, cb, req->sdiag_protocol, s_num); } - return err < 0 ? err : skb->len; + return err <= 0 ? err : skb->len; } static int netlink_diag_dump_done(struct netlink_callback *cb) From patchwork Thu Feb 22 10:50:13 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eric Dumazet X-Patchwork-Id: 13567045 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-yb1-f202.google.com (mail-yb1-f202.google.com [209.85.219.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6E2BC44C84 for ; Thu, 22 Feb 2024 10:50:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1708599034; cv=none; b=svY3TTpzg69Hp4CV6VJWxstUXA6VgTsqjohCPxjeR7OnVzlWitf76Nn3aZEPXdpLYQQoXo0QgJv2ilqiYS/w2JlO2tmoLe0IvRsN8h5fOVnjDih1cmTp/pc5GF0M85Uw52tFy7sE7KZ2toboc/xsq6lJBlt+mSSUkH3UeTgsi9U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1708599034; c=relaxed/simple; bh=Xy0+n9Pw6Ld7r3q9C5w6TjpnfVazfe7dZANFfUTESLo=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=hsRUCPRg4OuqwnvYDM/pVUxaYLNTmz7Uz4vpNWYVC6xj38OSHwC455paO6/Dkwz9eVLKa7OJbhXNZ3OLMOZhO9dvTPwx/5DgDWPmjNPtzrPPgEqeZ1COCAxvHelUFqljUl8latYKkjqxYK7ONJJvUg5EEFqqbL/tIIJyvOHQ/zA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--edumazet.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=WZeh9EBn; arc=none smtp.client-ip=209.85.219.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--edumazet.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="WZeh9EBn" Received: by mail-yb1-f202.google.com with SMTP id 3f1490d57ef6-dccc49ef73eso9311258276.2 for ; Thu, 22 Feb 2024 02:50:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1708599032; x=1709203832; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=pNsJx8P4mNBhoYU0JJHzFcUPUoA6dHzaqJZ3PEQd6/Q=; b=WZeh9EBnspZYCGAEcor62MZZl2Kvhp4g7H4pRMXAWAGhDp+8oWPCZrDkLJVuVnn00k xNIeMCG4o8fyRv9JJBQljHtBqsMQZYWG3ic0bFIkM+6e7GhDvGkMk0ezVv/XS7u9ZuP+ ipBzXfTUKAK1M8zJEjGQ6lxhUR8qeyqAtfVzksH6BmiW5wJDsWhUYbybmIPtHCX9hgk6 yqGugpSFoAuwH4wQVhgzeOYZacPIZO75tizui2AZoWKeeBqqCbuGpxEijvRaEW2Liw0Q nf1dGYlTyfjQ9DIqEShXkjTgWTxbKtn2vkRMVwx9v3TM9d1+vKuKc2tXHvgGHKS7bQDw Dd8Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1708599032; x=1709203832; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=pNsJx8P4mNBhoYU0JJHzFcUPUoA6dHzaqJZ3PEQd6/Q=; b=o9eINQnmE1b+slu07vyhAYmRvTvPTJFcdocA6KgORjYI2q/ZUVE2dz0CLVtWfU+E24 1ams8es+7/M++rkgyxyLBnS1Nhz2nAEKzMNGzB0GYQhQ6zPZFBKki6vI10++vwhIO6lc 9csy7n8DYGk2lce01Bk1L6vqGj1udV0x/Bvr7n3UTPblkPlApsv+XMDJFfsoVk8K0i8F aRZdWc1ry8W3wOZSYCbg58xT5eJvXsA8CSyBJl8hBO/GxO4SICs6araPJP9/waF+EG+J MaMEfKyFECR2RY+M/RwwSN+emLf9hnnnL81my0Yx3LyJ6KxKUaVTXHxeNU5me4Gfnrt6 BA0A== X-Gm-Message-State: AOJu0YxRnnt0bNKCtfcHOytO+TuopUJ4ugpwyOA8DJwg8xXzFodviXVq 3Xw8/K6L8AJXiDnGBZ1Ss0DFwcedQ24HWkRVe/lvZPu5OKXivvhUYe00oydJ0BPNd+dCW7beNY8 AgJIG15vcnw== X-Google-Smtp-Source: AGHT+IH67Bwomz6lNyUG4qF2T2v4SNFgJ1OuHILc0NTVnUocpcDTloDBdzjyw0qcB7rDIlBwlb/mkWtO7d0EFA== X-Received: from edumazet1.c.googlers.com ([fda3:e722:ac3:cc00:2b:7d90:c0a8:395a]) (user=edumazet job=sendgmr) by 2002:a05:6902:1081:b0:dc7:63e7:7a5c with SMTP id v1-20020a056902108100b00dc763e77a5cmr96923ybu.11.1708599032513; Thu, 22 Feb 2024 02:50:32 -0800 (PST) Date: Thu, 22 Feb 2024 10:50:13 +0000 In-Reply-To: <20240222105021.1943116-1-edumazet@google.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20240222105021.1943116-1-edumazet@google.com> X-Mailer: git-send-email 2.44.0.rc1.240.g4c46232300-goog Message-ID: <20240222105021.1943116-7-edumazet@google.com> Subject: [PATCH v2 net-next 06/14] netlink: hold nlk->cb_mutex longer in __netlink_dump_start() From: Eric Dumazet To: "David S . Miller" , Jakub Kicinski , Paolo Abeni Cc: netdev@vger.kernel.org, Ido Schimmel , Jiri Pirko , eric.dumazet@gmail.com, Eric Dumazet X-Patchwork-Delegate: kuba@kernel.org __netlink_dump_start() releases nlk->cb_mutex right before calling netlink_dump() which grabs it again. This seems dangerous, even if KASAN did not bother yet. Add a @lock_taken parameter to netlink_dump() to let it grab the mutex if called from netlink_recvmsg() only. Signed-off-by: Eric Dumazet Reviewed-by: Jiri Pirko --- net/netlink/af_netlink.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index 9c962347cf859f16fc76e4d8a2fd22cdb3d142d6..94f3860526bfaa5793e8b3917250ec0e751687b5 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c @@ -130,7 +130,7 @@ static const char *const nlk_cb_mutex_key_strings[MAX_LINKS + 1] = { "nlk_cb_mutex-MAX_LINKS" }; -static int netlink_dump(struct sock *sk); +static int netlink_dump(struct sock *sk, bool lock_taken); /* nl_table locking explained: * Lookup and traversal are protected with an RCU read-side lock. Insertion @@ -1987,7 +1987,7 @@ static int netlink_recvmsg(struct socket *sock, struct msghdr *msg, size_t len, if (READ_ONCE(nlk->cb_running) && atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf / 2) { - ret = netlink_dump(sk); + ret = netlink_dump(sk, false); if (ret) { WRITE_ONCE(sk->sk_err, -ret); sk_error_report(sk); @@ -2196,7 +2196,7 @@ static int netlink_dump_done(struct netlink_sock *nlk, struct sk_buff *skb, return 0; } -static int netlink_dump(struct sock *sk) +static int netlink_dump(struct sock *sk, bool lock_taken) { struct netlink_sock *nlk = nlk_sk(sk); struct netlink_ext_ack extack = {}; @@ -2208,7 +2208,8 @@ static int netlink_dump(struct sock *sk) int alloc_min_size; int alloc_size; - mutex_lock(nlk->cb_mutex); + if (!lock_taken) + mutex_lock(nlk->cb_mutex); if (!nlk->cb_running) { err = -EINVAL; goto errout_skb; @@ -2365,9 +2366,7 @@ int __netlink_dump_start(struct sock *ssk, struct sk_buff *skb, WRITE_ONCE(nlk->cb_running, true); nlk->dump_done_errno = INT_MAX; - mutex_unlock(nlk->cb_mutex); - - ret = netlink_dump(sk); + ret = netlink_dump(sk, true); sock_put(sk); From patchwork Thu Feb 22 10:50:14 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eric Dumazet X-Patchwork-Id: 13567046 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-yb1-f201.google.com (mail-yb1-f201.google.com [209.85.219.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 123E64501D for ; Thu, 22 Feb 2024 10:50:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1708599036; cv=none; b=ekyEUcTsILHpo1+mom6HgNbTvcWbWbiCG8y8Q1Cabno4LwFiIM5oZug5K5LF99O61yR64SBxTmtCeFqi2Xr6dsiPh5FTP+w3fZROzhqL3FTOj2Viumwgee5NXn/6kyUg+c4LVbtLhgGEu1f//GIVnROC4XrJQKuDOIBHKVW46u4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1708599036; c=relaxed/simple; bh=MJvZ+gQDvthgylkfKVw7JiV4Bca7Rrs8ONvuQGoAa1w=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=h9hs0u/w8wWCbAM1VmsW+pGhCzyhZbV1cNQLgztDpNLFK5MtlG+NTuv87xeSNb5CwVgKmuJfFrk1cQYxoVhOwxXAzmUQzBOvupSSC7X76/UWWvP6oOWXCtKlz2UB5HYbndTq9FwkMCV06T7MDJEK89uRpAa7+jhlHesaThK6p/U= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--edumazet.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=g2tfIGAc; arc=none smtp.client-ip=209.85.219.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--edumazet.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="g2tfIGAc" Received: by mail-yb1-f201.google.com with SMTP id 3f1490d57ef6-dcd94cc48a1so13524962276.3 for ; Thu, 22 Feb 2024 02:50:34 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1708599034; x=1709203834; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=4HUz/hrVYG3wBhnXG7mHSZKDtpkcWF8qh9wKf2fr9yM=; b=g2tfIGAccHQR85hGZ153cu7v+bTr/AqWokHFL8VoGkUym1fw3gU7m1Ptqi0TP/2X9o XNQwBfFhrkm3cOOqTc4IOGlmAqyxpYg4444viMEv1LSD0riJETpQDt8vtdskRei6s9jZ riqGIfIrrTbMxdcpkIZrBwYLiZQ4I2f9SAjtSXVHe54dbzHCCFTkyy1X1Oyqj/lZo9Ut P/sX9RBKuFHzdDKnnVHxZZorWWYWbAVB5klzqx0Eus0h8g6ZrATm1Ch00ayVpLOYz86a Wf2mZYAzHWbRiwg94hYo8xCp4UdeQWffCR71krTluxF+WQpnOgrrJ205HzOUR3vsTz4d Yjtg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1708599034; x=1709203834; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=4HUz/hrVYG3wBhnXG7mHSZKDtpkcWF8qh9wKf2fr9yM=; b=YPxtK4f94/iJJBrN6ea3i6iJozS5fsCoNnzOpzZvEDvCvJsNUeMpleUcS9+v28ECCu Aq9izkM1qsDufKWZSXx+tKSqAxL96C3XhQqzbFdJjwLbbihYANiJbinkuYRRvECP6Ya1 Sua+5KWY9aDnNrp2z8couvKxqtoa8oUCjluuM2euvxk/6JbzfHcHPohiA5EuChVP1pYK 1pQmNpwvfeBmNZcVRdPrKJEWTR60nFXckNjpT+TRXj0JZVXoP4TLDQleyQYfVwOaxFbI hhIv6loS8jNdlhQ5abmMca7Zq/qekJiQxvC7T103Lz9A2cH/hZEchAmB2iJlA4qAGDXa b0gw== X-Gm-Message-State: AOJu0YzxOrwjZTjWFPT1P4rHkpPTOe0DD3vMxkqB682P0EfK8JvlF4Bo qkxdNSzCvSI6/KT2WhipxCXg22KYUUSPAJLoYyCdzkOr8jrCFTwbu4qjDMFcSgRXaazsmKDkOqT vCVhNA/Mggw== X-Google-Smtp-Source: AGHT+IEv/zB5FtoiyrpYBX1+JfM2uL1B9eQnh3mQaccRqNBv6cIeU0wZR0mNCF796e+pjQ5de+6QTT2xxI2jUw== X-Received: from edumazet1.c.googlers.com ([fda3:e722:ac3:cc00:2b:7d90:c0a8:395a]) (user=edumazet job=sendgmr) by 2002:a05:6902:1109:b0:dc6:d3c0:ebe0 with SMTP id o9-20020a056902110900b00dc6d3c0ebe0mr522785ybu.0.1708599034014; Thu, 22 Feb 2024 02:50:34 -0800 (PST) Date: Thu, 22 Feb 2024 10:50:14 +0000 In-Reply-To: <20240222105021.1943116-1-edumazet@google.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20240222105021.1943116-1-edumazet@google.com> X-Mailer: git-send-email 2.44.0.rc1.240.g4c46232300-goog Message-ID: <20240222105021.1943116-8-edumazet@google.com> Subject: [PATCH v2 net-next 07/14] rtnetlink: change nlk->cb_mutex role From: Eric Dumazet To: "David S . Miller" , Jakub Kicinski , Paolo Abeni Cc: netdev@vger.kernel.org, Ido Schimmel , Jiri Pirko , eric.dumazet@gmail.com, Eric Dumazet X-Patchwork-Delegate: kuba@kernel.org In commit af65bdfce98d ("[NETLINK]: Switch cb_lock spinlock to mutex and allow to override it"), Patrick McHardy used a common mutex to protect both nlk->cb and the dump() operations. The override is used for rtnl dumps, registered with rntl_register() and rntl_register_module(). We want to be able to opt-out some dump() operations to not acquire RTNL, so we need to protect nlk->cb with a per socket mutex. This patch renames nlk->cb_def_mutex to nlk->nl_cb_mutex The optional pointer to the mutex used to protect dump() call is stored in nlk->dump_cb_mutex Signed-off-by: Eric Dumazet --- net/netlink/af_netlink.c | 32 ++++++++++++++++++-------------- net/netlink/af_netlink.h | 5 +++-- 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index 94f3860526bfaa5793e8b3917250ec0e751687b5..84cad7be6d4335bfb5301ef49f84af8e7b3bc842 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c @@ -636,7 +636,7 @@ static struct proto netlink_proto = { }; static int __netlink_create(struct net *net, struct socket *sock, - struct mutex *cb_mutex, int protocol, + struct mutex *dump_cb_mutex, int protocol, int kern) { struct sock *sk; @@ -651,15 +651,11 @@ static int __netlink_create(struct net *net, struct socket *sock, sock_init_data(sock, sk); nlk = nlk_sk(sk); - if (cb_mutex) { - nlk->cb_mutex = cb_mutex; - } else { - nlk->cb_mutex = &nlk->cb_def_mutex; - mutex_init(nlk->cb_mutex); - lockdep_set_class_and_name(nlk->cb_mutex, + mutex_init(&nlk->nl_cb_mutex); + lockdep_set_class_and_name(&nlk->nl_cb_mutex, nlk_cb_mutex_keys + protocol, nlk_cb_mutex_key_strings[protocol]); - } + nlk->dump_cb_mutex = dump_cb_mutex; init_waitqueue_head(&nlk->wait); sk->sk_destruct = netlink_sock_destruct; @@ -2209,7 +2205,7 @@ static int netlink_dump(struct sock *sk, bool lock_taken) int alloc_size; if (!lock_taken) - mutex_lock(nlk->cb_mutex); + mutex_lock(&nlk->nl_cb_mutex); if (!nlk->cb_running) { err = -EINVAL; goto errout_skb; @@ -2261,14 +2257,22 @@ static int netlink_dump(struct sock *sk, bool lock_taken) netlink_skb_set_owner_r(skb, sk); if (nlk->dump_done_errno > 0) { + struct mutex *extra_mutex = nlk->dump_cb_mutex; + cb->extack = &extack; + + if (extra_mutex) + mutex_lock(extra_mutex); nlk->dump_done_errno = cb->dump(skb, cb); + if (extra_mutex) + mutex_unlock(extra_mutex); + cb->extack = NULL; } if (nlk->dump_done_errno > 0 || skb_tailroom(skb) < nlmsg_total_size(sizeof(nlk->dump_done_errno))) { - mutex_unlock(nlk->cb_mutex); + mutex_unlock(&nlk->nl_cb_mutex); if (sk_filter(sk, skb)) kfree_skb(skb); @@ -2302,13 +2306,13 @@ static int netlink_dump(struct sock *sk, bool lock_taken) WRITE_ONCE(nlk->cb_running, false); module = cb->module; skb = cb->skb; - mutex_unlock(nlk->cb_mutex); + mutex_unlock(&nlk->nl_cb_mutex); module_put(module); consume_skb(skb); return 0; errout_skb: - mutex_unlock(nlk->cb_mutex); + mutex_unlock(&nlk->nl_cb_mutex); kfree_skb(skb); return err; } @@ -2331,7 +2335,7 @@ int __netlink_dump_start(struct sock *ssk, struct sk_buff *skb, } nlk = nlk_sk(sk); - mutex_lock(nlk->cb_mutex); + mutex_lock(&nlk->nl_cb_mutex); /* A dump is in progress... */ if (nlk->cb_running) { ret = -EBUSY; @@ -2382,7 +2386,7 @@ int __netlink_dump_start(struct sock *ssk, struct sk_buff *skb, module_put(control->module); error_unlock: sock_put(sk); - mutex_unlock(nlk->cb_mutex); + mutex_unlock(&nlk->nl_cb_mutex); error_free: kfree_skb(skb); return ret; diff --git a/net/netlink/af_netlink.h b/net/netlink/af_netlink.h index 2145979b9986a0331b34b6ba2fda867f23d0d71c..9751e29d4bbb9ad9cb7900e2cfaedbe7ab138cf4 100644 --- a/net/netlink/af_netlink.h +++ b/net/netlink/af_netlink.h @@ -39,8 +39,9 @@ struct netlink_sock { bool cb_running; int dump_done_errno; struct netlink_callback cb; - struct mutex *cb_mutex; - struct mutex cb_def_mutex; + struct mutex nl_cb_mutex; + + struct mutex *dump_cb_mutex; void (*netlink_rcv)(struct sk_buff *skb); int (*netlink_bind)(struct net *net, int group); void (*netlink_unbind)(struct net *net, int group); From patchwork Thu Feb 22 10:50:15 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eric Dumazet X-Patchwork-Id: 13567047 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-yb1-f202.google.com (mail-yb1-f202.google.com [209.85.219.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 86794405F4 for ; Thu, 22 Feb 2024 10:50:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1708599038; cv=none; b=eHxpYDW0p230+8Fv1sgmJD58BryjBrUNt/FLbT9qIV/AkdyA5bbTcUvWR4Q1Q87NREu/4clzqqFzCP8e9vDz8JZUzANGIwkF37SwmV6be8iA5LxRUe7xWboa+geONKzKx8coLx89s/fe6UVQQHuxTVD+hIPNocfeIgRDyynNAS0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1708599038; c=relaxed/simple; bh=x0gaI5HPo/Gni69DlefYrKGd8tFxYcVGKn4g6trRTGQ=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=tSk/ImtZc/lHzytuMEua1YdTF7qHxl6C50XMGFT8opo13hCdr58VD7DNG6qBAs8joRiF1PTQHtXVF/XmCNqoh/D1lZ1gry7/DYsP+Icb5KrJE25Q14531rRaOn4Rjvf5ld9CvinlFxXjQAmZ7UOhnpZaidgqiqWp9yuM+F4JZfU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--edumazet.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=jzVgM64u; arc=none smtp.client-ip=209.85.219.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--edumazet.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="jzVgM64u" Received: by mail-yb1-f202.google.com with SMTP id 3f1490d57ef6-dc647f65573so13645934276.2 for ; Thu, 22 Feb 2024 02:50:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1708599035; x=1709203835; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=Cto4V58l9fhN9hnc9s3j47PeAImDsjr7u6zwd7GI/kE=; b=jzVgM64uKtX0L1R0oTXYF4AGmQi9wPwwdTEhBPrDIiYiulN2xf4pEn2Aq0Apgf5Hu5 jPgm3vZluL8tKY5LNPb+oCupndMskMmvPMSNXvTABk5KrJxSGhN1lxQXgscy4nJIUg08 EAKi8Cdyos2lUgN+gs1FrDDUchU1DI8VfC8ztAMqE+HJKQMGBhjOYjV2+mqHugcTqLMo tk4jxH5oVNtDkotYO9exwtIlxxX/QqKECQawYEEU92aJc2BluAJ63JPMqGqntHI9Dq5S rWoTp4x2n748/+PRU19X/AzXu9oONm/754SoCraGf6EDeeRf66/kpu3PHkygwqKg9/iV CYlw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1708599035; x=1709203835; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=Cto4V58l9fhN9hnc9s3j47PeAImDsjr7u6zwd7GI/kE=; b=RVRbGeDvtPQwbzreJHZ80GHeHLFEk8asNcQfqQ/sOjtSbdomlwFv5HLgrxYGbzK5Wv D8Jn2Ky7/I5NeyDC2RzjLmztM0PKoklq7iqvrOlBLmliijvj8dE15rXLrhL9BKRFs+xG 6R40lH/dAanTejAUfLsioxbUZ2isx38kPUwCGeWHqjpBNOTi7+Oc7GZ2+ZqECxGVPMtU J3uNKshZz4oiuadcKdEpDQy26PzwxAjMEdSFd6Bz+Ho6rtcjhcagjO1lvfw9nZlxjoEe PN7LuK6I4HZp/kwvo/JBdjpgqqF72NwXBjwGUwWOwaAAHp/0z0n/Ez3guhAXgdfJhCvt a5Ig== X-Gm-Message-State: AOJu0YzQqM2odb2LJAs3/jAg+ifNNlLJYNIkS+K7HE9Amip9cd7m9+25 jPPPl4hYIIQRCu0K0mLc9CP9C2qE2uA9v10ZxLSok3CsiHV5ihrCqFYOPn48cnNMRIiRviH9KI8 OBU/wV6V8OA== X-Google-Smtp-Source: AGHT+IEtexQB52Hplp15ogPVvu+f3XuMC/2tgLhg6clwu34uzVZST+zW/txYAQg42qZotrhTGDJWJ+5icbBP4g== X-Received: from edumazet1.c.googlers.com ([fda3:e722:ac3:cc00:2b:7d90:c0a8:395a]) (user=edumazet job=sendgmr) by 2002:a05:6902:1024:b0:dc7:48ce:d17f with SMTP id x4-20020a056902102400b00dc748ced17fmr512886ybt.10.1708599035564; Thu, 22 Feb 2024 02:50:35 -0800 (PST) Date: Thu, 22 Feb 2024 10:50:15 +0000 In-Reply-To: <20240222105021.1943116-1-edumazet@google.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20240222105021.1943116-1-edumazet@google.com> X-Mailer: git-send-email 2.44.0.rc1.240.g4c46232300-goog Message-ID: <20240222105021.1943116-9-edumazet@google.com> Subject: [PATCH v2 net-next 08/14] rtnetlink: add RTNL_FLAG_DUMP_UNLOCKED flag From: Eric Dumazet To: "David S . Miller" , Jakub Kicinski , Paolo Abeni Cc: netdev@vger.kernel.org, Ido Schimmel , Jiri Pirko , eric.dumazet@gmail.com, Eric Dumazet X-Patchwork-Delegate: kuba@kernel.org Similarly to RTNL_FLAG_DOIT_UNLOCKED, this new flag allows dump operations registered via rtnl_register() or rtnl_register_module() to opt-out from RTNL protection. Signed-off-by: Eric Dumazet Reviewed-by: Donald Hunter --- include/linux/netlink.h | 2 ++ include/net/rtnetlink.h | 1 + net/core/rtnetlink.c | 2 ++ net/netlink/af_netlink.c | 3 +++ 4 files changed, 8 insertions(+) diff --git a/include/linux/netlink.h b/include/linux/netlink.h index 1a4445bf2ab9acff630b3712453c8a6cdf8fc47c..5df7340d4dabc0c0b1728dafde43b5522dacd024 100644 --- a/include/linux/netlink.h +++ b/include/linux/netlink.h @@ -291,6 +291,7 @@ struct netlink_callback { u16 answer_flags; u32 min_dump_alloc; unsigned int prev_seq, seq; + int flags; bool strict_check; union { u8 ctx[48]; @@ -323,6 +324,7 @@ struct netlink_dump_control { void *data; struct module *module; u32 min_dump_alloc; + int flags; }; int __netlink_dump_start(struct sock *ssk, struct sk_buff *skb, diff --git a/include/net/rtnetlink.h b/include/net/rtnetlink.h index 6506221c5fe31f49ccaca470e0b24dffb703c28e..3bfb80bad1739d244a3906fa7f0e1a606dfaf868 100644 --- a/include/net/rtnetlink.h +++ b/include/net/rtnetlink.h @@ -12,6 +12,7 @@ typedef int (*rtnl_dumpit_func)(struct sk_buff *, struct netlink_callback *); enum rtnl_link_flags { RTNL_FLAG_DOIT_UNLOCKED = BIT(0), RTNL_FLAG_BULK_DEL_SUPPORTED = BIT(1), + RTNL_FLAG_DUMP_UNLOCKED = BIT(2), }; enum rtnl_kinds { diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 060543fe7919c13c7a5c6cf22f9e7606d0897345..1b26dfa5668d22fb2e30ceefbf143e98df13ae29 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c @@ -6532,6 +6532,7 @@ static int rtnetlink_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, } owner = link->owner; dumpit = link->dumpit; + flags = link->flags; if (type == RTM_GETLINK - RTM_BASE) min_dump_alloc = rtnl_calcit(skb, nlh); @@ -6549,6 +6550,7 @@ static int rtnetlink_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, .dump = dumpit, .min_dump_alloc = min_dump_alloc, .module = owner, + .flags = flags, }; err = netlink_dump_start(rtnl, skb, nlh, &c); /* netlink_dump_start() will keep a reference on diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index 84cad7be6d4335bfb5301ef49f84af8e7b3bc842..be5792b638aa563232cdb96de8c97c4fe45b3718 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c @@ -2261,6 +2261,8 @@ static int netlink_dump(struct sock *sk, bool lock_taken) cb->extack = &extack; + if (cb->flags & RTNL_FLAG_DUMP_UNLOCKED) + extra_mutex = NULL; if (extra_mutex) mutex_lock(extra_mutex); nlk->dump_done_errno = cb->dump(skb, cb); @@ -2355,6 +2357,7 @@ int __netlink_dump_start(struct sock *ssk, struct sk_buff *skb, cb->data = control->data; cb->module = control->module; cb->min_dump_alloc = control->min_dump_alloc; + cb->flags = control->flags; cb->skb = skb; cb->strict_check = nlk_test_bit(STRICT_CHK, NETLINK_CB(skb).sk); From patchwork Thu Feb 22 10:50:16 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eric Dumazet X-Patchwork-Id: 13567048 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-yb1-f202.google.com (mail-yb1-f202.google.com [209.85.219.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D9CC846435 for ; Thu, 22 Feb 2024 10:50:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1708599039; cv=none; b=F1sEtscLmljoxQ+Q5sEanyMdeEUN32HS3PSl/JTTfvmQRG/QxRLrFTZw43VEMgJvEiAFgSXcYu3QQc6cr0nHanMXzcP15fS3W29KB94/4rKK5SyRCByh6F+5R4y6G3PmDgScHFXZClEdRDzE+82i3V7eurn1yBlImOITtLKbYLk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1708599039; c=relaxed/simple; bh=HtY3HQFZWPLuiTttsHrjKcZx/qON+wabPiyRjjsp4H8=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=n+H/uPCYLtjY7DabfUTSCBm+PVRTdBParv7vFNNkE/f0EREYwqpQpnVyQsX59TRZ6oTTsY6Qme5vGp6pUw024hSzCAq6/nZYnuBNg9/xzSmLugA5EYy1BrfJWPK7gfbBfx4WH+GK9+6OoI3l+5GqWPrz/C+kyZRAbDX77uMnRQQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--edumazet.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=4lCr1cWU; arc=none smtp.client-ip=209.85.219.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--edumazet.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="4lCr1cWU" Received: by mail-yb1-f202.google.com with SMTP id 3f1490d57ef6-dc6b26ce0bbso16155998276.1 for ; Thu, 22 Feb 2024 02:50:37 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1708599037; x=1709203837; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=kiiYpUBe05Kbj4u9cPMfozplI67YN/aU2iLYzbo4hx4=; b=4lCr1cWUlx7NgD7KdSjS9iHVTSReJVTdeJkTJy5c5K6Bk2al9Zufn3KZr5IitZBwkF +eVDvpVoYfoQtJONYULWxitJm4gWHPC+7PDF6JECBvdTpeNVZHcvGar1LvJkunkA2gvV tQ2Kupi780at0kzlKsfPc0bfZflXbFprtj+g8ypV0rRuTwpttHrWvziOHkpaVYVER+GA dyJJADuHvlz4jVnhm6B5ZolUzdBmLKlZ+4Abgt6Tx0oE87Z3c6q+kVHX0ttUZItWwT+g P6c0y/3U79fp6qn1N2SHDLUW8F19pszL/EXTH+n808sLqYJD+/RqVoMtRA0m+9uSfugi rOUg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1708599037; x=1709203837; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=kiiYpUBe05Kbj4u9cPMfozplI67YN/aU2iLYzbo4hx4=; b=lcZUKg+SB918ZAJ7kEtDoNz8kNk0ywD4b++cyrkGcMDNOk1LeHuA5kaPE85+edNNCW YiTuran/BHrnhOxvLkoW228ir7Wet2jvEVG6j/uQBNvpCVDrWiiv22A9YDMFL1oC9nuY yZ1tRp791/O2ophGajHBhkFQTyq4qQyEEeuqd+H8WvRlIW4KOJkbsBKcUGyNESweAS9I lRRzkYpuePj/MGT/qF5kNayw6Mn/XkgRtXtXF7mz1S5zviDktctU2qOJmJFYwHiKoP4q lhDSoqhh/BjpHbPOcKvSjKsMqCzrnV7/QOHv6cAoYMu6dNNtdVZ41e5gJ368aThqWTFn ZlVA== X-Gm-Message-State: AOJu0YyiPo6V3NFj90PxTR+1TZtgEt9oHgsUrO+lsXY4Df7EMj4HQMNN KVtkIgrZZZaz2B9xE/kZ3f+AaXnj58p0v3Vs3rcui3DZAUNSH/Tuyyacuc4LI0KILil9eFkWqsW NgKHeCnmZhQ== X-Google-Smtp-Source: AGHT+IF+/kUgWQA7n0588yD7zUbaGgHgYZ39zr2XQKOtEwjmv8B5At9T84jOELchJPemMmwDe3d2slyz+6mvKg== X-Received: from edumazet1.c.googlers.com ([fda3:e722:ac3:cc00:2b:7d90:c0a8:395a]) (user=edumazet job=sendgmr) by 2002:a05:6902:1101:b0:dc6:ff2b:7e1b with SMTP id o1-20020a056902110100b00dc6ff2b7e1bmr546791ybu.4.1708599037002; Thu, 22 Feb 2024 02:50:37 -0800 (PST) Date: Thu, 22 Feb 2024 10:50:16 +0000 In-Reply-To: <20240222105021.1943116-1-edumazet@google.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20240222105021.1943116-1-edumazet@google.com> X-Mailer: git-send-email 2.44.0.rc1.240.g4c46232300-goog Message-ID: <20240222105021.1943116-10-edumazet@google.com> Subject: [PATCH v2 net-next 09/14] ipv6: switch inet6_dump_ifinfo() to RCU protection From: Eric Dumazet To: "David S . Miller" , Jakub Kicinski , Paolo Abeni Cc: netdev@vger.kernel.org, Ido Schimmel , Jiri Pirko , eric.dumazet@gmail.com, Eric Dumazet X-Patchwork-Delegate: kuba@kernel.org No longer hold RTNL while calling inet6_dump_ifinfo() Signed-off-by: Eric Dumazet Reviewed-by: Donald Hunter --- net/ipv6/addrconf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index 8994ddc6c859e6bc68303e6e61663baf330aee00..244b670a44b92f10b8f18c444d72a2467f8ed90a 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c @@ -7447,7 +7447,7 @@ int __init addrconf_init(void) rtnl_af_register(&inet6_ops); err = rtnl_register_module(THIS_MODULE, PF_INET6, RTM_GETLINK, - NULL, inet6_dump_ifinfo, 0); + NULL, inet6_dump_ifinfo, RTNL_FLAG_DUMP_UNLOCKED); if (err < 0) goto errout; From patchwork Thu Feb 22 10:50:17 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eric Dumazet X-Patchwork-Id: 13567049 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-yb1-f202.google.com (mail-yb1-f202.google.com [209.85.219.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C026846546 for ; Thu, 22 Feb 2024 10:50:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1708599042; cv=none; b=qQDNvvcqcWbZKp2Xa5QejwiMTzw8Dd4mstoCttA2Fq/se5+2ae8b/EsK4aVj+vytINRyVZ7gLZpciGTRa7LdaG1f8e+lNPyBegMKRQ8IJUBb0a95+OvIdJ3yhwfd8EBCNuYsseiY5xYO/7VA1QSZlCRZTOMOCpghBqqmCT9mcdk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1708599042; c=relaxed/simple; bh=a1p/FFG5KJt/F+49stv8oN0Hp04RXahaE3pkWhDRIs4=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=FciSU7DS/FgDhtCX5VEfrhHg5M1+CKlZYoGvfZVVjvibD0MW8jIyYbw0Gvy29VH8vR/s38wDXmGfDNsOsQEKfVZ24TTh1AZvPqMxd8DUUAJGU2lfB85VKRh60A5j7TXmHAKQXxDTxV0kUBapD1tBVRb3FLnx9eLG7HNcHKp2rAs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--edumazet.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=Ve/xf7z2; arc=none smtp.client-ip=209.85.219.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--edumazet.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="Ve/xf7z2" Received: by mail-yb1-f202.google.com with SMTP id 3f1490d57ef6-dc6b26eef6cso11308140276.3 for ; Thu, 22 Feb 2024 02:50:39 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1708599039; x=1709203839; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=vOtofUwvgnm/c7P42hpvj9EN22JHx5FEwaodSurnb1k=; b=Ve/xf7z2TX08JRF8hnsRR3xn44UlJJIVP1cFqHJna3rNQfmtteZ+DIioY3hpuZeq7B GKskx7VuddATSP/+vZQNmC8sZiSSk4wsW+UqZR4vhH7ErakPYjC2NwnmJQC+aa+3fUD4 yS1vtmVsPjgYEdg4AUaU4f9bo4Mt0SUk6snuqXr2NoxYB6HSYUXfG/tn/O3K+4HjfiTk aP7xF9LEDkuEzzwY3qOCH4T6KffFPEoV7clMYKuH6SO8oBkes0J8UjD1wBhJXi22or7N YeOHqvPcE5t+IP3NCQfy8WQ4alVUJ/doF2Pw1Rm+dGDfwnEE/vnOAYwcD57Q7qUBXUM/ 30hw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1708599039; x=1709203839; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=vOtofUwvgnm/c7P42hpvj9EN22JHx5FEwaodSurnb1k=; b=O+Ws3B3RKy/N/Ov5lZUBMyeLQzqSHHDvQJCBJBi9/mZC+ZFNyXobcq0jqQsZD1IWam hNPOCdbEM3ZEF+851vgZdK/Hs2fnGvYwdwdbFHA35Dz4LqmpwgKb6wPUR/HUowmYE1re VJDvN07E96M0mcA1MCyVgEqzZ1ZQx0hMqkU+nNDHMiKg3AVKT98LXGTxYGe7B4b7aWNX /Ysq+4TmxhC5DfoxYyuOe/ELtGFtPGT5CmAoTs7yGQv5kc3t3o6njAT4fCBLFk5UWuCl CXc7xqT0ZLpgHJHXFCh8hB5kKHrwj5mIxy8JVhRh8M2kTFPrpAWOgylRgyZu/AWXgwQH pLYQ== X-Gm-Message-State: AOJu0YziiZ/LY+nR1oSWdmToMqzhajzc5dywKuPl4a2UHBnWUfPFwE98 YecTlBr3d7HfzRIDtZ6kPZto3bKK7n7d8I+uU9W3Rw2ilfLuln4huUTdjFF6mFg504QnKsrflSY AB3jRZVLJGw== X-Google-Smtp-Source: AGHT+IEC2aK2PYTdQ16nxtlXx/9t0ixIRzuttNvYWiQuHSfVdHIBWiO1lr6s/UhZ5zp4lPl0NB5QAiwhMDw6vw== X-Received: from edumazet1.c.googlers.com ([fda3:e722:ac3:cc00:2b:7d90:c0a8:395a]) (user=edumazet job=sendgmr) by 2002:a25:7905:0:b0:dc6:db9b:7a6d with SMTP id u5-20020a257905000000b00dc6db9b7a6dmr58545ybc.13.1708599038802; Thu, 22 Feb 2024 02:50:38 -0800 (PST) Date: Thu, 22 Feb 2024 10:50:17 +0000 In-Reply-To: <20240222105021.1943116-1-edumazet@google.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20240222105021.1943116-1-edumazet@google.com> X-Mailer: git-send-email 2.44.0.rc1.240.g4c46232300-goog Message-ID: <20240222105021.1943116-11-edumazet@google.com> Subject: [PATCH v2 net-next 10/14] inet: allow ip_valid_fib_dump_req() to be called with RTNL or RCU From: Eric Dumazet To: "David S . Miller" , Jakub Kicinski , Paolo Abeni Cc: netdev@vger.kernel.org, Ido Schimmel , Jiri Pirko , eric.dumazet@gmail.com, Eric Dumazet X-Patchwork-Delegate: kuba@kernel.org Add a new field into struct fib_dump_filter, to let callers tell if they use RTNL locking or RCU. This is used in the following patch, when inet_dump_fib() no longer holds RTNL. Signed-off-by: Eric Dumazet Reviewed-by: Donald Hunter --- include/net/ip_fib.h | 1 + net/ipv4/fib_frontend.c | 15 +++++++++++---- net/ipv4/ipmr.c | 4 +++- net/ipv6/ip6_fib.c | 7 +++++-- net/ipv6/ip6mr.c | 4 +++- net/mpls/af_mpls.c | 4 +++- 6 files changed, 26 insertions(+), 9 deletions(-) diff --git a/include/net/ip_fib.h b/include/net/ip_fib.h index d4667b7797e3e4591f3ff1fe641f168295e0a894..9b2f69ba5e4981fb108581c229ff008d04750ade 100644 --- a/include/net/ip_fib.h +++ b/include/net/ip_fib.h @@ -264,6 +264,7 @@ struct fib_dump_filter { bool filter_set; bool dump_routes; bool dump_exceptions; + bool rtnl_held; unsigned char protocol; unsigned char rt_type; unsigned int flags; diff --git a/net/ipv4/fib_frontend.c b/net/ipv4/fib_frontend.c index 390f4be7f7bec20f33aa80e9bf12d5e2f3760562..39f67990e01c19b73a622dced0220a1bba21d5e6 100644 --- a/net/ipv4/fib_frontend.c +++ b/net/ipv4/fib_frontend.c @@ -916,7 +916,8 @@ int ip_valid_fib_dump_req(struct net *net, const struct nlmsghdr *nlh, struct rtmsg *rtm; int err, i; - ASSERT_RTNL(); + if (filter->rtnl_held) + ASSERT_RTNL(); if (nlh->nlmsg_len < nlmsg_msg_size(sizeof(*rtm))) { NL_SET_ERR_MSG(extack, "Invalid header for FIB dump request"); @@ -961,7 +962,10 @@ int ip_valid_fib_dump_req(struct net *net, const struct nlmsghdr *nlh, break; case RTA_OIF: ifindex = nla_get_u32(tb[i]); - filter->dev = __dev_get_by_index(net, ifindex); + if (filter->rtnl_held) + filter->dev = __dev_get_by_index(net, ifindex); + else + filter->dev = dev_get_by_index_rcu(net, ifindex); if (!filter->dev) return -ENODEV; break; @@ -983,8 +987,11 @@ EXPORT_SYMBOL_GPL(ip_valid_fib_dump_req); static int inet_dump_fib(struct sk_buff *skb, struct netlink_callback *cb) { - struct fib_dump_filter filter = { .dump_routes = true, - .dump_exceptions = true }; + struct fib_dump_filter filter = { + .dump_routes = true, + .dump_exceptions = true, + .rtnl_held = true, + }; const struct nlmsghdr *nlh = cb->nlh; struct net *net = sock_net(skb->sk); unsigned int h, s_h; diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c index 5561bce3a37e8f72d08ff8062d6b8cde08bbed44..0708ac6f6c582681ab1f2b52c5ce1f2a4acd10de 100644 --- a/net/ipv4/ipmr.c +++ b/net/ipv4/ipmr.c @@ -2587,7 +2587,9 @@ static int ipmr_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh, static int ipmr_rtm_dumproute(struct sk_buff *skb, struct netlink_callback *cb) { - struct fib_dump_filter filter = {}; + struct fib_dump_filter filter = { + .rtnl_held = true, + }; int err; if (cb->strict_check) { diff --git a/net/ipv6/ip6_fib.c b/net/ipv6/ip6_fib.c index 6540d877d3693e788d000309950f3735554c937d..5c558dc1c6838681c2848412dced72a41fe764be 100644 --- a/net/ipv6/ip6_fib.c +++ b/net/ipv6/ip6_fib.c @@ -620,8 +620,11 @@ static int fib6_dump_table(struct fib6_table *table, struct sk_buff *skb, static int inet6_dump_fib(struct sk_buff *skb, struct netlink_callback *cb) { - struct rt6_rtnl_dump_arg arg = { .filter.dump_exceptions = true, - .filter.dump_routes = true }; + struct rt6_rtnl_dump_arg arg = { + .filter.dump_exceptions = true, + .filter.dump_routes = true, + .filter.rtnl_held = true, + }; const struct nlmsghdr *nlh = cb->nlh; struct net *net = sock_net(skb->sk); unsigned int h, s_h; diff --git a/net/ipv6/ip6mr.c b/net/ipv6/ip6mr.c index 1f19743f254064852139809143b60c1d397fe1d8..cb0ee81a068a4c895d5d8b21f3fc557bf1784dfb 100644 --- a/net/ipv6/ip6mr.c +++ b/net/ipv6/ip6mr.c @@ -2592,7 +2592,9 @@ static int ip6mr_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh, static int ip6mr_rtm_dumproute(struct sk_buff *skb, struct netlink_callback *cb) { const struct nlmsghdr *nlh = cb->nlh; - struct fib_dump_filter filter = {}; + struct fib_dump_filter filter = { + .rtnl_held = true, + }; int err; if (cb->strict_check) { diff --git a/net/mpls/af_mpls.c b/net/mpls/af_mpls.c index 1af29af65388584e9666f4fcb73a16e8ff159587..6dab883a08dda46ff6ddc1e6e407e6f48a10c8aa 100644 --- a/net/mpls/af_mpls.c +++ b/net/mpls/af_mpls.c @@ -2179,7 +2179,9 @@ static int mpls_dump_routes(struct sk_buff *skb, struct netlink_callback *cb) const struct nlmsghdr *nlh = cb->nlh; struct net *net = sock_net(skb->sk); struct mpls_route __rcu **platform_label; - struct fib_dump_filter filter = {}; + struct fib_dump_filter filter = { + .rtnl_held = true, + }; unsigned int flags = NLM_F_MULTI; size_t platform_labels; unsigned int index; From patchwork Thu Feb 22 10:50:18 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eric Dumazet X-Patchwork-Id: 13567050 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-yb1-f202.google.com (mail-yb1-f202.google.com [209.85.219.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CAC963FB32 for ; Thu, 22 Feb 2024 10:50:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1708599043; cv=none; b=GYKlhoXqCHdhmZA8LLksw1fIHCNdYdxemZN7RMLLchfpWHgMcOlbExZiM/52x4g00hmnpsqcVuvq/XT7sAUMDajtDW3MTaPv5Bz/cgkdIAOIlTwPVO+zcLQBYUBQD2AtfqYFT5Nf0UqR1HNlHk4K2I2/5tBgeXMFByFi73VaoDQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1708599043; c=relaxed/simple; bh=ZU4oeEfhU5OZbWK+BI/TSMwQ0vUnw8HyL+5sNKPGSGI=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=FpJFGrV9F8cC3+xBwr/3G7JzWgJGHYLR/18sdZLSN3AyPjYVCGbSrJNMYVqdBrysxg02fiQmILJxxgX3XY/Yb3hhgFtuFQWw49fYmAivYNkUJLgoyVgpqdrLpXNmWRENtBWwzlu99QU46+GSvUbDs+HoQ1vDWnFK5MQUd5Tp5Fk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--edumazet.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=AVhV1rFs; arc=none smtp.client-ip=209.85.219.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--edumazet.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="AVhV1rFs" Received: by mail-yb1-f202.google.com with SMTP id 3f1490d57ef6-dcc15b03287so10695690276.3 for ; Thu, 22 Feb 2024 02:50:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1708599040; x=1709203840; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=QCNZ1Oh8pK4G7CjTauMRJpkImioYlZW9fkTy2ao9pP4=; b=AVhV1rFsvgBS1Z/Vb6WUpNt3uEYCFg3NyzN37iV7tLpSWwfwJHGUsLD+oaj0WlQInw J4k/sjDGY7yVsjtLwhhA/06Gw8qitiNOJcNOhKUz9BcDEewPCyiMWvTiTElE/TKmMT9x 6NiSIj78ggZnGxA1oWa19ArQj5Q2mofNaHuGv5y9pd31tRCzVGRQBX/1401lGM14rpsh LVYMG8Y5KOS+4OI/xxKiA9ac9mvt/0t9y/mk6Ibhf6uCmBhPsy0iWNYLNnvr3BxAYTx4 SEP5mmasN3dOLgyTe8mjw9PBqo73ocXkBCxokiKHhjihE3vgHcmT54/Txyl1FtJ1NwfC Hl7Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1708599040; x=1709203840; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=QCNZ1Oh8pK4G7CjTauMRJpkImioYlZW9fkTy2ao9pP4=; b=SKN68afO+ptm6djng22kZgWnAMjoWzYPLC01kzrV7NjyOgow2g2CKgoers0kHrHBXW lDvM5ih7eNORwBPb/+47xbcuQEPZm7KylDMV3+w3pN+3JfKfUBTha04Xo+onGKZxPL3Z zdAzD/TmUeijgu6LolULpO1zBCkiQNgO7GU8/+E+RwI+0uek7XI5kdY/xW7PhyeuH5Ik gdmo7ZRcft1oiPw//RNFZXfglso1viVQrnVvmwceEJbaM0QSaAD0zHh16C6Xwb0SBGVw iz5A64pR7M8xVJCOsnER5UHO5dIh+25RzS5C82HQ26lKd6q9+FudXfHIXWUpNu8vdBG6 EyGg== X-Gm-Message-State: AOJu0Yxo9JO3n04EvD2KY6vUEVxOos/adCJxRJ2YdpaUHb+A8WcyOpP2 Q8hhXzA8biP2YWih+cwRVJbdC9ZVImrtj5KkjbH5iMPnW3xCKrUkta4DHu0tpNuQ33x4Ig/OlYB U70VLvRvJTg== X-Google-Smtp-Source: AGHT+IECjnBe+Q3Yg2wF+4vfmR+tArZccZHJdUWOvADWK4nVjdhz5pvR+bLxqRlkir7JSrGdNpxP1QJS+8/RKw== X-Received: from edumazet1.c.googlers.com ([fda3:e722:ac3:cc00:2b:7d90:c0a8:395a]) (user=edumazet job=sendgmr) by 2002:a05:6902:102d:b0:dcc:79ab:e522 with SMTP id x13-20020a056902102d00b00dcc79abe522mr79024ybt.11.1708599040733; Thu, 22 Feb 2024 02:50:40 -0800 (PST) Date: Thu, 22 Feb 2024 10:50:18 +0000 In-Reply-To: <20240222105021.1943116-1-edumazet@google.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20240222105021.1943116-1-edumazet@google.com> X-Mailer: git-send-email 2.44.0.rc1.240.g4c46232300-goog Message-ID: <20240222105021.1943116-12-edumazet@google.com> Subject: [PATCH v2 net-next 11/14] nexthop: allow nexthop_mpath_fill_node() to be called without RTNL From: Eric Dumazet To: "David S . Miller" , Jakub Kicinski , Paolo Abeni Cc: netdev@vger.kernel.org, Ido Schimmel , Jiri Pirko , eric.dumazet@gmail.com, Eric Dumazet X-Patchwork-Delegate: kuba@kernel.org nexthop_mpath_fill_node() will be potentially called from contexts holding rcu_lock instead of RTNL. Suggested-by: Ido Schimmel Link: https://lore.kernel.org/all/ZdZDWVdjMaQkXBgW@shredder/ Signed-off-by: Eric Dumazet Reviewed-by: Donald Hunter --- include/net/nexthop.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/net/nexthop.h b/include/net/nexthop.h index 6647ad509faa02a9a13d58f3405c4a540abc5077..77e99cba60ade85d25329074905b33424c11e7f5 100644 --- a/include/net/nexthop.h +++ b/include/net/nexthop.h @@ -317,7 +317,7 @@ static inline int nexthop_mpath_fill_node(struct sk_buff *skb, struct nexthop *nh, u8 rt_family) { - struct nh_group *nhg = rtnl_dereference(nh->nh_grp); + struct nh_group *nhg = rcu_dereference_rtnl(nh->nh_grp); int i; for (i = 0; i < nhg->num_nh; i++) { From patchwork Thu Feb 22 10:50:19 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eric Dumazet X-Patchwork-Id: 13567051 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-qv1-f73.google.com (mail-qv1-f73.google.com [209.85.219.73]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8E4E246B9A for ; Thu, 22 Feb 2024 10:50:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1708599045; cv=none; b=dmMqnAjQETlgsmeXtegkj8Igo0iCoAS6UxQ0deb3H+m7aGQ50Y61uvTprbdpGyH2S/i6onu6wMci3ilaJ9RI1qPt5uo7iZ2dnsQH3WYnOnMHTdkR6ArAnNVXfwzt1Mt3ptXg0SSy0MdHI2BzaiFW9oVSvKhdTg9lWi3+BoZUwgU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1708599045; c=relaxed/simple; bh=N+Bs28a6pnhNv8XtNlSZ6imQjDe7vJeNMiFm1O4ruY4=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=A+aTT5I1qgNHXwp78/e+lHHGKxa7dB5VX0Pt/ClbNvqjQbhCC6iAdBie9Z2LzJF/NY4HbWJ3pFaP3jtmhghVPuyVh0fCu2AT4j9/9Mkil35bcRfTzGtPocc/14zqSl5a+XClZUyby0p32jR8MmYqB2jIFcAYGD4ODf4oTcvhbk8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--edumazet.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=j+b/L3E1; arc=none smtp.client-ip=209.85.219.73 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--edumazet.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="j+b/L3E1" Received: by mail-qv1-f73.google.com with SMTP id 6a1803df08f44-6800aa45af1so110888586d6.3 for ; Thu, 22 Feb 2024 02:50:43 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1708599042; x=1709203842; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=wE2z4Jpfg0ONY9A2wjnpJ/o8pBYO62Ymup9yjreC9KI=; b=j+b/L3E1u0a8tbd07mgULSFgqZj9pr+D1DZ1u1XXMbOymwzHqIAzEgukz4rJ7pPoxs jN+pIxBS7RpM4JJKG/30gd7kJ7WW3HFfNsxpbauVPVvO2rvL6OQqC68hcIT1xF9j7NEW GwoO1H7RwLPypVu1g9sHyiPgwLH+RB1cO8Mo1/8NcboY56LFJIYoQ1M8uXygaoN6DRJR gp0JSSZ2jiYu2YkBVYMmkxOUgSHlMoZpLNhdlu/xU7bSx8x2yAJgjeJDs6mlJhFO1ipC uFhYTmzAqULqfbhRaJXScRsui13zbDIJQBdu8d0my4Ba97GPwDOkqadlYakgkGtyeoFX ZX1w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1708599042; x=1709203842; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=wE2z4Jpfg0ONY9A2wjnpJ/o8pBYO62Ymup9yjreC9KI=; b=JfkaWL/zJOisCNRyfxw6oIkOuUnXOy4ufdG/keYscQkJdi5/VuSFXiTr9Jqu5JaoKY V0M+hCPb4FY8UsSPlsBVaiVLYk1D7CXvnBxj9yp/Zsy0pUpHixK6ePZK+gZNbv08+rOc I4za4JYjpbD2szi5rNVZIQgU3mhaRWBpLvGTc5khDhrDrxeTieGvhTRvVANHbetYjSvG ZKmjgPnZ02Gi3Xli3lq49SFhRYQKNMzlo9Y4malQPDOh901gT/XFkr2INQSIo/n0LuY/ MmqaokQZuASghvEGBgW6T1QAl4H21nCc+0qznN+4/qoKhmqIKerk2UCPUXIPV4wBvHnp vY0w== X-Gm-Message-State: AOJu0YxurxYDvDr8eLIy6gfuyRZLgxXUAmqx4ErVsgv0h0MUMtxXVlJG ii9BQs6CkS2/umabTgzf/nSMw/XrpS/JNv8vxu2B/o7c0xEeCCEfr7fR9wpAmk8SRQY8wjcNog1 vqI9WKqqWvg== X-Google-Smtp-Source: AGHT+IEzafyWo3HVxBaEtb0RWu8Na7kU87ggmLJn2+y1Ivm8xV1yIhynHUOfs5WKfRbBoIbvYLaZ2dZGUdGWXw== X-Received: from edumazet1.c.googlers.com ([fda3:e722:ac3:cc00:2b:7d90:c0a8:395a]) (user=edumazet job=sendgmr) by 2002:ad4:5c87:0:b0:68f:7ac1:2b3e with SMTP id o7-20020ad45c87000000b0068f7ac12b3emr302581qvh.8.1708599042565; Thu, 22 Feb 2024 02:50:42 -0800 (PST) Date: Thu, 22 Feb 2024 10:50:19 +0000 In-Reply-To: <20240222105021.1943116-1-edumazet@google.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20240222105021.1943116-1-edumazet@google.com> X-Mailer: git-send-email 2.44.0.rc1.240.g4c46232300-goog Message-ID: <20240222105021.1943116-13-edumazet@google.com> Subject: [PATCH v2 net-next 12/14] inet: switch inet_dump_fib() to RCU protection From: Eric Dumazet To: "David S . Miller" , Jakub Kicinski , Paolo Abeni Cc: netdev@vger.kernel.org, Ido Schimmel , Jiri Pirko , eric.dumazet@gmail.com, Eric Dumazet X-Patchwork-Delegate: kuba@kernel.org No longer hold RTNL while calling inet_dump_fib(). Also change return value for a completed dump: Returning 0 instead of skb->len allows NLMSG_DONE to be appended to the skb. User space does not have to call us again to get a standalone NLMSG_DONE marker. Signed-off-by: Eric Dumazet Reviewed-by: Donald Hunter --- net/ipv4/fib_frontend.c | 37 ++++++++++++++++++------------------- net/ipv4/fib_trie.c | 4 ++-- 2 files changed, 20 insertions(+), 21 deletions(-) diff --git a/net/ipv4/fib_frontend.c b/net/ipv4/fib_frontend.c index 39f67990e01c19b73a622dced0220a1bba21d5e6..bf3a2214fe29b6f9b494581b293259e6c5ce6f8c 100644 --- a/net/ipv4/fib_frontend.c +++ b/net/ipv4/fib_frontend.c @@ -990,7 +990,7 @@ static int inet_dump_fib(struct sk_buff *skb, struct netlink_callback *cb) struct fib_dump_filter filter = { .dump_routes = true, .dump_exceptions = true, - .rtnl_held = true, + .rtnl_held = false, }; const struct nlmsghdr *nlh = cb->nlh; struct net *net = sock_net(skb->sk); @@ -998,12 +998,13 @@ static int inet_dump_fib(struct sk_buff *skb, struct netlink_callback *cb) unsigned int e = 0, s_e; struct fib_table *tb; struct hlist_head *head; - int dumped = 0, err; + int dumped = 0, err = 0; + rcu_read_lock(); if (cb->strict_check) { err = ip_valid_fib_dump_req(net, nlh, &filter, cb); if (err < 0) - return err; + goto unlock; } else if (nlmsg_len(nlh) >= sizeof(struct rtmsg)) { struct rtmsg *rtm = nlmsg_data(nlh); @@ -1012,29 +1013,28 @@ static int inet_dump_fib(struct sk_buff *skb, struct netlink_callback *cb) /* ipv4 does not use prefix flag */ if (filter.flags & RTM_F_PREFIX) - return skb->len; + goto unlock; if (filter.table_id) { tb = fib_get_table(net, filter.table_id); if (!tb) { if (rtnl_msg_family(cb->nlh) != PF_INET) - return skb->len; + goto unlock; NL_SET_ERR_MSG(cb->extack, "ipv4: FIB table does not exist"); - return -ENOENT; + err = -ENOENT; + goto unlock; } - - rcu_read_lock(); err = fib_table_dump(tb, skb, cb, &filter); - rcu_read_unlock(); - return skb->len ? : err; + if (err < 0 && skb->len) + err = skb->len; + goto unlock; } s_h = cb->args[0]; s_e = cb->args[1]; - rcu_read_lock(); - + err = 0; for (h = s_h; h < FIB_TABLE_HASHSZ; h++, s_e = 0) { e = 0; head = &net->ipv4.fib_table_hash[h]; @@ -1047,9 +1047,8 @@ static int inet_dump_fib(struct sk_buff *skb, struct netlink_callback *cb) err = fib_table_dump(tb, skb, cb, &filter); if (err < 0) { if (likely(skb->len)) - goto out; - - goto out_err; + err = skb->len; + goto out; } dumped = 1; next: @@ -1057,13 +1056,12 @@ static int inet_dump_fib(struct sk_buff *skb, struct netlink_callback *cb) } } out: - err = skb->len; -out_err: - rcu_read_unlock(); cb->args[1] = e; cb->args[0] = h; +unlock: + rcu_read_unlock(); return err; } @@ -1666,5 +1664,6 @@ void __init ip_fib_init(void) rtnl_register(PF_INET, RTM_NEWROUTE, inet_rtm_newroute, NULL, 0); rtnl_register(PF_INET, RTM_DELROUTE, inet_rtm_delroute, NULL, 0); - rtnl_register(PF_INET, RTM_GETROUTE, NULL, inet_dump_fib, 0); + rtnl_register(PF_INET, RTM_GETROUTE, NULL, inet_dump_fib, + RTNL_FLAG_DUMP_UNLOCKED); } diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c index 0fc7ab5832d1ae00e33fdf6fad4ef379c7d0bd4d..f474106464d2f2a52fa6b7ecaf2146977d05eecc 100644 --- a/net/ipv4/fib_trie.c +++ b/net/ipv4/fib_trie.c @@ -2368,7 +2368,7 @@ int fib_table_dump(struct fib_table *tb, struct sk_buff *skb, * and key == 0 means the dump has wrapped around and we are done. */ if (count && !key) - return skb->len; + return 0; while ((l = leaf_walk_rcu(&tp, key)) != NULL) { int err; @@ -2394,7 +2394,7 @@ int fib_table_dump(struct fib_table *tb, struct sk_buff *skb, cb->args[3] = key; cb->args[2] = count; - return skb->len; + return 0; } void __init fib_trie_init(void) From patchwork Thu Feb 22 10:50:20 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eric Dumazet X-Patchwork-Id: 13567052 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-yw1-f202.google.com (mail-yw1-f202.google.com [209.85.128.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5D2534778C for ; Thu, 22 Feb 2024 10:50:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1708599046; cv=none; b=FgJIxQdOzpERJCHyXEdE3tP3nICBmaR9phD7S7/1rRbiB9lwtdVtblcP4avliuwTFKROVjXq40cyZ45tgpXzYQdh8WVveRYuOD/bNuKaB9GQerpUdPtlnShE8CYo84TN5iYUv759jQDVf77SsITEvJ6357eULhXlJ0f3EDOz+Fc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1708599046; c=relaxed/simple; bh=VglDODfgTuLREY6IzJg2Hlr5JPXnqGFag1GN5Ss7wKk=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=uN59STrsuR8LUEMEWHP8hHeI/mZv9KMOh8J5JI1jgj52O8m698hxGeDX8LHGC+FtA/eygdflbsuOCLnIqdbSPyUXdthKvpUKVq5/KUvxqidWSUkG/XutrW6VsWqHkzI+k6cIbsveexSYT8cTcjACxyHxtOkipxNn1qtaE7M5SZw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--edumazet.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=K1K6fESd; arc=none smtp.client-ip=209.85.128.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--edumazet.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="K1K6fESd" Received: by mail-yw1-f202.google.com with SMTP id 00721157ae682-608835a1febso31531497b3.2 for ; Thu, 22 Feb 2024 02:50:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1708599044; x=1709203844; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=ekIED0L9mzs+tfyZQFf1JodivwiLa0Xf5K0keSbJ/3U=; b=K1K6fESdNM1f7ez6z4oMftdiyw1yItz9PGkaPLziVdlhMEmk4qJ6qdbuMr6LgSoy8U Ue6zIOWE/7W5+Fe5CO/e7Vhr3AhGQLuNMDlyCmsh9ZNbyf74zhROmO2tln7uzHtige+K J+9b4nJUNGg+R49BxWTHXr9xbtoMG3uoTBoEXbklT/MrOyig+ofOgFYfFNf3GE8ez8lb 1MXd7cEKin9+1WQRQfMIEFx28PDGPoWUas7sY6ijzFzxSLT6aRWYpYpUcSzWWipQzPln 3CkxmSm25+Xv3lNxLrxFPuNz+x8NVQMA6ICcMk1pRWCATEUBcWUPHJthVdE2hw3lPfPY RIAw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1708599044; x=1709203844; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=ekIED0L9mzs+tfyZQFf1JodivwiLa0Xf5K0keSbJ/3U=; b=HBqWCVqSg9mdO0onn8WRX2zqZktSzZiawCliXmjbi0VErDs9i8HRRTuuvdBUWj9PlI nFW1rWkfLKOpVtKey8XgNxPmpivfnfaKpCVYVAiyd6yIEuMW+zaC8PGPgFOnUz0aeOlQ s4rVavdp1vJtVVBnJ6w9WnauNePWS0g9/pYuNQK9+NSgRp94Dx+rwgERaoopQnlThS9T rJQkmozOGZHVpb+aV+Tsh/LUQaphyOXRTa8vJ7g93/LouLREyBw5fK9exUkIVhJI6Ll4 wzBmJe4a03gdr283m9e1upvC1ppve6iQijyD5ugDbVPH4JiMZ2MAyGkzjz16o41/otiO JBVw== X-Gm-Message-State: AOJu0Yz2bzTz5oaK32TL4wohnIINhuuSI1w6TZGyJdEkle4sPbtDFDZG orJIInnAv7iRzwKxhMHMPUc4TjNnxUaQiIJtMnsvJo5R/iiJSvWCkz7Jis1noCMZW041YVbsRKl uO+t1W1Oz5A== X-Google-Smtp-Source: AGHT+IHFM8irej62sYOIi/Rg1arSySLzvYhRYIM5b9hyFrOMO8ZAO6sI2sgwNci1e5Kn0nIAdC1jSoiN4Ct9hw== X-Received: from edumazet1.c.googlers.com ([fda3:e722:ac3:cc00:2b:7d90:c0a8:395a]) (user=edumazet job=sendgmr) by 2002:a05:690c:11:b0:608:c2c:30a9 with SMTP id bc17-20020a05690c001100b006080c2c30a9mr3930113ywb.0.1708599044413; Thu, 22 Feb 2024 02:50:44 -0800 (PST) Date: Thu, 22 Feb 2024 10:50:20 +0000 In-Reply-To: <20240222105021.1943116-1-edumazet@google.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20240222105021.1943116-1-edumazet@google.com> X-Mailer: git-send-email 2.44.0.rc1.240.g4c46232300-goog Message-ID: <20240222105021.1943116-14-edumazet@google.com> Subject: [PATCH v2 net-next 13/14] rtnetlink: make rtnl_fill_link_ifmap() RCU ready From: Eric Dumazet To: "David S . Miller" , Jakub Kicinski , Paolo Abeni Cc: netdev@vger.kernel.org, Ido Schimmel , Jiri Pirko , eric.dumazet@gmail.com, Eric Dumazet X-Patchwork-Delegate: kuba@kernel.org Use READ_ONCE() to read the following device fields: dev->mem_start dev->mem_end dev->base_addr dev->irq dev->dma dev->if_port Signed-off-by: Eric Dumazet Reviewed-by: Donald Hunter --- net/core/rtnetlink.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 1b26dfa5668d22fb2e30ceefbf143e98df13ae29..2d83ab76a3c95c3200016a404e740bb058f23ada 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c @@ -1455,17 +1455,18 @@ static noinline_for_stack int rtnl_fill_vf(struct sk_buff *skb, return 0; } -static int rtnl_fill_link_ifmap(struct sk_buff *skb, struct net_device *dev) +static int rtnl_fill_link_ifmap(struct sk_buff *skb, + const struct net_device *dev) { struct rtnl_link_ifmap map; memset(&map, 0, sizeof(map)); - map.mem_start = dev->mem_start; - map.mem_end = dev->mem_end; - map.base_addr = dev->base_addr; - map.irq = dev->irq; - map.dma = dev->dma; - map.port = dev->if_port; + map.mem_start = READ_ONCE(dev->mem_start); + map.mem_end = READ_ONCE(dev->mem_end); + map.base_addr = READ_ONCE(dev->base_addr); + map.irq = READ_ONCE(dev->irq); + map.dma = READ_ONCE(dev->dma); + map.port = READ_ONCE(dev->if_port); if (nla_put_64bit(skb, IFLA_MAP, sizeof(map), &map, IFLA_PAD)) return -EMSGSIZE; @@ -1875,9 +1876,6 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, goto nla_put_failure; } - if (rtnl_fill_link_ifmap(skb, dev)) - goto nla_put_failure; - if (dev->addr_len) { if (nla_put(skb, IFLA_ADDRESS, dev->addr_len, dev->dev_addr) || nla_put(skb, IFLA_BROADCAST, dev->addr_len, dev->broadcast)) @@ -1927,6 +1925,9 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, rcu_read_lock(); if (rtnl_fill_link_af(skb, dev, ext_filter_mask)) goto nla_put_failure_rcu; + if (rtnl_fill_link_ifmap(skb, dev)) + goto nla_put_failure_rcu; + rcu_read_unlock(); if (rtnl_fill_prop_list(skb, dev)) From patchwork Thu Feb 22 10:50:21 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eric Dumazet X-Patchwork-Id: 13567115 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-yb1-f201.google.com (mail-yb1-f201.google.com [209.85.219.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 781DE46546 for ; Thu, 22 Feb 2024 11:30:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1708601425; cv=none; b=cl4WMYMSu428f+dh0XEDXXxqhVzaLTJHwmP94ctkEqtqNBwvTsoBaflsVvbOBFaTTR1HacztESDzw/3ic4KElkIotpsob6hwbuMUf85DpgmzCcVbvZhkzaHPOGNR3sPCA8w2Qp3YPPgqt+8ne6OOl4Q+hPs45fFG7ORNNGjT77w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1708601425; c=relaxed/simple; bh=5L383K71Sykzof3XggUP6MeeOoWIwWQ6SWasb2J3J1o=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=uz6dhpoK2VmZ/mF7WYH1sCOTTvEjV0fPCTdYh6+N90InptXFKCzplES6I5W8giyvHgJe3JPigtqAlSAgdpCEoZsXmuXNA/sCZs8XLoH5arDlIOxQLJ6i+DouGcL/D3xGLsKaOvK/O6sUlZLLyyloHaObgZ/m7LM2iDTNcg5CpOk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--edumazet.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=dA6VRlDY; arc=none smtp.client-ip=209.85.219.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--edumazet.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="dA6VRlDY" Received: by mail-yb1-f201.google.com with SMTP id 3f1490d57ef6-dc6b5d1899eso1074602276.0 for ; Thu, 22 Feb 2024 03:30:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1708601423; x=1709206223; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=3lL5tq1nReVh6oRLdhmYTpJJlu1xVX+Bj353+8k9A24=; b=dA6VRlDY50Dsc+ygTpa5eZ4rA00bRlI/Q47yyKX0o3oXMDdA+OAaVSpPeIizEgfz3X InliPPStCYMrw2pk2SeVZHP2txKcxn/K6r8dflUrSdn/G2HUjCu7rDtjUc49uOUVznYG oc/5XnylKC9nWkMnJDQugJldFBHSL1Q2dQHAJwLAsvtn4aQgwCsYeUpSHzU++xC8e1Kr YnFPF62ZGinJAHJshOc6C0n1p68vR/c27qO0xNhpSWPJZfvMz/3+LkYt1QU7iP5OsISc uKuOPjL8nbmGKDXTwXQMvuchY8VNoWRrEHp2d9MR/gfbswjaAVXk96VyaHKJ/HtEOvbn C/Fw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1708601423; x=1709206223; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=3lL5tq1nReVh6oRLdhmYTpJJlu1xVX+Bj353+8k9A24=; b=pVT+DQD2MJPYQFExXvqd8aD0vE7eaL3ej/XIfeuxtES1TB16AOQCFWQkHv544w1UQz NXpLe97K69KzGN9NKX/IEKVPu3lR5Pl9I3Bx6e+A7oqgcEFkKMK/n0Zqzf2SZKTeAwsB /DNUK4OOlXSC0rXRp7Z7govpyCg9IXSYU43RXpssMQOQIlzumZwyZ80PV5mQgPBH7C7u aHCsI7U5zYoJNA4ziCj6sd2XRBfA0q63VbVxTgXLh027TunYes5wU0QgeC6rjnkYWvYt lX0tJ+O3cY61470Ifh9ds5N4kFRyC/2t5YS7beTzgYwnrpMOnhWF3s1bDyrDg71keLlb SHGw== X-Gm-Message-State: AOJu0Yy+RGvhpmoSp+29riLN2xXJ1FMv33N0nPBRhf1SAmXOZGhGeth4 Sr+FLMh359RxQOmCerBjnLu+e32D6HhbmV5mPxY75/jsjF4OCwELzSwR06aydBgpaIePxWM/l0R nUgaGRkaCdw== X-Google-Smtp-Source: AGHT+IElGV1TUFTzJWvl8+SBjngmvETdhBF8+JDGJrUvUm0aXCCqB+KPpaDWs6LOw031RaoF/OpsgcmslRPj+g== X-Received: from edumazet1.c.googlers.com ([fda3:e722:ac3:cc00:2b:7d90:c0a8:395a]) (user=edumazet job=sendgmr) by 2002:a05:6902:1008:b0:dc6:e884:2342 with SMTP id w8-20020a056902100800b00dc6e8842342mr537089ybt.5.1708601422830; Thu, 22 Feb 2024 03:30:22 -0800 (PST) Date: Thu, 22 Feb 2024 10:50:21 +0000 In-Reply-To: <20240222105021.1943116-1-edumazet@google.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20240222105021.1943116-1-edumazet@google.com> X-Mailer: git-send-email 2.44.0.rc1.240.g4c46232300-goog Message-ID: <20240222105021.1943116-15-edumazet@google.com> Subject: [PATCH v2 net-next 14/14] rtnetlink: provide RCU protection to rtnl_fill_prop_list() From: Eric Dumazet To: "David S . Miller" , Jakub Kicinski , Paolo Abeni Cc: netdev@vger.kernel.org, Ido Schimmel , Jiri Pirko , eric.dumazet@gmail.com, Eric Dumazet X-Patchwork-Delegate: kuba@kernel.org We want to be able to run rtnl_fill_ifinfo() under RCU protection instead of RTNL in the future. dev->name_node items are already rcu protected. Signed-off-by: Eric Dumazet Reviewed-by: Donald Hunter --- net/core/rtnetlink.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 2d83ab76a3c95c3200016a404e740bb058f23ada..39f17d0b6ceaa9fcf29905ab0a97645a4e831990 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c @@ -1699,7 +1699,7 @@ static int rtnl_fill_alt_ifnames(struct sk_buff *skb, struct netdev_name_node *name_node; int count = 0; - list_for_each_entry(name_node, &dev->name_node->list, list) { + list_for_each_entry_rcu(name_node, &dev->name_node->list, list) { if (nla_put_string(skb, IFLA_ALT_IFNAME, name_node->name)) return -EMSGSIZE; count++; @@ -1707,6 +1707,7 @@ static int rtnl_fill_alt_ifnames(struct sk_buff *skb, return count; } +/* RCU protected. */ static int rtnl_fill_prop_list(struct sk_buff *skb, const struct net_device *dev) { @@ -1927,11 +1928,9 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, goto nla_put_failure_rcu; if (rtnl_fill_link_ifmap(skb, dev)) goto nla_put_failure_rcu; - - rcu_read_unlock(); - if (rtnl_fill_prop_list(skb, dev)) - goto nla_put_failure; + goto nla_put_failure_rcu; + rcu_read_unlock(); if (dev->dev.parent && nla_put_string(skb, IFLA_PARENT_DEV_NAME,