[8u60] RFR: 8078470: [Linux] Replace syscall use in os::fork_and_exec with glibc fork() and execve()

David Holmes david.holmes at oracle.com
Fri Apr 24 21:45:20 UTC 2015


Hi Thomas,

Thanks for looking at this.

Note to readers: Still need a (R)eviewer for this please.

On 24/04/2015 7:00 PM, Thomas Stüfe wrote:
> Hi David,
>
> Unfortunately printing out errno in VMError will not work so well, as it
> is not clear if it is from fork() or execve(), and it is vulnerable
> against future changes of os::fork_and_exec(). Also, will not do
> anything for you on Windows.

I thought about doing something inside fork_and_exec but decided against 
it for a couple of reasons:

1. Needs to be done for every platform individually.
2. Far from clear which mechanism would be appropriate given the 
different contexts in which it can be used - which is also why I did not 
do something for its use when debugging.

As for Windows ... not sure what it will do but I was following existing 
practice - see os_windows.cpp and perfMemory_windows.cpp.

> I do not see a nice solution. Returning errno will not work, or be ugly,
> because you'd need to return GetLastError for windows, which has a
> different semantic, and the caller must remember that.

And a return value, unless encoded, won't tell you which of fork and 
execve failed.

> On Solaris, os::fork_and_exec() prints a warning if PrintWarning() is
> on, which in my opinion does not help. That printout is very verbose and
> you have to remember setting it before starting the process.
>
> In some places in error handling (e.g. "check_dump_limits()") we return
> a string in a caller provided buffer describing the error which then is
> printed into the error logs. So, that may be a pragmatic solution,
> especially because we already have the scratch buffer in
> VMError::report_and_die().
>
> On the other hand, in almost any os::... function we just swallow error
> details, as we did in os::fork_and_exec() before, so maybe we just leave
> it at this.

I'll leave what I have now, pending further comments from anyone. It is 
better than nothing I think, and would have saved me a bit of time when 
I first encountered the problem with the missing syscall.

> Otherwise, change looks fine to me.

Thanks,
David

> ..Thomas
>
>
>
>
> On Fri, Apr 24, 2015 at 4:03 AM, David Holmes <david.holmes at oracle.com
> <mailto:david.holmes at oracle.com>> wrote:
>
>     Hi Thomas,
>
>     On 23/04/2015 6:00 PM, Thomas Stüfe wrote:
>
>         On Thu, Apr 23, 2015 at 9:50 AM, David Holmes
>         <david.holmes at oracle.com <mailto:david.holmes at oracle.com>
>         <mailto:david.holmes at oracle.com
>         <mailto:david.holmes at oracle.com>>> wrote:
>              On 23/04/2015 5:24 PM, Thomas Stüfe wrote:
>                  - would it be possible to use vfork() instead of
>         fork()? Might
>                  increase
>                  the chance of fork() succeeding in out-of-memory
>         scenarios. The way
>                  fork/execve is used here is simple enough for vfork().
>
>              I'm reluctant to use vfork() as it is an unknown. The use
>         of fork()
>              has been trialled by Google with no problem.
>
>         I understand.
>
>         We use vfork() by default on Linux and HP-UX since 3-4 years for
>         Runtime.exec() without problems (but our implementation differs
>         wildly
>         from the standard one). But then, Runtime.exec does not get
>         called in
>         error situations, so the conditions may be different for
>         os::fork_and_exec().
>
>
>     Right - os::fork_and_exec is potentially a lot more fragile given
>     the potential execution context. Which prompted me to add a second
>     test for the general OnError handling case. I also moved the tests
>     to runtime/ErrorHandling to match the directory that exists in JDK 9.
>
>     Updated webrev:
>
>     http://cr.openjdk.java.net/~dholmes/8078470/webrev.v2/
>
>     Thanks,
>     David
>
>
>                  - would it be possible to print out errno in case fork
>         fails?
>
>
>              Sure.
>
>
>         Thanks!
>
>         ..Thomas
>
>              Thanks,
>              David
>
>                  Regards, Thomas
>
>
>                  On Thu, Apr 23, 2015 at 8:40 AM, David Holmes
>                  <david.holmes at oracle.com
>         <mailto:david.holmes at oracle.com> <mailto:david.holmes at oracle.com
>         <mailto:david.holmes at oracle.com>>
>                  <mailto:david.holmes at oracle.com
>         <mailto:david.holmes at oracle.com>
>
>                  <mailto:david.holmes at oracle.com
>         <mailto:david.holmes at oracle.com>>>> wrote:
>
>                       webrev:
>         http://cr.openjdk.java.net/~dholmes/8078470/webrev/
>
>                       bug: https://bugs.openjdk.java.net/browse/JDK-8078470
>
>                       For historical reasons, dating back to LinuxThreads,
>                       os::fork_and_exec uses direct syscalls to perform
>         fork and
>                  execve
>                       functions. The fork syscall has been deprecated on
>         linux
>                  for quite
>                       some time and some distributions are now shipping with
>                  deprecated
>                       syscalls removed - this results in a ENOSYS error
>         and the
>                  "OnError"
>                       commands that utilize os::fork_and_exec no longer
>         work.
>
>                       The problem was discussed here:
>
>         http://mail.openjdk.java.net/pipermail/hotspot-dev/2015-April/017916.html
>
>                       It seems the concerns surrounding direct use of glibc
>                  fork() and
>                       exec() are no longer legitimate and Martin
>         Buchholz reports
>                  that
>                       Google replaced the syscalls with glibc calls some
>         time ago
>                  and have
>                       not had any problems. So we propose to apply the
>         same change
>                       uniformly on Linux.
>
>                       This is initially going into 8u60 via jdk8u-hs-dev
>         due to time
>                       constraints on the 8u60 schedule, and an internal
>         limitation
>                       preventing me from pushing this to 9 right now.
>         But it will be
>                       "backported" to 9 ASAP.
>
>                       Thanks,
>                       David
>
>
>
>


More information about the hotspot-dev mailing list