]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
inet_diag: skip over empty buckets
authorEric Dumazet <edumazet@google.com>
Mon, 22 Jan 2024 11:26:03 +0000 (11:26 +0000)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 23 Jan 2024 14:13:55 +0000 (15:13 +0100)
After the removal of inet_diag_table_mutex, sock_diag_table_mutex
and sock_diag_mutex, I was able so see spinlock contention from
inet_diag_dump_icsk() when running 100 parallel invocations.

It is time to skip over empty buckets.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Reviewed-by: Guillaume Nault <gnault@redhat.com>
Reviewed-by: Kuniyuki Iwashima <kuniyu@amazon.com>
Reviewed-by: Willem de Bruijn <willemb@google.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
net/ipv4/inet_diag.c

index 2c2d8b9dd8e9bb502e52e30dffc70da36d9b1c74..7adace541fe292851a66ccc4de1da2a60ac4714e 100644 (file)
@@ -1045,6 +1045,10 @@ void inet_diag_dump_icsk(struct inet_hashinfo *hashinfo, struct sk_buff *skb,
                        num = 0;
                        ilb = &hashinfo->lhash2[i];
 
+                       if (hlist_nulls_empty(&ilb->nulls_head)) {
+                               s_num = 0;
+                               continue;
+                       }
                        spin_lock(&ilb->lock);
                        sk_nulls_for_each(sk, node, &ilb->nulls_head) {
                                struct inet_sock *inet = inet_sk(sk);
@@ -1109,6 +1113,10 @@ resume_bind_walk:
                        accum = 0;
                        ibb = &hashinfo->bhash2[i];
 
+                       if (hlist_empty(&ibb->chain)) {
+                               s_num = 0;
+                               continue;
+                       }
                        spin_lock_bh(&ibb->lock);
                        inet_bind_bucket_for_each(tb2, &ibb->chain) {
                                if (!net_eq(ib2_net(tb2), net))