netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Heiner Kallweit <hkallweit1@gmail.com>
To: Jakub Kicinski <kuba@kernel.org>, David Miller <davem@davemloft.net>
Cc: "netdev@vger.kernel.org" <netdev@vger.kernel.org>
Subject: [PATCH net-next 1/4] ethtool: runtime-resume netdev parent before ethtool ioctl ops
Date: Sun, 1 Aug 2021 12:36:48 +0200	[thread overview]
Message-ID: <cb44d295-5267-48a7-b7c7-e4bf5b884e7a@gmail.com> (raw)
In-Reply-To: <106547ef-7a61-2064-33f5-3cc8d12adb34@gmail.com>

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 <hkallweit1@gmail.com>
---
 net/ethtool/ioctl.c | 18 +++++++++++++++---
 1 file changed, 15 insertions(+), 3 deletions(-)

diff --git a/net/ethtool/ioctl.c b/net/ethtool/ioctl.c
index baa5d1004..b7ff9abe7 100644
--- a/net/ethtool/ioctl.c
+++ b/net/ethtool/ioctl.c
@@ -23,6 +23,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>
@@ -2589,7 +2590,7 @@ int dev_ethtool(struct net *net, struct ifreq *ifr)
 	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)))
@@ -2645,10 +2646,18 @@ int dev_ethtool(struct net *net, struct ifreq *ifr)
 			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;
 
@@ -2867,6 +2876,9 @@ int dev_ethtool(struct net *net, struct ifreq *ifr)
 
 	if (old_features != dev->features)
 		netdev_features_change(dev);
+out:
+	if (dev->dev.parent)
+		pm_runtime_put(dev->dev.parent);
 
 	return rc;
 }
-- 
2.32.0



  reply	other threads:[~2021-08-01 10:41 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-08-01 10:35 [PATCH net-next 0/4] ethtool: runtime-resume netdev parent before ethtool ops Heiner Kallweit
2021-08-01 10:36 ` Heiner Kallweit [this message]
2021-08-03 20:41   ` [PATCH net-next 1/4] ethtool: runtime-resume netdev parent before ethtool ioctl ops Grygorii Strashko
2021-08-03 21:32     ` Heiner Kallweit
2021-08-04  8:43       ` Grygorii Strashko
2021-08-04 19:33         ` Heiner Kallweit
2021-08-05  8:20           ` Grygorii Strashko
2021-08-05 11:11             ` Joakim Zhang
2021-08-05 11:58               ` Grygorii Strashko
2021-08-05 19:24             ` Heiner Kallweit
2021-08-05 20:00               ` Grygorii Strashko
2021-08-01 10:37 ` [PATCH net-next 2/4] ethtool: move implementation of ethnl_ops_begin/complete to netlink.c Heiner Kallweit
2021-08-01 10:40 ` [PATCH net-next 3/4] ethtool: move netif_device_present check from ethnl_parse_header_dev_get to ethnl_ops_begin Heiner Kallweit
2021-08-01 10:41 ` [PATCH net-next 4/4] ethtool: runtime-resume netdev parent in ethnl_ops_begin Heiner Kallweit
2021-08-05 11:51   ` Julian Wiedmann
2021-08-05 18:48     ` Heiner Kallweit
2021-08-01 16:25 ` [PATCH net-next 0/4] ethtool: runtime-resume netdev parent before ethtool ops Heiner Kallweit
2021-08-02 14:15   ` Jakub Kicinski
2021-08-02 16:42     ` Heiner Kallweit
2021-08-02 16:54       ` Jakub Kicinski
2021-08-02 19:00         ` Heiner Kallweit
2021-08-03 12:00 ` patchwork-bot+netdevbpf

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=cb44d295-5267-48a7-b7c7-e4bf5b884e7a@gmail.com \
    --to=hkallweit1@gmail.com \
    --cc=davem@davemloft.net \
    --cc=kuba@kernel.org \
    --cc=netdev@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).