Commit 099ecf59 authored by Eric Dumazet's avatar Eric Dumazet Committed by David S. Miller
Browse files

net: annotate lockless accesses to sk->sk_max_ack_backlog



sk->sk_max_ack_backlog can be read without any lock being held
at least in TCP/DCCP cases.

We need to use READ_ONCE()/WRITE_ONCE() to avoid load/store tearing
and/or potential KCSAN warnings.

Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 288efe86
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -869,7 +869,7 @@ static inline void sk_acceptq_added(struct sock *sk)


static inline bool sk_acceptq_is_full(const struct sock *sk)
static inline bool sk_acceptq_is_full(const struct sock *sk)
{
{
	return READ_ONCE(sk->sk_ack_backlog) > sk->sk_max_ack_backlog;
	return READ_ONCE(sk->sk_ack_backlog) > READ_ONCE(sk->sk_max_ack_backlog);
}
}


/*
/*
+1 −1
Original line number Original line Diff line number Diff line
@@ -944,7 +944,7 @@ int inet_dccp_listen(struct socket *sock, int backlog)
	if (!((1 << old_state) & (DCCPF_CLOSED | DCCPF_LISTEN)))
	if (!((1 << old_state) & (DCCPF_CLOSED | DCCPF_LISTEN)))
		goto out;
		goto out;


	sk->sk_max_ack_backlog = backlog;
	WRITE_ONCE(sk->sk_max_ack_backlog, backlog);
	/* Really, if the socket is already in listen state
	/* Really, if the socket is already in listen state
	 * we can only allow the backlog to be adjusted.
	 * we can only allow the backlog to be adjusted.
	 */
	 */
+1 −1
Original line number Original line Diff line number Diff line
@@ -208,7 +208,7 @@ int inet_listen(struct socket *sock, int backlog)
	if (!((1 << old_state) & (TCPF_CLOSE | TCPF_LISTEN)))
	if (!((1 << old_state) & (TCPF_CLOSE | TCPF_LISTEN)))
		goto out;
		goto out;


	sk->sk_max_ack_backlog = backlog;
	WRITE_ONCE(sk->sk_max_ack_backlog, backlog);
	/* Really, if the socket is already in listen state
	/* Really, if the socket is already in listen state
	 * we can only allow the backlog to be adjusted.
	 * we can only allow the backlog to be adjusted.
	 */
	 */
+1 −1
Original line number Original line Diff line number Diff line
@@ -716,7 +716,7 @@ static void reqsk_timer_handler(struct timer_list *t)
	 * ones are about to clog our table.
	 * ones are about to clog our table.
	 */
	 */
	qlen = reqsk_queue_len(queue);
	qlen = reqsk_queue_len(queue);
	if ((qlen << 1) > max(8U, sk_listener->sk_max_ack_backlog)) {
	if ((qlen << 1) > max(8U, READ_ONCE(sk_listener->sk_max_ack_backlog))) {
		int young = reqsk_queue_len_young(queue) << 1;
		int young = reqsk_queue_len_young(queue) << 1;


		while (thresh > 2) {
		while (thresh > 2) {
+1 −1
Original line number Original line Diff line number Diff line
@@ -3226,7 +3226,7 @@ void tcp_get_info(struct sock *sk, struct tcp_info *info)
		 * tcpi_sacked  -> max backlog
		 * tcpi_sacked  -> max backlog
		 */
		 */
		info->tcpi_unacked = READ_ONCE(sk->sk_ack_backlog);
		info->tcpi_unacked = READ_ONCE(sk->sk_ack_backlog);
		info->tcpi_sacked = sk->sk_max_ack_backlog;
		info->tcpi_sacked = READ_ONCE(sk->sk_max_ack_backlog);
		return;
		return;
	}
	}


Loading