RFR (s) 8251383: Disable Event::log from linux_mprotect when processing the assertion poison page
David Holmes
david.holmes at oracle.com
Tue Aug 11 09:17:31 UTC 2020
Bug: https://bugs.openjdk.java.net/browse/JDK-8251383
webrev: http://cr.openjdk.java.net/~dholmes/8251383/webrev/
When the assertion poison page is enabled (Linux only and on by default)
the signal handler will call os::protect_memory to change the page
protection bits. That will call linux_mprotect which will call
Events::log(NULL, "Protecting memory [" INTPTR_FORMAT "," INTPTR_FORMAT
"] with protection modes %x", p2i(bottom), p2i(bottom+size), prot);
Event logging in turn can use Mutexes and other VM facilities - all of
which are now being executed in a signal handling context (which is
inherently unsafe). It also means that there cannot be any other failing
assertions on that path as you will re-trigger the poison page pagefault
and abort with no hs_err file. Hence, as happened to me, a failing
assertion in the mutex code triggers this problem.
The issue can be worked-around by setting -XX:-ShowRegistersOnAssert
(once you realise what is happening).
The simple fix is to skip the logging if the faulting address is the
poison page address.
This only affects debug builds of course.
Testing:
- runtime/ErrorHandling
- tier 1-3
Thanks,
David
More information about the hotspot-runtime-dev
mailing list