tcp_metrics: fix tcp_metrics_nl_dump() return value
authorEric Dumazet <edumazet@google.com>
Tue, 16 Apr 2024 16:11:12 +0000 (16:11 +0000)
committerJakub Kicinski <kuba@kernel.org>
Thu, 18 Apr 2024 01:30:58 +0000 (18:30 -0700)
Change tcp_metrics_nl_dump() to return 0 at the end
of a dump so that NLMSG_DONE can be appended
to the current skb, saving one recvmsg() system call.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Link: https://lore.kernel.org/r/20240416161112.1199265-1-edumazet@google.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/ipv4/tcp_metrics.c

index c2a925538542b5d787596b7d76705dda86cf48d8..301881eb23f376339d59a62bebf150b4b1cae3fb 100644 (file)
@@ -766,6 +766,7 @@ static int tcp_metrics_nl_dump(struct sk_buff *skb,
        unsigned int max_rows = 1U << tcp_metrics_hash_log;
        unsigned int row, s_row = cb->args[0];
        int s_col = cb->args[1], col = s_col;
+       int res = 0;
 
        for (row = s_row; row < max_rows; row++, s_col = 0) {
                struct tcp_metrics_block *tm;
@@ -778,7 +779,8 @@ static int tcp_metrics_nl_dump(struct sk_buff *skb,
                                continue;
                        if (col < s_col)
                                continue;
-                       if (tcp_metrics_dump_info(skb, cb, tm) < 0) {
+                       res = tcp_metrics_dump_info(skb, cb, tm);
+                       if (res < 0) {
                                rcu_read_unlock();
                                goto done;
                        }
@@ -789,7 +791,7 @@ static int tcp_metrics_nl_dump(struct sk_buff *skb,
 done:
        cb->args[0] = row;
        cb->args[1] = col;
-       return skb->len;
+       return res;
 }
 
 static int __parse_nl_addr(struct genl_info *info, struct inetpeer_addr *addr,