diff options
author | Eric Dumazet <edumazet@google.com> | 2019-10-09 14:51:20 -0700 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2020-01-27 14:51:18 +0100 |
commit | b0fb910bfdf469fa5016e939c778cfb566be2e33 (patch) | |
tree | 6d5e14ac2601d8a8c875d7a6b399a8fc7d4ef716 /include | |
parent | 910699a81fe572b41cc23b46b0616ce7878f5237 (diff) | |
download | linux-stable-b0fb910bfdf469fa5016e939c778cfb566be2e33.tar.gz linux-stable-b0fb910bfdf469fa5016e939c778cfb566be2e33.tar.bz2 linux-stable-b0fb910bfdf469fa5016e939c778cfb566be2e33.zip |
net: add {READ|WRITE}_ONCE() annotations on ->rskq_accept_head
[ Upstream commit 60b173ca3d1cd1782bd0096dc17298ec242f6fb1 ]
reqsk_queue_empty() is called from inet_csk_listen_poll() while
other cpus might write ->rskq_accept_head value.
Use {READ|WRITE}_ONCE() to avoid compiler tricks
and potential KCSAN splats.
Fixes: fff1f3001cc5 ("tcp: add a spinlock to protect struct request_sock_queue")
Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
Diffstat (limited to 'include')
-rw-r--r-- | include/net/request_sock.h | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/include/net/request_sock.h b/include/net/request_sock.h index 347015515a7d..1653435f18f5 100644 --- a/include/net/request_sock.h +++ b/include/net/request_sock.h @@ -183,7 +183,7 @@ void reqsk_fastopen_remove(struct sock *sk, struct request_sock *req, static inline bool reqsk_queue_empty(const struct request_sock_queue *queue) { - return queue->rskq_accept_head == NULL; + return READ_ONCE(queue->rskq_accept_head) == NULL; } static inline struct request_sock *reqsk_queue_remove(struct request_sock_queue *queue, @@ -195,7 +195,7 @@ static inline struct request_sock *reqsk_queue_remove(struct request_sock_queue req = queue->rskq_accept_head; if (req) { sk_acceptq_removed(parent); - queue->rskq_accept_head = req->dl_next; + WRITE_ONCE(queue->rskq_accept_head, req->dl_next); if (queue->rskq_accept_head == NULL) queue->rskq_accept_tail = NULL; } |