net: core: try to runtime-resume detached device in __dev_open
A netdevice may be marked as detached because the parent is runtime-suspended and not accessible whilst interface or link is down. An example are PCI network devices that go into PCI D3hot, see e.g. __igc_shutdown() or rtl8169_net_suspend(). If netdevice is down and marked as detached we can only open it if we runtime-resume it before __dev_open() calls netif_device_present(). Therefore, if netdevice is detached, try to runtime-resume the parent and only return with an error if it's still detached. Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
8878adba6a
commit
bd869245a3
|
@ -143,6 +143,7 @@
|
|||
#include <linux/net_namespace.h>
|
||||
#include <linux/indirect_call_wrapper.h>
|
||||
#include <net/devlink.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
|
||||
#include "net-sysfs.h"
|
||||
|
||||
|
@ -1492,8 +1493,13 @@ static int __dev_open(struct net_device *dev, struct netlink_ext_ack *extack)
|
|||
|
||||
ASSERT_RTNL();
|
||||
|
||||
if (!netif_device_present(dev))
|
||||
return -ENODEV;
|
||||
if (!netif_device_present(dev)) {
|
||||
/* may be detached because parent is runtime-suspended */
|
||||
if (dev->dev.parent)
|
||||
pm_runtime_resume(dev->dev.parent);
|
||||
if (!netif_device_present(dev))
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
/* Block netpoll from trying to do any rx path servicing.
|
||||
* If we don't do this there is a chance ndo_poll_controller
|
||||
|
|
Loading…
Reference in New Issue