python / python/cpython

Make perf_trampoline thread safe.

Open
#152,330 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

interpreter-core topic-free-threading type-feature
Dominant language
Python
Stars
77.2k
Forks
35.9k
PR merge metrics
PR metrics pending

Description

Bug report

Bug description:

We are using an internal profiler that relies on perf_trampoline to associate Python frames with native samples. The current implementation is incompatible with free-threading, leading to data races and crashes when we enabled Tsan and used the profiler in highly concurrent environments. This proposal aims to bridge that gap and enable profiler support for free-threading builds by fixing data races, deadlocks, and memory lifecycle edge cases in perf_trampoline.c.

ThreadSanitizer (TSan) Data Race Report

The following data race was captured during concurrent execution under Free Threading and Tsan. Note that the following stack trace has been sanitized to remove internal organization details and the critical data race in perf_trampoline.c should remain represented:

==================
WARNING: ThreadSanitizer: data race (pid=6355)
  Read of size 8 at 0x720c009e2428 by thread T2:
    #0 compile_trampoline Python/perf_trampoline.c:413:27
    #1 py_trampoline_evaluator Python/perf_trampoline.c:437:40
    #2 _PyEval_EvalFrame Include/internal/pycore_ceval.h:122:12
    #3 _PyEval_Vector Python/ceval.c:2094:12
    #4 _PyFunction_Vectorcall Objects/call.c:380:12
    ... [generic interpreter evaluation frames] ...
    #10 thread_run Modules/_threadmodule.c:359:21
    #11 pythread_wrapper Python/thread_pthread.h:242:5

  Previous write of size 8 at 0x720c009e2428 by main thread:
    #0 code_arena_new_code Python/perf_trampoline.c:403:27
    #1 compile_trampoline Python/perf_trampoline.c:419:12
    #2 py_trampoline_evaluator Python/perf_trampoline.c:437:40
    #3 _PyEval_EvalFrame Include/internal/pycore_ceval.h:122:12
    #4 _PyEval_Vector Python/ceval.c:2094:12
    ... [generic interpreter evaluation frames] ...
    #15 _PyEval_EvalFrameDefault Python/generated_cases.c.h:1622:35
==================

I have searched the existing issues for similar reports but was unable to find any duplicates. Please let me know if this has already been reported!

CPython versions tested on:

3.14

Operating systems tested on:

Linux

Linked PRs
  • gh-152331

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with Python/perf_trampoline.c and the reported TSan stack traces around compile_trampoline and code_arena_new_code. Review the linked PR gh-152331 and the existing free-threading behavior before making changes. Done means perf_trampoline supports the reported concurrent profiler scenario without the reported races, deadlocks, or lifecycle failures.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
backend, devtools
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.