netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Antoine Tenart <atenart@kernel.org>
To: davem@davemloft.net, kuba@kernel.org, alexander.duyck@gmail.com
Cc: Antoine Tenart <atenart@kernel.org>, netdev@vger.kernel.org
Subject: [PATCH net-next v4 10/13] net-sysfs: move the rtnl unlock up in the xps show helpers
Date: Thu, 18 Mar 2021 19:37:49 +0100	[thread overview]
Message-ID: <20210318183752.2612563-11-atenart@kernel.org> (raw)
In-Reply-To: <20210318183752.2612563-1-atenart@kernel.org>

Now that nr_ids and num_tc are stored in the xps dev_maps, which are RCU
protected, we do not have the need to protect the maps in the rtnl lock.
Move the rtnl unlock up so we reduce the rtnl locking section.

We also increase the reference count on the subordinate device if any,
as we don't want this device to be freed while we use it (now that the
rtnl lock isn't protecting it in the whole function).

Signed-off-by: Antoine Tenart <atenart@kernel.org>
---
 net/core/net-sysfs.c | 25 +++++++++++--------------
 1 file changed, 11 insertions(+), 14 deletions(-)

diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c
index ca1f3b63cfad..094fea082649 100644
--- a/net/core/net-sysfs.c
+++ b/net/core/net-sysfs.c
@@ -1383,10 +1383,14 @@ static ssize_t xps_cpus_show(struct netdev_queue *queue,
 
 	tc = netdev_txq_to_tc(dev, index);
 	if (tc < 0) {
-		ret = -EINVAL;
-		goto err_rtnl_unlock;
+		rtnl_unlock();
+		return -EINVAL;
 	}
 
+	/* Make sure the subordinate device can't be freed */
+	get_device(&dev->dev);
+	rtnl_unlock();
+
 	rcu_read_lock();
 	dev_maps = rcu_dereference(dev->xps_maps[XPS_CPUS]);
 	nr_ids = dev_maps ? dev_maps->nr_ids : nr_cpu_ids;
@@ -1417,8 +1421,7 @@ static ssize_t xps_cpus_show(struct netdev_queue *queue,
 	}
 out_no_maps:
 	rcu_read_unlock();
-
-	rtnl_unlock();
+	put_device(&dev->dev);
 
 	len = bitmap_print_to_pagebuf(false, buf, mask, nr_ids);
 	bitmap_free(mask);
@@ -1426,8 +1429,7 @@ static ssize_t xps_cpus_show(struct netdev_queue *queue,
 
 err_rcu_unlock:
 	rcu_read_unlock();
-err_rtnl_unlock:
-	rtnl_unlock();
+	put_device(&dev->dev);
 	return ret;
 }
 
@@ -1486,10 +1488,9 @@ static ssize_t xps_rxqs_show(struct netdev_queue *queue, char *buf)
 		return restart_syscall();
 
 	tc = netdev_txq_to_tc(dev, index);
-	if (tc < 0) {
-		ret = -EINVAL;
-		goto err_rtnl_unlock;
-	}
+	rtnl_unlock();
+	if (tc < 0)
+		return -EINVAL;
 
 	rcu_read_lock();
 	dev_maps = rcu_dereference(dev->xps_maps[XPS_RXQS]);
@@ -1522,8 +1523,6 @@ static ssize_t xps_rxqs_show(struct netdev_queue *queue, char *buf)
 out_no_maps:
 	rcu_read_unlock();
 
-	rtnl_unlock();
-
 	len = bitmap_print_to_pagebuf(false, buf, mask, nr_ids);
 	bitmap_free(mask);
 
@@ -1531,8 +1530,6 @@ static ssize_t xps_rxqs_show(struct netdev_queue *queue, char *buf)
 
 err_rcu_unlock:
 	rcu_read_unlock();
-err_rtnl_unlock:
-	rtnl_unlock();
 	return ret;
 }
 
-- 
2.30.2


  parent reply	other threads:[~2021-03-18 18:39 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-03-18 18:37 [PATCH net-next v4 00/13] net: xps: improve the xps maps handling Antoine Tenart
2021-03-18 18:37 ` [PATCH net-next v4 01/13] net-sysfs: convert xps_cpus_show to bitmap_zalloc Antoine Tenart
2021-03-18 18:37 ` [PATCH net-next v4 02/13] net-sysfs: store the return of get_netdev_queue_index in an unsigned int Antoine Tenart
2021-03-18 18:37 ` [PATCH net-next v4 03/13] net-sysfs: make xps_cpus_show and xps_rxqs_show consistent Antoine Tenart
2021-03-18 18:37 ` [PATCH net-next v4 04/13] net: embed num_tc in the xps maps Antoine Tenart
2021-03-18 18:37 ` [PATCH net-next v4 05/13] net: embed nr_ids " Antoine Tenart
2021-03-18 18:37 ` [PATCH net-next v4 06/13] net: remove the xps possible_mask Antoine Tenart
2021-03-18 18:37 ` [PATCH net-next v4 07/13] net: move the xps maps to an array Antoine Tenart
2021-03-18 18:37 ` [PATCH net-next v4 08/13] net: add an helper to copy xps maps to the new dev_maps Antoine Tenart
2021-03-18 18:37 ` [PATCH net-next v4 09/13] net: improve queue removal readability in __netif_set_xps_queue Antoine Tenart
2021-03-18 18:37 ` Antoine Tenart [this message]
2021-03-18 18:37 ` [PATCH net-next v4 11/13] net-sysfs: move the xps cpus/rxqs retrieval in a common function Antoine Tenart
2021-03-18 18:37 ` [PATCH net-next v4 12/13] net: fix use after free in xps Antoine Tenart
2021-03-18 18:37 ` [PATCH net-next v4 13/13] net: NULL the old xps map entries when freeing them Antoine Tenart
2021-03-18 23:10 ` [PATCH net-next v4 00/13] net: xps: improve the xps maps handling 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=20210318183752.2612563-11-atenart@kernel.org \
    --to=atenart@kernel.org \
    --cc=alexander.duyck@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).