All of lore.kernel.org
 help / color / mirror / Atom feed
From: Alexander Duyck <alexander.duyck@gmail.com>
To: Antoine Tenart <atenart@kernel.org>
Cc: David Miller <davem@davemloft.net>,
	Jakub Kicinski <kuba@kernel.org>, Netdev <netdev@vger.kernel.org>
Subject: Re: [PATCH net-next v2 12/12] net-sysfs: move the xps cpus/rxqs retrieval in a common function
Date: Mon, 8 Feb 2021 14:45:32 -0800	[thread overview]
Message-ID: <CAKgT0UdP+1giTCzyfZ5x8q51otv2+KiPUN8djF=8XGcMOEZgEQ@mail.gmail.com> (raw)
In-Reply-To: <20210208171917.1088230-13-atenart@kernel.org>

On Mon, Feb 8, 2021 at 9:19 AM Antoine Tenart <atenart@kernel.org> wrote:
>
> Most of the xps_cpus_show and xps_rxqs_show functions share the same
> logic. Having it in two different functions does not help maintenance.
> This patch moves their common logic into a new function, xps_queue_show,
> to improve this.
>
> Signed-off-by: Antoine Tenart <atenart@kernel.org>
> ---
>  net/core/net-sysfs.c | 98 ++++++++++++++------------------------------
>  1 file changed, 31 insertions(+), 67 deletions(-)
>
> diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c
> index 6ce5772e799e..984c15248483 100644
> --- a/net/core/net-sysfs.c
> +++ b/net/core/net-sysfs.c
> @@ -1314,35 +1314,31 @@ static const struct attribute_group dql_group = {
>  #endif /* CONFIG_BQL */
>
>  #ifdef CONFIG_XPS
> -static ssize_t xps_cpus_show(struct netdev_queue *queue,
> -                            char *buf)
> +static ssize_t xps_queue_show(struct net_device *dev, unsigned int index,
> +                             char *buf, enum xps_map_type type)
>  {
> -       struct net_device *dev = queue->dev;
>         struct xps_dev_maps *dev_maps;
> -       unsigned int index, nr_ids;
> -       int j, len, ret, tc = 0;
>         unsigned long *mask;
> -
> -       if (!netif_is_multiqueue(dev))
> -               return -ENOENT;
> -
> -       index = get_netdev_queue_index(queue);
> -
> -       /* If queue belongs to subordinate dev use its map */
> -       dev = netdev_get_tx_queue(dev, index)->sb_dev ? : dev;
> +       unsigned int nr_ids;
> +       int j, len, tc = 0;
>
>         tc = netdev_txq_to_tc(dev, index);
>         if (tc < 0)
>                 return -EINVAL;
>
>         rcu_read_lock();
> -       dev_maps = rcu_dereference(dev->xps_maps[XPS_CPUS]);
> -       nr_ids = dev_maps ? dev_maps->nr_ids : nr_cpu_ids;
> +       dev_maps = rcu_dereference(dev->xps_maps[type]);
> +
> +       /* Default to nr_cpu_ids/dev->num_rx_queues and do not just return 0
> +        * when dev_maps hasn't been allocated yet, to be backward compatible.
> +        */
> +       nr_ids = dev_maps ? dev_maps->nr_ids :
> +                (type == XPS_CPUS ? nr_cpu_ids : dev->num_rx_queues);
>
>         mask = bitmap_zalloc(nr_ids, GFP_KERNEL);
>         if (!mask) {
> -               ret = -ENOMEM;
> -               goto err_rcu_unlock;
> +               rcu_read_unlock();
> +               return -ENOMEM;
>         }
>
>         if (!dev_maps || tc >= dev_maps->num_tc)
> @@ -1368,11 +1364,24 @@ static ssize_t xps_cpus_show(struct netdev_queue *queue,
>
>         len = bitmap_print_to_pagebuf(false, buf, mask, nr_ids);
>         bitmap_free(mask);
> +
>         return len < PAGE_SIZE ? len : -EINVAL;
> +}
>
> -err_rcu_unlock:
> -       rcu_read_unlock();
> -       return ret;
> +static ssize_t xps_cpus_show(struct netdev_queue *queue, char *buf)
> +{
> +       struct net_device *dev = queue->dev;
> +       unsigned int index;
> +
> +       if (!netif_is_multiqueue(dev))
> +               return -ENOENT;
> +
> +       index = get_netdev_queue_index(queue);
> +
> +       /* If queue belongs to subordinate dev use its map */
> +       dev = netdev_get_tx_queue(dev, index)->sb_dev ? : dev;
> +
> +       return xps_queue_show(dev, index, buf, XPS_CPUS);
>  }
>
>  static ssize_t xps_cpus_store(struct netdev_queue *queue,

So this patch has the same issue as the one that was removing the
rtnl_lock. Basically the sb_dev needs to still be protected by the
rtnl_lock. We might need to take the rtnl_lock and maybe make use of
the get_device/put_device logic to make certain the device cannot be
freed while you are passing it to xps_queue_show.

      reply	other threads:[~2021-02-08 22:46 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-02-08 17:19 [PATCH net-next v2 00/12] net: xps: improve the xps maps handling Antoine Tenart
2021-02-08 17:19 ` [PATCH net-next v2 01/12] net-sysfs: convert xps_cpus_show to bitmap_zalloc Antoine Tenart
2021-02-08 17:19 ` [PATCH net-next v2 02/12] net-sysfs: store the return of get_netdev_queue_index in an unsigned int Antoine Tenart
2021-02-08 17:19 ` [PATCH net-next v2 03/12] net-sysfs: make xps_cpus_show and xps_rxqs_show consistent Antoine Tenart
2021-02-08 17:19 ` [PATCH net-next v2 04/12] net: embed num_tc in the xps maps Antoine Tenart
2021-02-08 17:19 ` [PATCH net-next v2 05/12] net: embed nr_ids " Antoine Tenart
2021-02-08 17:19 ` [PATCH net-next v2 06/12] net: assert the rtnl lock is held when calling __netif_set_xps_queue Antoine Tenart
2021-02-23  6:27   ` [net] 81bb8ff453: assertion_failed kernel test robot
2021-02-23  6:27     ` kernel test robot
2021-02-08 17:19 ` [PATCH net-next v2 07/12] net: remove the xps possible_mask Antoine Tenart
2021-02-08 21:43   ` Alexander Duyck
2021-02-09  8:47     ` Antoine Tenart
2021-02-08 17:19 ` [PATCH net-next v2 08/12] net: move the xps maps to an array Antoine Tenart
2021-02-08 17:19 ` [PATCH net-next v2 09/12] net-sysfs: remove the rtnl lock when accessing the xps maps Antoine Tenart
2021-02-08 22:20   ` Alexander Duyck
2021-02-09  9:12     ` Antoine Tenart
2021-02-09  9:20       ` Antoine Tenart
2021-02-08 17:19 ` [PATCH net-next v2 10/12] net: add an helper to copy xps maps to the new dev_maps Antoine Tenart
2021-02-08 17:19 ` [PATCH net-next v2 11/12] net: improve queue removal readability in __netif_set_xps_queue Antoine Tenart
2021-02-08 17:19 ` [PATCH net-next v2 12/12] net-sysfs: move the xps cpus/rxqs retrieval in a common function Antoine Tenart
2021-02-08 22:45   ` Alexander Duyck [this message]

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='CAKgT0UdP+1giTCzyfZ5x8q51otv2+KiPUN8djF=8XGcMOEZgEQ@mail.gmail.com' \
    --to=alexander.duyck@gmail.com \
    --cc=atenart@kernel.org \
    --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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.