RFR: JDK-8260485: Simplify and unify handler vectors in Posix signal code [v4]

Thomas Stuefe stuefe at openjdk.java.net
Fri Feb 5 11:00:44 UTC 2021


On Fri, 5 Feb 2021 06:38:58 GMT, Thomas Stuefe <stuefe at openjdk.org> wrote:

>> Looks good. Thanks for the updates.
>> 
>> One query for further improvement below. :)
>> 
>> Thanks,
>> David
>
>> Looks good. Thanks for the updates.
>> 
>> One query for further improvement below. :)
>> 
>> Thanks,
>> David
> 
> Thanks for approval, David. Unfortunately I still have a strange build problem on one of our s390 boxes, so this is not done yet.

Hi David,

sorry, its not yet done.

Changes in this version:

1) I found that on zlinux, sigaction.sa_flags is actually a long unsigned int. Which surprised me since this is clearly not posix compatible. Therefore I rewrote the code, adding a new function `get_sanitized_sa_flags`, which hides the correct casting and also contains the stripping away of unwanted flags set by the kernel (SA_RESTORER). As a side effect this cleanly factors out the SA_RESTORER handling which is nice.

2) You requested that `print_single_signal_handler` should print the flag difference when spotting a change. I agree and expanded on this: now  `print_single_signal_handler` will print out the full expected handler information if it spots a difference (see below for examples). This contains more information that just the flags, and is actually less code.

3) Then I found that further code could be folded: We have a detailed printout for Xcheck:jni in `check_signal_handler`, but then we also print all signal handlers as part of that printout, which now (2) contains a verbose description of the found differences. Therefore the detailed printout in `check_signal_handler` was not needed anymore and could be removed. That also allows me to factor out the "compare sigaction structures semantically" logic into one function, called `compare_handler_info`. That again safes some code.

Now the logic is like this:

- If Xcheck:jni is not set, we still store the expected signal handler info. When printing signal handlers, e.g. as part of a hs_err file, in `os::print_signal_handlers`, we print a description of any changed handlers to nudge the supporter into the right direction.

- If Xcheck:jni is active, we will do our periodic checks; upon finding a difference, we do not elaborate but call `os::print_signal_handlers()` which will elaborate for us.

The final adjustment I had to make was to separate the "expected handler" info from the "check when Xcheck:jni is active" logic. That is because when Xcheck:jni is active and we find a mismatch, we want to disable checking for that signal in `check_signal_handler` but still see the difference in future printouts when calling `os::print_signal_handlers`, e.g. if later we crash and write a hs-err file.

I am really sorry for the added review work, but I think its a worthwhile change and complexity gets further reduced.

I thought about adding tests but testing this is quite difficult. So I tested manually by overwriting some of the hotspot signal handlers and check how the VM reacts.

First a hs-err file, good case:

659 Signal Handlers:
660    SIGSEGV: crash_handler in libjvm.so, mask=11100100010111111101111111111110, flags=SA_RESTART|SA_SIGINFO
661     SIGBUS: crash_handler in libjvm.so, mask=11100100010111111101111111111110, flags=SA_RESTART|SA_SIGINFO
662     SIGFPE: crash_handler in libjvm.so, mask=11100100010111111101111111111110, flags=SA_RESTART|SA_SIGINFO
663    SIGPIPE: javaSignalHandler in libjvm.so, mask=11100100010111111101111111111110, flags=SA_RESTART|SA_SIGINFO
664    SIGXFSZ: javaSignalHandler in libjvm.so, mask=11100100010111111101111111111110, flags=SA_RESTART|SA_SIGINFO
665     SIGILL: crash_handler in libjvm.so, mask=11100100010111111101111111111110, flags=SA_RESTART|SA_SIGINFO
666    SIGUSR2: SR_handler in libjvm.so, mask=00000000000000000000000000000000, flags=SA_RESTART|SA_SIGINFO
667     SIGHUP: UserHandler in libjvm.so, mask=11100100010111111101111111111110, flags=SA_RESTART|SA_SIGINFO
668     SIGINT: UserHandler in libjvm.so, mask=11100100010111111101111111111110, flags=SA_RESTART|SA_SIGINFO
669    SIGTERM: UserHandler in libjvm.so, mask=11100100010111111101111111111110, flags=SA_RESTART|SA_SIGINFO
670    SIGQUIT: UserHandler in libjvm.so, mask=11100100010111111101111111111110, flags=SA_RESTART|SA_SIGINFO
671    SIGTRAP: crash_handler in libjvm.so, mask=11100100010111111101111111111110, flags=SA_RESTART|SA_SIGINFO

