RFR: 8327990: [macosx-aarch64] Various tests fail with -XX:+AssertWXAtThreadSync [v3]
Thomas Stuefe
stuefe at openjdk.org
Tue Mar 19 15:20:23 UTC 2024
On Tue, 19 Mar 2024 12:17:22 GMT, David Holmes <dholmes at openjdk.org> wrote:
>> Instead, could we tag code that needs one or the other, keep track of the current WX state in thread-local memory, and flip WX only when we know we need to?
The first part we already do.
I wonder wheter we could - at least as workaround for if we missed a spot - do wx switching as a reaction to a SIBBUS related to WX violation in code cache. Switch state around, return from signal handler and retry operation.
(Edit: tested it, does not seem to work. I guess when the SIGBUS is triggered in the kernel thread WX state had already been processed somehow).
> > That's very odd. The example there doesn't even involve MAP_JIT memory, so what does it have to do with WX?
>
> @theRealAph that is the mystery we hope will be resolved once we know the nature of the underlying OS bug. Somehow switching to exec mode fixes/works-around the issue. I can imagine a missing conditional to check if the region is MAP_JIT.
>
> > Changing WX at VM state transitions is a form of temporal coupling, a classic design smell that has caused problems for decades.
>
> The original introducers of WXEnable made the decision that the VM should be in WRITE mode unless it needs EXEC. That is the state we are presently trying to achieve with this change. If that original design choice is wrong then ...
>
> > Instead, could we tag code that needs one or the other, keep track of the current WX state in thread-local memory, and flip WX only when we know we need to?
>
> And I've asked about this every time a missing WXEnable has had to be added. We seem to be generically able to describe what kind of code needs which mode, but we seem to struggle to pin it down. Though that is what https://bugs.openjdk.org/browse/JDK-8307817 is looking at doing.
>
> > That'd (by definition) reduce the number of transitions to the minimum if we were through.
>
> Not necessarily. It may well remove some transitions from paths that don't need it, but if you move the state change too low down the call chain you could end up transitioning much more often in code that does need it e.g. if a transitioning method is called in a loop.
Not if you do the switching lazily. The first iteration would switch to the needed state; subsequent iterations would not do anything since the state already matches. Unless you interleave writes and execs, but then you would need the state changes anyway.
-------------
PR Comment: https://git.openjdk.org/jdk/pull/18238#issuecomment-2007469410
More information about the hotspot-jfr-dev
mailing list