tcp: annotate data-race around tcp_md5sig_pool_populated
[ Upstream commit aacd467c0a576e5e44d2de4205855dc0fe43f6fb ] tcp_md5sig_pool_populated can be read while another thread changes its value. The race has no consequence because allocations are protected with tcp_md5sig_mutex. This patch adds READ_ONCE() and WRITE_ONCE() to document the race and silence KCSAN. Reported-by: Abhishek Shah <abhishek.shah@columbia.edu> Signed-off-by: Eric Dumazet <edumazet@google.com> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:

committed by
Greg Kroah-Hartman

parent
129ca0db95
commit
0958e487e8
@@ -4043,12 +4043,16 @@ static void __tcp_alloc_md5sig_pool(void)
|
|||||||
* to memory. See smp_rmb() in tcp_get_md5sig_pool()
|
* to memory. See smp_rmb() in tcp_get_md5sig_pool()
|
||||||
*/
|
*/
|
||||||
smp_wmb();
|
smp_wmb();
|
||||||
tcp_md5sig_pool_populated = true;
|
/* Paired with READ_ONCE() from tcp_alloc_md5sig_pool()
|
||||||
|
* and tcp_get_md5sig_pool().
|
||||||
|
*/
|
||||||
|
WRITE_ONCE(tcp_md5sig_pool_populated, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool tcp_alloc_md5sig_pool(void)
|
bool tcp_alloc_md5sig_pool(void)
|
||||||
{
|
{
|
||||||
if (unlikely(!tcp_md5sig_pool_populated)) {
|
/* Paired with WRITE_ONCE() from __tcp_alloc_md5sig_pool() */
|
||||||
|
if (unlikely(!READ_ONCE(tcp_md5sig_pool_populated))) {
|
||||||
mutex_lock(&tcp_md5sig_mutex);
|
mutex_lock(&tcp_md5sig_mutex);
|
||||||
|
|
||||||
if (!tcp_md5sig_pool_populated) {
|
if (!tcp_md5sig_pool_populated) {
|
||||||
@@ -4059,7 +4063,8 @@ bool tcp_alloc_md5sig_pool(void)
|
|||||||
|
|
||||||
mutex_unlock(&tcp_md5sig_mutex);
|
mutex_unlock(&tcp_md5sig_mutex);
|
||||||
}
|
}
|
||||||
return tcp_md5sig_pool_populated;
|
/* Paired with WRITE_ONCE() from __tcp_alloc_md5sig_pool() */
|
||||||
|
return READ_ONCE(tcp_md5sig_pool_populated);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(tcp_alloc_md5sig_pool);
|
EXPORT_SYMBOL(tcp_alloc_md5sig_pool);
|
||||||
|
|
||||||
@@ -4075,7 +4080,8 @@ struct tcp_md5sig_pool *tcp_get_md5sig_pool(void)
|
|||||||
{
|
{
|
||||||
local_bh_disable();
|
local_bh_disable();
|
||||||
|
|
||||||
if (tcp_md5sig_pool_populated) {
|
/* Paired with WRITE_ONCE() from __tcp_alloc_md5sig_pool() */
|
||||||
|
if (READ_ONCE(tcp_md5sig_pool_populated)) {
|
||||||
/* coupled with smp_wmb() in __tcp_alloc_md5sig_pool() */
|
/* coupled with smp_wmb() in __tcp_alloc_md5sig_pool() */
|
||||||
smp_rmb();
|
smp_rmb();
|
||||||
return this_cpu_ptr(&tcp_md5sig_pool);
|
return this_cpu_ptr(&tcp_md5sig_pool);
|
||||||
|
Reference in New Issue
Block a user