Blob Blame History Raw
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;