Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

critical section should avoid parking lot when re-entering top-most held critical section #114203

Open
Tracked by #108219
DinoV opened this issue Jan 17, 2024 · 1 comment
Labels
topic-free-threading type-feature A feature request or enhancement

Comments

@DinoV
Copy link
Contributor

DinoV commented Jan 17, 2024

Feature or enhancement

Proposal:

--disable-gil builds use critical sections more and more. In some cases a critcal section is held and will be re-entered immediately by the calling thread and this can be hard to avoid (e.g when we're going from C code to Python code back into related C code). Some examples of this are flushing I/O and calculating the MRO on a metaclass.

When this happens we treat this as re-entrancy to the critical section, and send it off to the parking lot to be released and then re-acquired. This can greatly slow down something which should just simply re-acquire the lock.

It's not super straight forward as we still need to support detaching and resuming the critical section in other cases of contention correctly for the lock.

As part of this it'd be good to also have the ability to collect stats on how often this is happening as we do want to generally avoid it and prefer lock-free paths where possible.

Has this already been discussed elsewhere?

No response given

Links to previous discussion of this feature:

No response

Linked PRs

@DinoV DinoV added the type-feature A feature request or enhancement label Jan 17, 2024
Yhg1s added a commit that referenced this issue Dec 23, 2024
Add a fast path to (single-mutex) critical section locking _iff_ the mutex
is already held by the currently active, top-most critical section of this
thread. This can matter a lot for indirectly recursive critical sections
without intervening critical sections.
@Yhg1s
Copy link
Member

Yhg1s commented Dec 23, 2024

The optimisation is in, but without tracking or statistics on how often it happens. (The solution was more straight-forward than anticipated because we can simple skip entering the critical section altogether, leaving the original one in place.) Avoiding the recursion wasn't easily possible in the cases I looked at (e.g. a functools.lru_cache object wrapping methods, which means the cache is accessed per class), so I'm not sure tracking this specific situation is particularly useful, and would probably fall in the general "detect contention" bucket of problems.

(Leaving this issue open for Dino to decide if we need to do more here.)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
topic-free-threading type-feature A feature request or enhancement
Projects
None yet
Development

No branches or pull requests

3 participants