]> www.infradead.org Git - users/willy/pagecache.git/commitdiff
netdev: fix repeated netlink messages in queue dump
authorJakub Kicinski <kuba@kernel.org>
Fri, 13 Dec 2024 15:22:40 +0000 (07:22 -0800)
committerJakub Kicinski <kuba@kernel.org>
Tue, 17 Dec 2024 01:30:07 +0000 (17:30 -0800)
The context is supposed to record the next queue to dump,
not last dumped. If the dump doesn't fit we will restart
from the already-dumped queue, duplicating the message.

Before this fix and with the selftest improvements later
in this series we see:

  # ./run_kselftest.sh -t drivers/net:queues.py
  timeout set to 45
  selftests: drivers/net: queues.py
  KTAP version 1
  1..2
  # Check| At /root/ksft-net-drv/drivers/net/./queues.py, line 32, in get_queues:
  # Check|     ksft_eq(queues, expected)
  # Check failed 102 != 100
  # Check| At /root/ksft-net-drv/drivers/net/./queues.py, line 32, in get_queues:
  # Check|     ksft_eq(queues, expected)
  # Check failed 101 != 100
  not ok 1 queues.get_queues
  ok 2 queues.addremove_queues
  # Totals: pass:1 fail:1 xfail:0 xpass:0 skip:0 error:0
  not ok 1 selftests: drivers/net: queues.py # exit=1

With the fix:

  # ./ksft-net-drv/run_kselftest.sh -t drivers/net:queues.py
  timeout set to 45
  selftests: drivers/net: queues.py
  KTAP version 1
  1..2
  ok 1 queues.get_queues
  ok 2 queues.addremove_queues
  # Totals: pass:2 fail:0 xfail:0 xpass:0 skip:0 error:0

Fixes: 6b6171db7fc8 ("netdev-genl: Add netlink framework functions for queue")
Reviewed-by: Joe Damato <jdamato@fastly.com>
Link: https://patch.msgid.link/20241213152244.3080955-2-kuba@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/core/netdev-genl.c

index 9527dd46e4dc39a43e965b833df306a5cc44c94d..9f086b19061944d4cae1b92b64b02fdf3f66801c 100644 (file)
@@ -488,24 +488,21 @@ netdev_nl_queue_dump_one(struct net_device *netdev, struct sk_buff *rsp,
                         struct netdev_nl_dump_ctx *ctx)
 {
        int err = 0;
-       int i;
 
        if (!(netdev->flags & IFF_UP))
                return err;
 
-       for (i = ctx->rxq_idx; i < netdev->real_num_rx_queues;) {
-               err = netdev_nl_queue_fill_one(rsp, netdev, i,
+       for (; ctx->rxq_idx < netdev->real_num_rx_queues; ctx->rxq_idx++) {
+               err = netdev_nl_queue_fill_one(rsp, netdev, ctx->rxq_idx,
                                               NETDEV_QUEUE_TYPE_RX, info);
                if (err)
                        return err;
-               ctx->rxq_idx = i++;
        }
-       for (i = ctx->txq_idx; i < netdev->real_num_tx_queues;) {
-               err = netdev_nl_queue_fill_one(rsp, netdev, i,
+       for (; ctx->txq_idx < netdev->real_num_tx_queues; ctx->txq_idx++) {
+               err = netdev_nl_queue_fill_one(rsp, netdev, ctx->txq_idx,
                                               NETDEV_QUEUE_TYPE_TX, info);
                if (err)
                        return err;
-               ctx->txq_idx = i++;
        }
 
        return err;