]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-117657: Quiet erroneous TSAN reports of data races in `_PySeqLock` (#117955)
authormpage <mpage@meta.com>
Wed, 17 Apr 2024 17:19:28 +0000 (10:19 -0700)
committerGitHub <noreply@github.com>
Wed, 17 Apr 2024 17:19:28 +0000 (17:19 +0000)
Quiet erroneous TSAN reports of data races in `_PySeqLock`

TSAN reports a couple of data races between the compare/exchange in
`_PySeqLock_LockWrite` and the non-atomic loads in `_PySeqLock_{Abandon,Unlock}Write`.
This is another instance of TSAN incorrectly modeling failed compare/exchange
as a write instead of a load.

Python/lock.c
Tools/tsan/suppressions_free_threading.txt

index 7d1ead585dee6ce998b22d9e5d003e1378d842ba..91c66df8fd909353b982317f2430f64a901beee5 100644 (file)
@@ -472,7 +472,7 @@ _PyRWMutex_Unlock(_PyRWMutex *rwmutex)
 
 void _PySeqLock_LockWrite(_PySeqLock *seqlock)
 {
-    // lock the entry by setting by moving to an odd sequence number
+    // lock by moving to an odd sequence number
     uint32_t prev = _Py_atomic_load_uint32_relaxed(&seqlock->sequence);
     while (1) {
         if (SEQLOCK_IS_UPDATING(prev)) {
@@ -492,14 +492,14 @@ void _PySeqLock_LockWrite(_PySeqLock *seqlock)
 
 void _PySeqLock_AbandonWrite(_PySeqLock *seqlock)
 {
-    uint32_t new_seq = seqlock->sequence - 1;
+    uint32_t new_seq = _Py_atomic_load_uint32_relaxed(&seqlock->sequence) - 1;
     assert(!SEQLOCK_IS_UPDATING(new_seq));
     _Py_atomic_store_uint32(&seqlock->sequence, new_seq);
 }
 
 void _PySeqLock_UnlockWrite(_PySeqLock *seqlock)
 {
-    uint32_t new_seq = seqlock->sequence + 1;
+    uint32_t new_seq = _Py_atomic_load_uint32_relaxed(&seqlock->sequence) + 1;
     assert(!SEQLOCK_IS_UPDATING(new_seq));
     _Py_atomic_store_uint32(&seqlock->sequence, new_seq);
 }
index 6e2bdc1ea85cd6cbf5867b52b35eac41b5feebf1..80191d6c2484e6f5d6de79c73ab7fd503a36c061 100644 (file)
@@ -26,7 +26,6 @@ race:_PyObject_GC_IS_SHARED
 race:_PyObject_GC_SET_SHARED
 race:_PyObject_GC_TRACK
 race:_PyType_HasFeature
-race:_PyType_Lookup
 race:assign_version_tag
 race:compare_unicode_unicode
 race:delitem_common
@@ -47,4 +46,3 @@ race:set_inheritable
 race:start_the_world
 race:tstate_set_detached
 race:unicode_hash
-race:update_cache_gil_disabled