diff options
author | Jakub Kicinski <kuba@kernel.org> | 2021-10-30 10:18:48 -0700 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2021-11-01 13:26:07 +0000 |
commit | f49deaa64af10276ef0c9a09558152f990b5f3b1 (patch) | |
tree | 19a0dfdfbfbd7724c679761822dbf24ba888f2dd | |
parent | c6e03dbe0c7cdbe7b259deeae0f193d15ec5002f (diff) | |
download | linux-f49deaa64af10276ef0c9a09558152f990b5f3b1.tar.gz |
ethtool: push the rtnl_lock into dev_ethtool()
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>
-rw-r--r-- | net/core/dev_ioctl.c | 2 | ||||
-rw-r--r-- | net/ethtool/ioctl.c | 14 |
2 files changed, 13 insertions, 3 deletions
diff --git a/net/core/dev_ioctl.c b/net/core/dev_ioctl.c index 0e87237fd871..cbab5fec64b1 100644 --- a/net/core/dev_ioctl.c +++ b/net/core/dev_ioctl.c @@ -518,9 +518,7 @@ int dev_ioctl(struct net *net, unsigned int cmd, struct ifreq *ifr, case SIOCETHTOOL: dev_load(net, ifr->ifr_name); - rtnl_lock(); ret = dev_ethtool(net, ifr, data); - rtnl_unlock(); if (colon) *colon = ':'; return ret; diff --git a/net/ethtool/ioctl.c b/net/ethtool/ioctl.c index 44430b6ab843..52bfc5b82ec3 100644 --- a/net/ethtool/ioctl.c +++ b/net/ethtool/ioctl.c @@ -2700,7 +2700,8 @@ static int ethtool_set_fecparam(struct net_device *dev, void __user *useraddr) /* 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; union { |