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

gh-126195: Use pthread_jit_write_protect_np on macOS #126196

Open
wants to merge 5 commits into
base: main
Choose a base branch
from

Conversation

diegorusso
Copy link
Contributor

@diegorusso diegorusso commented Oct 30, 2024

Replace mprotect with pthread_jit_write_protect_np on MacOS Apple Silicon.
Improve JIT performance by ~1.4% on this platform.

Replace mprotect with pthread_jit_write_protect_np
on MacOS Apple Silicon.
Improve JIT performance by ~1.4% on this platform.
@mdboom
Copy link
Contributor

mdboom commented Oct 30, 2024

We should probably do one last benchmarking run on macOS for this PR. Unfortunately our Mac benchmark machine is offline at the moment -- I'm waiting for someone to physically go and see what's up. Hopefully less than a couple days or so.

@brandtbucher brandtbucher self-assigned this Oct 30, 2024
@brandtbucher brandtbucher added performance Performance or resource usage skip news interpreter-core (Objects, Python, Grammar, and Parser dirs) 3.14 new features, bugs and security fixes topic-JIT and removed skip news labels Oct 30, 2024
@Fidget-Spinner
Copy link
Member

JIT tests are failing and I have a partial fix at #126166 (comment). But it doesn't work on Windows because I'm not sure how to detect the JIT is running on there.

@mdboom
Copy link
Contributor

mdboom commented Oct 31, 2024

We should probably do one last benchmarking run on macOS for this PR. Unfortunately our Mac benchmark machine is offline at the moment -- I'm waiting for someone to physically go and see what's up. Hopefully less than a couple days or so.

The machine is back up and I'm running the benchmarks now.

@mdboom
Copy link
Contributor

mdboom commented Oct 31, 2024

We should probably do one last benchmarking run on macOS for this PR. Unfortunately our Mac benchmark machine is offline at the moment -- I'm waiting for someone to physically go and see what's up. Hopefully less than a couple days or so.

The machine is back up and I'm running the benchmarks now.

I think the benchmarks are hitting the tests being broken on main -- failing in the test_embed module when building for PGO. We'll probably need to wait for that and then merge that here and re-run the benchmarks.

@Eclips4
Copy link
Member

Eclips4 commented Nov 2, 2024

Merging main to get rid of failures in test_embed
(failures on aarch64macos runners as you might know are expected thing 🙂 )

@diegorusso
Copy link
Contributor Author

I've updated the branch to check if errors disappeared...

@brandtbucher
Copy link
Member

When looking this up, it seems that the documented way to do this now is the pthread_jit_write_with_callback_np API, which is a bit trickier to retrofit onto our JIT. It looks like pthread_jit_write_protect_np probably still works, but it's not well documented anymore and it seems like the new API might work in more places: https://developer.apple.com/documentation/apple-silicon/porting-just-in-time-compilers-to-apple-silicon

Probably makes sense to land this now, then explore the other API after.

Copy link
Member

@brandtbucher brandtbucher left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One issue with an error path, and a couple of suggestions.

@@ -56,9 +56,16 @@ jit_alloc(size_t size)
int flags = MEM_COMMIT | MEM_RESERVE;
unsigned char *memory = VirtualAlloc(NULL, size, flags, PAGE_READWRITE);
int failed = memory == NULL;
#elif defined(__APPLE__) && defined(__aarch64__)
Copy link
Member

@brandtbucher brandtbucher Nov 7, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does this work? If so, it seems a bit less fragile.

Suggested change
#elif defined(__APPLE__) && defined(__aarch64__)
#elif defined(MAP_JIT)

I'd also like to reduce the duplication of code here. So maybe we can just add the flags in this case and use the same code path as before:

#ifdef MAP_JIT
    flags |= MAP_JIT;
    prot |= PROT_EXEC;
#endif

int prot = PROT_READ | PROT_WRITE | PROT_EXEC;
unsigned char *memory = mmap(NULL, size, prot, flags, -1, 0);
int failed = memory == MAP_FAILED;
pthread_jit_write_protect_np(0);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This will leave the memory protection off for the entire thread if mapping the memory fails.

Even though pthread_jit_write_protect_np(0) is logically part of jit_alloc, and pthread_jit_write_protect_np(1) is logically part of mark_executable, I feel like it will be less error-prone and easier to reason about error paths if we make these calls in _PyJIT_Compile instead. It might also make porting to the new callback API easier, since the callback will just be all of the code between the two pthread_jit_write_protect_np calls.

What do you think?

@bedevere-app
Copy link

bedevere-app bot commented Nov 7, 2024

A Python core developer has requested some changes be made to your pull request before we can consider merging it. If you could please address their requests along with any other requests in other reviews from core developers that would be appreciated.

Once you have made the requested changes, please leave a comment on this pull request containing the phrase I have made the requested changes; please review again. I will then notify any core developers who have left a review that you're ready for them to take another look at this pull request.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
3.14 new features, bugs and security fixes awaiting changes interpreter-core (Objects, Python, Grammar, and Parser dirs) performance Performance or resource usage topic-JIT
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants