From: Jakub Kicinski <kuba@kernel.org>
Date: Sat, 30 Oct 2021 10:18:48 -0700
Subject: ethtool: push the rtnl_lock into dev_ethtool()
Patch-mainline: v5.16-rc1
Git-commit: f49deaa64af10276ef0c9a09558152f990b5f3b1
References: jsc#PED-1495
Don't take the lock in net/core/dev_ioctl.c,
we'll have things to do outside rtnl_lock soon.
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Reviewed-by: Leon Romanovsky <leonro@nvidia.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Acked-by: Thomas Bogendoerfer <tbogendoerfer@suse.de>
---
net/core/dev_ioctl.c | 2 --
net/ethtool/ioctl.c | 14 +++++++++++++-
2 files changed, 13 insertions(+), 3 deletions(-)
--- a/net/core/dev_ioctl.c
+++ b/net/core/dev_ioctl.c
@@ -492,9 +492,7 @@ int dev_ioctl(struct net *net, unsigned
case SIOCETHTOOL:
dev_load(net, ifr->ifr_name);
- rtnl_lock();
ret = dev_ethtool(net, ifr, data);
- rtnl_unlock();
if (colon)
*colon = ':';
return ret;
--- a/net/ethtool/ioctl.c
+++ b/net/ethtool/ioctl.c
@@ -2701,7 +2701,8 @@ static int ethtool_set_fecparam(struct n
/* The main entry point in this file. Called from net/core/dev_ioctl.c */
-int dev_ethtool(struct net *net, struct ifreq *ifr, void __user *useraddr)
+static int
+__dev_ethtool(struct net *net, struct ifreq *ifr, void __user *useraddr)
{
struct net_device *dev = __dev_get_by_name(net, ifr->ifr_name);
u32 ethcmd, sub_cmd;
@@ -3000,6 +3001,17 @@ out:
return rc;
}
+
+int dev_ethtool(struct net *net, struct ifreq *ifr, void __user *useraddr)
+{
+ int rc;
+
+ rtnl_lock();
+ rc = __dev_ethtool(net, ifr, useraddr);
+ rtnl_unlock();
+
+ return rc;
+}
struct ethtool_rx_flow_key {
struct flow_dissector_key_basic basic;