gh-148613: Fix race in gc_set_threshold and gc_get_threshold#150356
Open
LindaSummer wants to merge 4 commits into
Open
gh-148613: Fix race in gc_set_threshold and gc_get_threshold#150356LindaSummer wants to merge 4 commits into
gc_set_threshold and gc_get_threshold#150356LindaSummer wants to merge 4 commits into
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Issue
gh-148613
Root Cause
In free-threading, the
gc_generation.thresholdraces in threads when one thread has objects triggered the GC.cpython/Python/gc_free_threading.c
Lines 2025 to 2031 in cb72193
Inside
gc_should_collectwe read thegcstate->young.thresholdandgcstate->old[0].thresholdwithout thread syncing.cpython/Python/gc_free_threading.c
Lines 1996 to 2004 in cb72193
At the same time, the
thresholdsetting also has no syncing protection.cpython/Modules/gcmodule.c
Lines 170 to 175 in cb72193
This explains why a cyclic referenced object caused this TSAN report.
The cyclic object couldn't make ref count to zero in scoped call stack, and it increments the
_gc_thread_state.alloc_counttoLOCAL_ALLOC_COUNT_THRESHOLD.Then the GC collect triggered in this thread and races with another thread's update of
gc_generation.threshold.Proposed Changes
Add relaxed atomic load/store protection for the
gc_generation.thresholdsetter and getter.