Skip to content

Commit

Permalink
ethtool: runtime-resume netdev parent before ethtool ioctl ops
Browse files Browse the repository at this point in the history
If a network device is runtime-suspended then:
- network device may be flagged as detached and all ethtool ops (even if not
  accessing the device) will fail because netif_device_present() returns
  false
- ethtool ops may fail because device is not accessible (e.g. because being
  in D3 in case of a PCI device)

It may not be desirable that userspace can't use even simple ethtool ops
that not access the device if interface or link is down. To be more friendly
to userspace let's ensure that device is runtime-resumed when executing the
respective ethtool op in kernel.

Signed-off-by: Heiner Kallweit <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
hkallweit authored and davem330 committed Aug 3, 2021
1 parent c32325b commit f32a213
Showing 1 changed file with 15 additions and 3 deletions.
18 changes: 15 additions & 3 deletions net/ethtool/ioctl.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
#include <linux/rtnetlink.h>
#include <linux/sched/signal.h>
#include <linux/net.h>
#include <linux/pm_runtime.h>
#include <net/devlink.h>
#include <net/xdp_sock_drv.h>
#include <net/flow_offload.h>
Expand Down Expand Up @@ -2692,7 +2693,7 @@ int dev_ethtool(struct net *net, struct ifreq *ifr, void __user *useraddr)
int rc;
netdev_features_t old_features;

if (!dev || !netif_device_present(dev))
if (!dev)
return -ENODEV;

if (copy_from_user(&ethcmd, useraddr, sizeof(ethcmd)))
Expand Down Expand Up @@ -2748,10 +2749,18 @@ int dev_ethtool(struct net *net, struct ifreq *ifr, void __user *useraddr)
return -EPERM;
}

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)
return rc;
if (rc < 0)
goto out;
}
old_features = dev->features;

Expand Down Expand Up @@ -2970,6 +2979,9 @@ int dev_ethtool(struct net *net, struct ifreq *ifr, void __user *useraddr)

if (old_features != dev->features)
netdev_features_change(dev);
out:
if (dev->dev.parent)
pm_runtime_put(dev->dev.parent);

return rc;
}
Expand Down

0 comments on commit f32a213

Please sign in to comment.