net-sysfs: make xps_cpus_show and xps_rxqs_show consistent
authorAntoine Tenart <atenart@kernel.org>
Thu, 18 Mar 2021 18:37:42 +0000 (19:37 +0100)
committerDavid S. Miller <davem@davemloft.net>
Thu, 18 Mar 2021 21:56:22 +0000 (14:56 -0700)
Make the implementations of xps_cpus_show and xps_rxqs_show to converge,
as the two share the same logic but diverted over time. This should not
modify their behaviour but will help future changes and improve
maintenance.

Signed-off-by: Antoine Tenart <atenart@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/core/net-sysfs.c

index 5dc4223..5f76183 100644 (file)
@@ -1364,7 +1364,7 @@ static const struct attribute_group dql_group = {
 static ssize_t xps_cpus_show(struct netdev_queue *queue,
                             char *buf)
 {
-       int cpu, len, ret, num_tc = 1, tc = 0;
+       int j, len, ret, num_tc = 1, tc = 0;
        struct net_device *dev = queue->dev;
        struct xps_dev_maps *dev_maps;
        unsigned long *mask;
@@ -1404,23 +1404,26 @@ static ssize_t xps_cpus_show(struct netdev_queue *queue,
 
        rcu_read_lock();
        dev_maps = rcu_dereference(dev->xps_cpus_map);
-       if (dev_maps) {
-               for_each_possible_cpu(cpu) {
-                       int i, tci = cpu * num_tc + tc;
-                       struct xps_map *map;
-
-                       map = rcu_dereference(dev_maps->attr_map[tci]);
-                       if (!map)
-                               continue;
-
-                       for (i = map->len; i--;) {
-                               if (map->queues[i] == index) {
-                                       set_bit(cpu, mask);
-                                       break;
-                               }
+       if (!dev_maps)
+               goto out_no_maps;
+
+       for (j = -1; j = netif_attrmask_next(j, NULL, nr_cpu_ids),
+            j < nr_cpu_ids;) {
+               int i, tci = j * num_tc + tc;
+               struct xps_map *map;
+
+               map = rcu_dereference(dev_maps->attr_map[tci]);
+               if (!map)
+                       continue;
+
+               for (i = map->len; i--;) {
+                       if (map->queues[i] == index) {
+                               set_bit(j, mask);
+                               break;
                        }
                }
        }
+out_no_maps:
        rcu_read_unlock();
 
        rtnl_unlock();