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