diff options
-rw-r--r-- | include/net/inet_sock.h | 25 | ||||
-rw-r--r-- | include/net/sock.h | 25 | ||||
-rw-r--r-- | net/ipv4/inet_connection_sock.c | 2 | ||||
-rw-r--r-- | net/ipv4/tcp.c | 4 | ||||
-rw-r--r-- | net/ipv4/tcp_diag.c | 2 | ||||
-rw-r--r-- | net/ipv4/tcp_ipv4.c | 2 | ||||
-rw-r--r-- | net/ipv6/tcp_ipv6.c | 2 |
7 files changed, 30 insertions, 32 deletions
diff --git a/include/net/inet_sock.h b/include/net/inet_sock.h index a3431a4ff9cc..0a671c32d6b9 100644 --- a/include/net/inet_sock.h +++ b/include/net/inet_sock.h | |||
@@ -290,9 +290,32 @@ static inline void inet_sk_copy_descendant(struct sock *sk_to, | |||
290 | #endif | 290 | #endif |
291 | 291 | ||
292 | int inet_sk_rebuild_header(struct sock *sk); | 292 | int inet_sk_rebuild_header(struct sock *sk); |
293 | void inet_sk_set_state(struct sock *sk, int state); | 293 | |
294 | /** | ||
295 | * inet_sk_state_load - read sk->sk_state for lockless contexts | ||
296 | * @sk: socket pointer | ||
297 | * | ||
298 | * Paired with inet_sk_state_store(). Used in places we don't hold socket lock: | ||
299 | * tcp_diag_get_info(), tcp_get_info(), tcp_poll(), get_tcp4_sock() ... | ||
300 | */ | ||
301 | static inline int inet_sk_state_load(const struct sock *sk) | ||
302 | { | ||
303 | /* state change might impact lockless readers. */ | ||
304 | return smp_load_acquire(&sk->sk_state); | ||
305 | } | ||
306 | |||
307 | /** | ||
308 | * inet_sk_state_store - update sk->sk_state | ||
309 | * @sk: socket pointer | ||
310 | * @newstate: new state | ||
311 | * | ||
312 | * Paired with inet_sk_state_load(). Should be used in contexts where | ||
313 | * state change might impact lockless readers. | ||
314 | */ | ||
294 | void inet_sk_state_store(struct sock *sk, int newstate); | 315 | void inet_sk_state_store(struct sock *sk, int newstate); |
295 | 316 | ||
317 | void inet_sk_set_state(struct sock *sk, int state); | ||
318 | |||
296 | static inline unsigned int __inet_ehashfn(const __be32 laddr, | 319 | static inline unsigned int __inet_ehashfn(const __be32 laddr, |
297 | const __u16 lport, | 320 | const __u16 lport, |
298 | const __be32 faddr, | 321 | const __be32 faddr, |
diff --git a/include/net/sock.h b/include/net/sock.h index 0a32f3ce381c..6c1db823f8b9 100644 --- a/include/net/sock.h +++ b/include/net/sock.h | |||
@@ -2333,31 +2333,6 @@ static inline bool sk_listener(const struct sock *sk) | |||
2333 | return (1 << sk->sk_state) & (TCPF_LISTEN | TCPF_NEW_SYN_RECV); | 2333 | return (1 << sk->sk_state) & (TCPF_LISTEN | TCPF_NEW_SYN_RECV); |
2334 | } | 2334 | } |
2335 | 2335 | ||
2336 | /** | ||
2337 | * sk_state_load - read sk->sk_state for lockless contexts | ||
2338 | * @sk: socket pointer | ||
2339 | * | ||
2340 | * Paired with sk_state_store(). Used in places we do not hold socket lock : | ||
2341 | * tcp_diag_get_info(), tcp_get_info(), tcp_poll(), get_tcp4_sock() ... | ||
2342 | */ | ||
2343 | static inline int sk_state_load(const struct sock *sk) | ||
2344 | { | ||
2345 | return smp_load_acquire(&sk->sk_state); | ||
2346 | } | ||
2347 | |||
2348 | /** | ||
2349 | * sk_state_store - update sk->sk_state | ||
2350 | * @sk: socket pointer | ||
2351 | * @newstate: new state | ||
2352 | * | ||
2353 | * Paired with sk_state_load(). Should be used in contexts where | ||
2354 | * state change might impact lockless readers. | ||
2355 | */ | ||
2356 | static inline void sk_state_store(struct sock *sk, int newstate) | ||
2357 | { | ||
2358 | smp_store_release(&sk->sk_state, newstate); | ||
2359 | } | ||
2360 | |||
2361 | void sock_enable_timestamp(struct sock *sk, int flag); | 2336 | void sock_enable_timestamp(struct sock *sk, int flag); |
2362 | int sock_get_timestamp(struct sock *, struct timeval __user *); | 2337 | int sock_get_timestamp(struct sock *, struct timeval __user *); |
2363 | int sock_get_timestampns(struct sock *, struct timespec __user *); | 2338 | int sock_get_timestampns(struct sock *, struct timespec __user *); |
diff --git a/net/ipv4/inet_connection_sock.c b/net/ipv4/inet_connection_sock.c index f460fc04aa66..12410ec6f7f7 100644 --- a/net/ipv4/inet_connection_sock.c +++ b/net/ipv4/inet_connection_sock.c | |||
@@ -685,7 +685,7 @@ static void reqsk_timer_handler(struct timer_list *t) | |||
685 | int max_retries, thresh; | 685 | int max_retries, thresh; |
686 | u8 defer_accept; | 686 | u8 defer_accept; |
687 | 687 | ||
688 | if (sk_state_load(sk_listener) != TCP_LISTEN) | 688 | if (inet_sk_state_load(sk_listener) != TCP_LISTEN) |
689 | goto drop; | 689 | goto drop; |
690 | 690 | ||
691 | max_retries = icsk->icsk_syn_retries ? : net->ipv4.sysctl_tcp_synack_retries; | 691 | max_retries = icsk->icsk_syn_retries ? : net->ipv4.sysctl_tcp_synack_retries; |
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index d408fb41c804..67d39b79c801 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
@@ -502,7 +502,7 @@ unsigned int tcp_poll(struct file *file, struct socket *sock, poll_table *wait) | |||
502 | 502 | ||
503 | sock_poll_wait(file, sk_sleep(sk), wait); | 503 | sock_poll_wait(file, sk_sleep(sk), wait); |
504 | 504 | ||
505 | state = sk_state_load(sk); | 505 | state = inet_sk_state_load(sk); |
506 | if (state == TCP_LISTEN) | 506 | if (state == TCP_LISTEN) |
507 | return inet_csk_listen_poll(sk); | 507 | return inet_csk_listen_poll(sk); |
508 | 508 | ||
@@ -2916,7 +2916,7 @@ void tcp_get_info(struct sock *sk, struct tcp_info *info) | |||
2916 | if (sk->sk_type != SOCK_STREAM) | 2916 | if (sk->sk_type != SOCK_STREAM) |
2917 | return; | 2917 | return; |
2918 | 2918 | ||
2919 | info->tcpi_state = sk_state_load(sk); | 2919 | info->tcpi_state = inet_sk_state_load(sk); |
2920 | 2920 | ||
2921 | /* Report meaningful fields for all TCP states, including listeners */ | 2921 | /* Report meaningful fields for all TCP states, including listeners */ |
2922 | rate = READ_ONCE(sk->sk_pacing_rate); | 2922 | rate = READ_ONCE(sk->sk_pacing_rate); |
diff --git a/net/ipv4/tcp_diag.c b/net/ipv4/tcp_diag.c index abbf0edcf6c2..81148f7a2323 100644 --- a/net/ipv4/tcp_diag.c +++ b/net/ipv4/tcp_diag.c | |||
@@ -24,7 +24,7 @@ static void tcp_diag_get_info(struct sock *sk, struct inet_diag_msg *r, | |||
24 | { | 24 | { |
25 | struct tcp_info *info = _info; | 25 | struct tcp_info *info = _info; |
26 | 26 | ||
27 | if (sk_state_load(sk) == TCP_LISTEN) { | 27 | if (inet_sk_state_load(sk) == TCP_LISTEN) { |
28 | r->idiag_rqueue = sk->sk_ack_backlog; | 28 | r->idiag_rqueue = sk->sk_ack_backlog; |
29 | r->idiag_wqueue = sk->sk_max_ack_backlog; | 29 | r->idiag_wqueue = sk->sk_max_ack_backlog; |
30 | } else if (sk->sk_type == SOCK_STREAM) { | 30 | } else if (sk->sk_type == SOCK_STREAM) { |
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index 94e28350f420..dd945b114215 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c | |||
@@ -2281,7 +2281,7 @@ static void get_tcp4_sock(struct sock *sk, struct seq_file *f, int i) | |||
2281 | timer_expires = jiffies; | 2281 | timer_expires = jiffies; |
2282 | } | 2282 | } |
2283 | 2283 | ||
2284 | state = sk_state_load(sk); | 2284 | state = inet_sk_state_load(sk); |
2285 | if (state == TCP_LISTEN) | 2285 | if (state == TCP_LISTEN) |
2286 | rx_queue = sk->sk_ack_backlog; | 2286 | rx_queue = sk->sk_ack_backlog; |
2287 | else | 2287 | else |
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index 7178476b3d2f..aa12a26a96c6 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c | |||
@@ -1795,7 +1795,7 @@ static void get_tcp6_sock(struct seq_file *seq, struct sock *sp, int i) | |||
1795 | timer_expires = jiffies; | 1795 | timer_expires = jiffies; |
1796 | } | 1796 | } |
1797 | 1797 | ||
1798 | state = sk_state_load(sp); | 1798 | state = inet_sk_state_load(sp); |
1799 | if (state == TCP_LISTEN) | 1799 | if (state == TCP_LISTEN) |
1800 | rx_queue = sp->sk_ack_backlog; | 1800 | rx_queue = sp->sk_ack_backlog; |
1801 | else | 1801 | else |