Bad cases (I changed handlers for SIGFPE, SIGPIPE, SIGXFSZ and SIGUSR2):

hs-err file:

658 Signal Handlers:
659    SIGSEGV: crash_handler in libjvm.so, mask=11100100010111111101111111111110, flags=SA_RESTART|SA_SIGINFO
660     SIGBUS: crash_handler in libjvm.so, mask=11100100010111111101111111111110, flags=SA_RESTART|SA_SIGINFO
661     SIGFPE: badwolf in libjvm.so, mask=10000000000000000000000000000000, flags=none
662   *** Handler was modified!
663   *** Expected: javaSignalHandler in libjvm.so, mask=11100100110111111111111111111110, flags=SA_RESTART|SA_SIGINFO
664    SIGPIPE: badwolf in libjvm.so, mask=10000000000000000000000000000000, flags=none
665   *** Handler was modified!
666   *** Expected: javaSignalHandler in libjvm.so, mask=11100100110111111111111111111110, flags=SA_RESTART|SA_SIGINFO
667    SIGXFSZ: badwolf in libjvm.so, mask=10000000000000000000000000000000, flags=none
668   *** Handler was modified!
669   *** Expected: javaSignalHandler in libjvm.so, mask=11100100110111111111111111111110, flags=SA_RESTART|SA_SIGINFO
670     SIGILL: crash_handler in libjvm.so, mask=11100100010111111101111111111110, flags=SA_RESTART|SA_SIGINFO
671    SIGUSR2: badwolf in libjvm.so, mask=10000000000000000000000000000000, flags=none
672   *** Handler was modified!
673   *** Expected: SR_handler in libjvm.so, mask=00000000000000000000000000000000, flags=SA_RESTART|SA_SIGINFO
674     SIGHUP: UserHandler in libjvm.so, mask=11100100010111111101111111111110, flags=SA_RESTART|SA_SIGINFO
675     SIGINT: UserHandler in libjvm.so, mask=11100100010111111101111111111110, flags=SA_RESTART|SA_SIGINFO
676    SIGTERM: UserHandler in libjvm.so, mask=11100100010111111101111111111110, flags=SA_RESTART|SA_SIGINFO
677    SIGQUIT: UserHandler in libjvm.so, mask=11100100010111111101111111111110, flags=SA_RESTART|SA_SIGINFO
678    SIGTRAP: crash_handler in libjvm.so, mask=11100100010111111101111111111110, flags=SA_RESTART|SA_SIGINFO

jcmd VM.info:

