[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20240620114711.777046-4-edumazet@google.com>
Date: Thu, 20 Jun 2024 11:47:08 +0000
From: Eric Dumazet <edumazet@...gle.com>
To: "David S . Miller" <davem@...emloft.net>, Jakub Kicinski <kuba@...nel.org>,
Paolo Abeni <pabeni@...hat.com>
Cc: Ziwei Xiao <ziweixiao@...gle.com>, Praveen Kaligineedi <pkaligineedi@...gle.com>,
Harshitha Ramamurthy <hramamurthy@...gle.com>, Willem de Bruijn <willemb@...gle.com>,
Jeroen de Borst <jeroendb@...gle.com>, Shailend Chand <shailend@...gle.com>, netdev@...r.kernel.org,
eric.dumazet@...il.com, Eric Dumazet <edumazet@...gle.com>
Subject: [PATCH net-next 3/6] net: ethtool: perform pm duties outside of rtnl lock
Move pm_runtime_get_sync() and pm_runtime_put() out of __dev_ethtool
to dev_ethtool() while RTNL is not yet held.
These helpers do not depend on RTNL.
Signed-off-by: Eric Dumazet <edumazet@...gle.com>
---
net/ethtool/ioctl.c | 21 ++++++++++-----------
1 file changed, 10 insertions(+), 11 deletions(-)
diff --git a/net/ethtool/ioctl.c b/net/ethtool/ioctl.c
index 45e7497839389bad9c6a6b238429b7534bfd6085..70bb0d2fa2ed416fdff3de71a4f752e4a1bba67a 100644
--- a/net/ethtool/ioctl.c
+++ b/net/ethtool/ioctl.c
@@ -2906,14 +2906,6 @@ __dev_ethtool(struct net_device *dev, struct ifreq *ifr,
netdev_features_t old_features;
int rc;
- if (dev->dev.parent)
- pm_runtime_get_sync(dev->dev.parent);
-
- if (!netif_device_present(dev)) {
- rc = -ENODEV;
- goto out;
- }
-
if (dev->ethtool_ops->begin) {
rc = dev->ethtool_ops->begin(dev);
if (rc < 0)
@@ -3137,9 +3129,6 @@ __dev_ethtool(struct net_device *dev, struct ifreq *ifr,
if (old_features != dev->features)
netdev_features_change(dev);
out:
- if (dev->dev.parent)
- pm_runtime_put(dev->dev.parent);
-
return rc;
}
@@ -3183,9 +3172,19 @@ int dev_ethtool(struct net *net, struct ifreq *ifr, void __user *useraddr)
if (!dev)
goto exit_free;
+ if (dev->dev.parent)
+ pm_runtime_get_sync(dev->dev.parent);
+
+ if (!netif_device_present(dev))
+ goto out_pm;
+
rtnl_lock();
rc = __dev_ethtool(dev, ifr, useraddr, ethcmd, sub_cmd, state);
rtnl_unlock();
+
+out_pm:
+ if (dev->dev.parent)
+ pm_runtime_put(dev->dev.parent);
netdev_put(dev, &dev_tracker);
if (rc)
--
2.45.2.627.g7a2c4fd464-goog
Powered by blists - more mailing lists