summaryrefslogtreecommitdiffstats
path: root/net/core
diff options
context:
space:
mode:
authorHeiner Kallweit <hkallweit1@gmail.com>2020-06-20 22:35:42 +0200
committerDavid S. Miller <davem@davemloft.net>2020-06-22 16:26:01 -0700
commitbd869245a3dcca1c8a77dfade7d3dc69a68365df (patch)
tree01a196cd89ea629ca56643d907765318c0bf9586 /net/core
parent8878adba6ab5414c36b693e09fe46c4416072cc7 (diff)
downloadlinux-bd869245a3dcca1c8a77dfade7d3dc69a68365df.tar.bz2
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>
Diffstat (limited to 'net/core')
-rw-r--r--net/core/dev.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/net/core/dev.c b/net/core/dev.c
index cea7fc1716ca..c5ec4d50acd1 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -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