Commit 24dd1fa184595ff095a92de807fdf029b2632673

Authored by Eric Dumazet
Committed by David S. Miller
1 parent 5add300975

net: move bsockets outside of read only beginning of struct inet_hashinfo

And switch bsockets to atomic_t since it might be changed in parallel.

Signed-off-by: Eric Dumazet <dada1@cosmosbay.com>
Acked-by: Evgeniy Polyakov <zbr@ioremap.net>
Signed-off-by: David S. Miller <davem@davemloft.net>

Showing 3 changed files with 6 additions and 4 deletions Side-by-side Diff

include/net/inet_hashtables.h
... ... @@ -134,7 +134,7 @@
134 134 struct inet_bind_hashbucket *bhash;
135 135  
136 136 unsigned int bhash_size;
137   - int bsockets;
  137 + /* 4 bytes hole on 64 bit */
138 138  
139 139 struct kmem_cache *bind_bucket_cachep;
140 140  
... ... @@ -151,6 +151,7 @@
151 151 struct inet_listen_hashbucket listening_hash[INET_LHTABLE_SIZE]
152 152 ____cacheline_aligned_in_smp;
153 153  
  154 + atomic_t bsockets;
154 155 };
155 156  
156 157 static inline struct inet_ehash_bucket *inet_ehash_bucket(
net/ipv4/inet_connection_sock.c
... ... @@ -119,7 +119,7 @@
119 119 (tb->num_owners < smallest_size || smallest_size == -1)) {
120 120 smallest_size = tb->num_owners;
121 121 smallest_rover = rover;
122   - if (hashinfo->bsockets > (high - low) + 1) {
  122 + if (atomic_read(&hashinfo->bsockets) > (high - low) + 1) {
123 123 spin_unlock(&head->lock);
124 124 snum = smallest_rover;
125 125 goto have_snum;
net/ipv4/inet_hashtables.c
... ... @@ -62,7 +62,7 @@
62 62 {
63 63 struct inet_hashinfo *hashinfo = sk->sk_prot->h.hashinfo;
64 64  
65   - hashinfo->bsockets++;
  65 + atomic_inc(&hashinfo->bsockets);
66 66  
67 67 inet_sk(sk)->num = snum;
68 68 sk_add_bind_node(sk, &tb->owners);
... ... @@ -81,7 +81,7 @@
81 81 struct inet_bind_hashbucket *head = &hashinfo->bhash[bhash];
82 82 struct inet_bind_bucket *tb;
83 83  
84   - hashinfo->bsockets--;
  84 + atomic_dec(&hashinfo->bsockets);
85 85  
86 86 spin_lock(&head->lock);
87 87 tb = inet_csk(sk)->icsk_bind_hash;
... ... @@ -532,6 +532,7 @@
532 532 {
533 533 int i;
534 534  
  535 + atomic_set(&h->bsockets, 0);
535 536 for (i = 0; i < INET_LHTABLE_SIZE; i++) {
536 537 spin_lock_init(&h->listening_hash[i].lock);
537 538 INIT_HLIST_NULLS_HEAD(&h->listening_hash[i].head,