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>
This commit is contained in:
Jakub Kicinski 2021-10-30 10:18:48 -07:00 committed by David S. Miller
parent c6e03dbe0c
commit f49deaa64a
2 changed files with 13 additions and 3 deletions

View File

@ -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;

View File

@ -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 {