...
Signal Handlers:
   SIGSEGV: javaSignalHandler in libjvm.so, mask=11100100010111111101111111111110, flags=SA_RESTART|SA_SIGINFO
    SIGBUS: javaSignalHandler in libjvm.so, mask=11100100010111111101111111111110, flags=SA_RESTART|SA_SIGINFO
    SIGFPE: badwolf in libjvm.so, mask=00000111001010000101001100010001, flags=none
  *** Handler was modified!
  *** Expected: javaSignalHandler in libjvm.so, mask=11100100110111111111111111111110, flags=SA_RESTART|SA_SIGINFO
   SIGPIPE: badwolf in libjvm.so, mask=00000111001010000101001100010001, flags=none
  *** Handler was modified!
  *** Expected: javaSignalHandler in libjvm.so, mask=11100100110111111111111111111110, flags=SA_RESTART|SA_SIGINFO
   SIGXFSZ: badwolf in libjvm.so, mask=00000111001010000101001100010001, flags=none
  *** Handler was modified!
  *** Expected: javaSignalHandler in libjvm.so, mask=11100100110111111111111111111110, flags=SA_RESTART|SA_SIGINFO
    SIGILL: javaSignalHandler in libjvm.so, mask=11100100010111111101111111111110, flags=SA_RESTART|SA_SIGINFO
   SIGUSR2: badwolf in libjvm.so, mask=00000111001010000101001100010001, flags=none
  *** Handler was modified!
  *** Expected: SR_handler in libjvm.so, mask=00000000000000000000000000000000, flags=SA_RESTART|SA_SIGINFO
    SIGHUP: UserHandler in libjvm.so, mask=11100100010111111101111111111110, flags=SA_RESTART|SA_SIGINFO
    SIGINT: UserHandler in libjvm.so, mask=11100100010111111101111111111110, flags=SA_RESTART|SA_SIGINFO
   SIGTERM: UserHandler in libjvm.so, mask=11100100010111111101111111111110, flags=SA_RESTART|SA_SIGINFO
   SIGQUIT: UserHandler in libjvm.so, mask=11100100010111111101111111111110, flags=SA_RESTART|SA_SIGINFO
   SIGTRAP: SIG_DFL, mask=00000000000000000000000000000000, flags=none


-Xcheck:jni output:

Warning: SIGFPE handler modified!                                                                                                                                                                                                                                                    
Signal Handlers:
   SIGSEGV: javaSignalHandler in libjvm.so, mask=11100100010111111101111111111110, flags=SA_RESTART|SA_SIGINFO
    SIGBUS: javaSignalHandler in libjvm.so, mask=11100100010111111101111111111110, flags=SA_RESTART|SA_SIGINFO
    SIGFPE: badwolf in libjvm.so, mask=11100100010111111101111111111110, flags=none
  *** Handler was modified!
  *** Expected: javaSignalHandler in libjvm.so, mask=11100100110111111111111111111110, flags=SA_RESTART|SA_SIGINFO
   SIGPIPE: badwolf in libjvm.so, mask=11100100010111111101111111111110, flags=none
  *** Handler was modified!
  *** Expected: javaSignalHandler in libjvm.so, mask=11100100110111111111111111111110, flags=SA_RESTART|SA_SIGINFO
   SIGXFSZ: badwolf in libjvm.so, mask=11100100010111111101111111111110, flags=none
  *** Handler was modified!
  *** Expected: javaSignalHandler in libjvm.so, mask=11100100110111111111111111111110, flags=SA_RESTART|SA_SIGINFO
    SIGILL: javaSignalHandler in libjvm.so, mask=11100100010111111101111111111110, flags=SA_RESTART|SA_SIGINFO
   SIGUSR2: badwolf in libjvm.so, mask=11100100010111111101111111111110, flags=none
  *** Handler was modified!
  *** Expected: SR_handler in libjvm.so, mask=00000000000000000000000000000000, flags=SA_RESTART|SA_SIGINFO
    SIGHUP: UserHandler in libjvm.so, mask=11100100010111111101111111111110, flags=SA_RESTART|SA_SIGINFO
    SIGINT: UserHandler in libjvm.so, mask=11100100010111111101111111111110, flags=SA_RESTART|SA_SIGINFO
   SIGTERM: UserHandler in libjvm.so, mask=11100100010111111101111111111110, flags=SA_RESTART|SA_SIGINFO
   SIGQUIT: UserHandler in libjvm.so, mask=11100100010111111101111111111110, flags=SA_RESTART|SA_SIGINFO
   SIGTRAP: SIG_DFL, mask=00000000000000000000000000000000, flags=none
Consider using jsig library.
...
Thanks, Thomas

-------------

PR: https://git.openjdk.java.net/jdk/pull/2251


More information about the hotspot-dev mailing list