mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-24 01:09:38 -05:00
inet_diag: skip over empty buckets
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>
This commit is contained in:
parent
f44e64990b
commit
622a08e8de
1 changed files with 8 additions and 0 deletions
|
@ -1045,6 +1045,10 @@ void inet_diag_dump_icsk(struct inet_hashinfo *hashinfo, struct sk_buff *skb,
|
||||||
num = 0;
|
num = 0;
|
||||||
ilb = &hashinfo->lhash2[i];
|
ilb = &hashinfo->lhash2[i];
|
||||||
|
|
||||||
|
if (hlist_nulls_empty(&ilb->nulls_head)) {
|
||||||
|
s_num = 0;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
spin_lock(&ilb->lock);
|
spin_lock(&ilb->lock);
|
||||||
sk_nulls_for_each(sk, node, &ilb->nulls_head) {
|
sk_nulls_for_each(sk, node, &ilb->nulls_head) {
|
||||||
struct inet_sock *inet = inet_sk(sk);
|
struct inet_sock *inet = inet_sk(sk);
|
||||||
|
@ -1109,6 +1113,10 @@ resume_bind_walk:
|
||||||
accum = 0;
|
accum = 0;
|
||||||
ibb = &hashinfo->bhash2[i];
|
ibb = &hashinfo->bhash2[i];
|
||||||
|
|
||||||
|
if (hlist_empty(&ibb->chain)) {
|
||||||
|
s_num = 0;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
spin_lock_bh(&ibb->lock);
|
spin_lock_bh(&ibb->lock);
|
||||||
inet_bind_bucket_for_each(tb2, &ibb->chain) {
|
inet_bind_bucket_for_each(tb2, &ibb->chain) {
|
||||||
if (!net_eq(ib2_net(tb2), net))
|
if (!net_eq(ib2_net(tb2), net))
|
||||||
|
|
Loading…
Add table
Reference in a new issue