From: Sam Gross Date: Mon, 7 Apr 2025 18:13:02 +0000 (-0400) Subject: [3.13] gh-131988: Fix a multithreaded scaling regression (#131989) X-Git-Tag: v3.13.3~16 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=1fcf409acef8a7a039353cf11a0bbb24ca6722f8;p=thirdparty%2FPython%2Fcpython.git [3.13] gh-131988: Fix a multithreaded scaling regression (#131989) gh-131988: Fix a multithreaded scaling regression The 3.13 free threaded build immortalizes certain objects to avoid reference count contention. In gh-127114 the condition was unintentionally changed to happen when the first thread was created instead of the first non-main thread. The `interp->gc.immortalize` field is then cleared again during `_PyGC_Init()`. Change the condition so that we check if we should immortalize objects using deferred reference counting whenever a non-main thread is created. --- diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-04-01-19-25-05.gh-issue-131988.sbYLEs.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-04-01-19-25-05.gh-issue-131988.sbYLEs.rst new file mode 100644 index 000000000000..44f71238739a --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-04-01-19-25-05.gh-issue-131988.sbYLEs.rst @@ -0,0 +1,2 @@ +Fix a performance regression that caused scaling bottlenecks in the free +threaded build in 3.13.1 and 3.13.2. diff --git a/Python/pystate.c b/Python/pystate.c index 900cba0de15a..5222a7ec1405 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -1587,10 +1587,10 @@ new_threadstate(PyInterpreterState *interp, int whence) HEAD_UNLOCK(interp->runtime); #ifdef Py_GIL_DISABLED - if (id == 1) { + if (id > 1) { if (_Py_atomic_load_int(&interp->gc.immortalize) == 0) { // Immortalize objects marked as using deferred reference counting - // the first time a non-main thread is created. + // once a non-main thread is created, if we haven't already done so. _PyGC_ImmortalizeDeferredObjects(interp); } }