Mercurial > hg > icedtea7-forest > hotspot
changeset 6274:f822db0610e4
8058113: Execution of OnOutOfMemoryError command hangs on linux-sparc
Summary: JDK7u specific fix to add Linux-SPARC fork_and_exec() function; JDK8u and JDK9 version will be different.
Reviewed-by: dcubed, dlong, dholmes, rdurbin
author | gthornbr |
---|---|
date | Wed, 04 Feb 2015 08:28:58 -0800 |
parents | fa53911cba48 |
children | 48af02f3c56c |
files | make/jprt.properties src/os/linux/vm/os_linux.cpp |
diffstat | 2 files changed, 87 insertions(+), 25 deletions(-) [+] |
line wrap: on
line diff
--- a/make/jprt.properties Thu Feb 05 09:27:52 2015 -0800 +++ b/make/jprt.properties Wed Feb 04 08:28:58 2015 -0800 @@ -38,7 +38,7 @@ # This tells jprt what default release we want to build -jprt.hotspot.default.release=jdk7u60 +jprt.hotspot.default.release=jdk7u72 jprt.tools.default.release=${jprt.submit.option.release?${jprt.submit.option.release}:${jprt.hotspot.default.release}} @@ -54,92 +54,94 @@ # Define the Solaris platforms we want for the various releases jprt.my.solaris.sparc.jdk8=solaris_sparc_5.10 jprt.my.solaris.sparc.jdk7=solaris_sparc_5.10 -jprt.my.solaris.sparc.jdk7u60=${jprt.my.solaris.sparc.jdk7} +jprt.my.solaris.sparc.jdk7u72=${jprt.my.solaris.sparc.jdk7} jprt.my.solaris.sparc=${jprt.my.solaris.sparc.${jprt.tools.default.release}} jprt.my.solaris.sparcv9.jdk8=solaris_sparcv9_5.10 jprt.my.solaris.sparcv9.jdk7=solaris_sparcv9_5.10 -jprt.my.solaris.sparcv9.jdk7u60=${jprt.my.solaris.sparcv9.jdk7} +jprt.my.solaris.sparcv9.jdk7u72=${jprt.my.solaris.sparcv9.jdk7} jprt.my.solaris.sparcv9=${jprt.my.solaris.sparcv9.${jprt.tools.default.release}} jprt.my.solaris.i586.jdk8=solaris_i586_5.10 jprt.my.solaris.i586.jdk7=solaris_i586_5.10 -jprt.my.solaris.i586.jdk7u60=${jprt.my.solaris.i586.jdk7} +jprt.my.solaris.i586.jdk7u72=${jprt.my.solaris.i586.jdk7} jprt.my.solaris.i586=${jprt.my.solaris.i586.${jprt.tools.default.release}} jprt.my.solaris.x64.jdk8=solaris_x64_5.10 jprt.my.solaris.x64.jdk7=solaris_x64_5.10 -jprt.my.solaris.x64.jdk7u60=${jprt.my.solaris.x64.jdk7} +jprt.my.solaris.x64.jdk7u72=${jprt.my.solaris.x64.jdk7} jprt.my.solaris.x64=${jprt.my.solaris.x64.${jprt.tools.default.release}} jprt.my.linux.i586.jdk8=linux_i586_2.6 jprt.my.linux.i586.jdk7=linux_i586_2.6 -jprt.my.linux.i586.jdk7u60=${jprt.my.linux.i586.jdk7} +jprt.my.linux.i586.jdk7u72=${jprt.my.linux.i586.jdk7} jprt.my.linux.i586=${jprt.my.linux.i586.${jprt.tools.default.release}} jprt.my.linux.x64.jdk8=linux_x64_2.6 jprt.my.linux.x64.jdk7=linux_x64_2.6 -jprt.my.linux.x64.jdk7u60=${jprt.my.linux.x64.jdk7} +jprt.my.linux.x64.jdk7u72=${jprt.my.linux.x64.jdk7} jprt.my.linux.x64=${jprt.my.linux.x64.${jprt.tools.default.release}} jprt.my.linux.ppc.jdk8=linux_ppc_2.6 jprt.my.linux.ppc.jdk7=linux_ppc_2.6 -jprt.my.linux.ppc.jdk7u60=${jprt.my.linux.ppc.jdk7} +jprt.my.linux.ppc.jdk7u72=${jprt.my.linux.ppc.jdk7} jprt.my.linux.ppc=${jprt.my.linux.ppc.${jprt.tools.default.release}} jprt.my.linux.ppcv2.jdk8=linux_ppcv2_2.6 jprt.my.linux.ppcv2.jdk7=linux_ppcv2_2.6 -jprt.my.linux.ppcv2.jdk7u60=${jprt.my.linux.ppcv2.jdk7} +jprt.my.linux.ppcv2.jdk7u72=${jprt.my.linux.ppcv2.jdk7} jprt.my.linux.ppcv2=${jprt.my.linux.ppcv2.${jprt.tools.default.release}} jprt.my.linux.armvfp.jdk8=linux_armvfp_2.6 jprt.my.linux.armvfp.jdk7=linux_armvfp_2.6 -jprt.my.linux.armvfp.jdk7u60=${jprt.my.linux.armvfp.jdk7} +jprt.my.linux.armvfp.jdk7u72=${jprt.my.linux.armvfp.jdk7} jprt.my.linux.armvfp=${jprt.my.linux.armvfp.${jprt.tools.default.release}} jprt.my.linux.armvfpsflt.jdk8=linux_armvfpsflt_2.6 jprt.my.linux.armvfpsflt.jdk7=linux_armvfpsflt_2.6 -jprt.my.linux.armvfpsflt.jdk7u60=${jprt.my.linux.armvfpsflt.jdk7} +jprt.my.linux.armvfpsflt.jdk7u72=${jprt.my.linux.armvfpsflt.jdk7} jprt.my.linux.armvfpsflt=${jprt.my.linux.armvfpsflt.${jprt.tools.default.release}} jprt.my.linux.armvfphflt.jdk8=linux_armvfphflt_2.6 jprt.my.linux.armvfphflt.jdk7=linux_armvfphflt_2.6 -jprt.my.linux.armvfphflt.jdk7u60=${jprt.my.linux.armvfphflt.jdk7} +jprt.my.linux.armvfphflt.jdk7u72=${jprt.my.linux.armvfphflt.jdk7} jprt.my.linux.armvfphflt=${jprt.my.linux.armvfphflt.${jprt.tools.default.release}} jprt.my.linux.armv6.jdk8=linux_armv6_2.6 jprt.my.linux.armv6.jdk7=linux_armv6_2.6 -jprt.my.linux.armv6.jdk7u60=${jprt.my.linux.armv6.jdk7} +jprt.my.linux.armv6.jdk7u72=${jprt.my.linux.armv6.jdk7} jprt.my.linux.armv6=${jprt.my.linux.armv6.${jprt.tools.default.release}} jprt.my.linux.armvs.jdk8=linux_armvs_2.6 jprt.my.linux.armvs.jdk7=linux_armvs_2.6 -jprt.my.linux.armvs.jdk7u60=${jprt.my.linux.armvs.jdk7} +jprt.my.linux.armvs.jdk7u72=${jprt.my.linux.armvs.jdk7} jprt.my.linux.armvs=${jprt.my.linux.armvs.${jprt.tools.default.release}} jprt.my.linux.armvh.jdk8=linux_armvh_2.6 jprt.my.linux.armvh.jdk7=linux_armvh_2.6 -jprt.my.linux.armvh.jdk7u60=${jprt.my.linux.armvh.jdk7} +jprt.my.linux.armvh.jdk7u72=${jprt.my.linux.armvh.jdk7} jprt.my.linux.armvh=${jprt.my.linux.armvh.${jprt.tools.default.release}} jprt.my.linux.armsflt.jdk8=linux_armsflt_2.6 jprt.my.linux.armsflt.jdk7=linux_armsflt_2.6 -jprt.my.linux.armsflt.jdk7u60=${jprt.my.linux.armsflt.jdk7} +jprt.my.linux.armsflt.jdk7u72=${jprt.my.linux.armsflt.jdk7} jprt.my.linux.armsflt=${jprt.my.linux.armsflt.${jprt.tools.default.release}} +jprt.my.linux.sparcv9=linux_sparcv9_3.8 + jprt.my.macosx.x64.jdk8=macosx_x64_10.7 jprt.my.macosx.x64.jdk7=macosx_x64_10.7 -jprt.my.macosx.x64.jdk7u60=${jprt.my.macosx.x64.jdk7} +jprt.my.macosx.x64.jdk7u72=${jprt.my.macosx.x64.jdk7} jprt.my.macosx.x64=${jprt.my.macosx.x64.${jprt.tools.default.release}} jprt.my.windows.i586.jdk8=windows_i586_5.1 jprt.my.windows.i586.jdk7=windows_i586_5.1 -jprt.my.windows.i586.jdk7u60=${jprt.my.windows.i586.jdk7} +jprt.my.windows.i586.jdk7u72=${jprt.my.windows.i586.jdk7} jprt.my.windows.i586=${jprt.my.windows.i586.${jprt.tools.default.release}} jprt.my.windows.x64.jdk8=windows_x64_5.2 jprt.my.windows.x64.jdk7=windows_x64_5.2 -jprt.my.windows.x64.jdk7u60=${jprt.my.windows.x64.jdk7} +jprt.my.windows.x64.jdk7u72=${jprt.my.windows.x64.jdk7} jprt.my.windows.x64=${jprt.my.windows.x64.${jprt.tools.default.release}} # Standard list of jprt build targets for this source tree @@ -151,6 +153,7 @@ ${jprt.my.solaris.x64}-{product|fastdebug|debug}, \ ${jprt.my.linux.i586}-{product|fastdebug|debug}, \ ${jprt.my.linux.x64}-{product|fastdebug}, \ + ${jprt.my.linux.sparcv9}-{product|fastdebug}, \ ${jprt.my.macosx.x64}-{product|fastdebug|debug}, \ ${jprt.my.windows.i586}-{product|fastdebug|debug}, \ ${jprt.my.windows.x64}-{product|fastdebug|debug}, \ @@ -177,7 +180,7 @@ jprt.build.targets.jdk8=${jprt.build.targets.all} jprt.build.targets.jdk7=${jprt.build.targets.all} -jprt.build.targets.jdk7u60=${jprt.build.targets.all} +jprt.build.targets.jdk7u72=${jprt.build.targets.all} jprt.build.targets=${jprt.build.targets.${jprt.tools.default.release}} # Subset lists of test targets for this source tree @@ -352,6 +355,30 @@ ${jprt.my.linux.x64}-{product|fastdebug}-c2-jbb_G1, \ ${jprt.my.linux.x64}-{product|fastdebug}-c2-jbb_ParOldGC +jprt.my.linux.sparcv9.test.targets = \ + ${jprt.my.linux.sparcv9}-{product|fastdebug}-c2-jvm98, \ + ${jprt.my.linux.sparcv9}-{product|fastdebug}-c2-jvm98_nontiered, \ + ${jprt.my.linux.sparcv9}-{product|fastdebug}-c2-scimark, \ + ${jprt.my.linux.sparcv9}-{product|fastdebug}-c2-GCBasher_default, \ + ${jprt.my.linux.sparcv9}-{product|fastdebug}-c2-GCBasher_SerialGC, \ + ${jprt.my.linux.sparcv9}-{product|fastdebug}-c2-GCBasher_ParallelGC, \ + ${jprt.my.linux.sparcv9}-{product|fastdebug}-c2-GCBasher_ParNewGC, \ + ${jprt.my.linux.sparcv9}-{product|fastdebug}-c2-GCBasher_CMS, \ + ${jprt.my.linux.sparcv9}-{product|fastdebug}-c2-GCBasher_G1, \ + ${jprt.my.linux.sparcv9}-{product|fastdebug}-c2-GCBasher_ParOldGC, \ + ${jprt.my.linux.sparcv9}-{product|fastdebug}-c2-GCOld_default, \ + ${jprt.my.linux.sparcv9}-{product|fastdebug}-c2-GCOld_SerialGC, \ + ${jprt.my.linux.sparcv9}-{product|fastdebug}-c2-GCOld_ParallelGC, \ + ${jprt.my.linux.sparcv9}-{product|fastdebug}-c2-GCOld_ParNewGC, \ + ${jprt.my.linux.sparcv9}-{product|fastdebug}-c2-GCOld_CMS, \ + ${jprt.my.linux.sparcv9}-{product|fastdebug}-c2-GCOld_G1, \ + ${jprt.my.linux.sparcv9}-{product|fastdebug}-c2-GCOld_ParOldGC, \ + ${jprt.my.linux.sparcv9}-{product|fastdebug}-c2-jbb_default, \ + ${jprt.my.linux.sparcv9}-{product|fastdebug}-c2-jbb_default_nontiered, \ + ${jprt.my.linux.sparcv9}-{product|fastdebug}-c2-jbb_ParallelGC, \ + ${jprt.my.linux.sparcv9}-{product|fastdebug}-c2-jbb_G1, \ + ${jprt.my.linux.sparcv9}-{product|fastdebug}-c2-jbb_ParOldGC + jprt.my.macosx.x64.test.targets = \ ${jprt.my.macosx.x64}-{product|fastdebug}-c2-jvm98, \ ${jprt.my.macosx.x64}-{product|fastdebug}-c2-jvm98_nontiered, \ @@ -452,6 +479,7 @@ ${jprt.my.solaris.x64.test.targets}, \ ${jprt.my.linux.i586.test.targets}, \ ${jprt.my.linux.x64.test.targets}, \ + ${jprt.my.linux.sparcv9.test.targets}, \ ${jprt.my.macosx.x64.test.targets}, \ ${jprt.my.windows.i586.test.targets}, \ ${jprt.my.windows.x64.test.targets}, \ @@ -470,7 +498,7 @@ jprt.test.targets.jdk8=${jprt.test.targets.standard} jprt.test.targets.jdk7=${jprt.test.targets.standard} -jprt.test.targets.jdk7u60=${jprt.test.targets.jdk7} +jprt.test.targets.jdk7u72=${jprt.test.targets.jdk7} jprt.test.targets=${jprt.test.targets.${jprt.tools.default.release}} # The default test/Makefile targets that should be run @@ -490,6 +518,7 @@ ${jprt.my.solaris.x64}-*-c2-servertest, \ ${jprt.my.linux.i586}-*-c2-servertest, \ ${jprt.my.linux.x64}-*-c2-servertest, \ + ${jprt.my.linux.sparcv9}-*-c2-servertest, \ ${jprt.my.macosx.x64}-*-c2-servertest, \ ${jprt.my.windows.i586}-*-c2-servertest, \ ${jprt.my.windows.x64}-*-c2-servertest @@ -501,6 +530,7 @@ ${jprt.my.solaris.x64}-fastdebug-c2-internalvmtests, \ ${jprt.my.linux.i586}-fastdebug-c2-internalvmtests, \ ${jprt.my.linux.x64}-fastdebug-c2-internalvmtests, \ + ${jprt.my.linux.sparcv9}-fastdebug-c2-internalvmtests, \ ${jprt.my.macosx.x64}-fastdebug-c2-internalvmtests, \ ${jprt.my.windows.i586}-fastdebug-c2-internalvmtests, \ ${jprt.my.windows.x64}-fastdebug-c2-internalvmtests @@ -512,6 +542,7 @@ ${jprt.my.solaris.x64}-{product|fastdebug}-c2-wbapitest, \ ${jprt.my.linux.i586}-{product|fastdebug}-c2-wbapitest, \ ${jprt.my.linux.x64}-{product|fastdebug}-c2-wbapitest, \ + ${jprt.my.linux.sparcv9}-{product|fastdebug}-c2-wbapitest, \ ${jprt.my.windows.i586}-{product|fastdebug}-c2-wbapitest, \ ${jprt.my.windows.x64}-{product|fastdebug}-c2-wbapitest, \ ${jprt.my.solaris.sparc}-{product|fastdebug}-c1-wbapitest, \ @@ -530,7 +561,7 @@ jprt.make.rule.test.targets.jdk8=${jprt.make.rule.test.targets.standard} jprt.make.rule.test.targets.jdk7=${jprt.make.rule.test.targets.standard} -jprt.make.rule.test.targets.jdk7u60=${jprt.make.rule.test.targets.jdk7} +jprt.make.rule.test.targets.jdk7u72=${jprt.make.rule.test.targets.jdk7} jprt.make.rule.test.targets=${jprt.make.rule.test.targets.${jprt.tools.default.release}} # 7155453: Work-around to prevent popups on OSX from blocking test completion
--- a/src/os/linux/vm/os_linux.cpp Thu Feb 05 09:27:52 2015 -0800 +++ b/src/os/linux/vm/os_linux.cpp Wed Feb 04 08:28:58 2015 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -6065,26 +6065,57 @@ #define __NR_execve IA32_ONLY(11) IA64_ONLY(1033) AMD64_ONLY(59) #endif +#if defined(SPARC) +// This assembly code makes the call to "syscall(__NR_fork)" and then +// gets the values for "pid" and "is_child" from the correct registers. +// This was done to make sure the compiler does not change the order +// of the instructions while optimizing. +void sparc_fork(int nr_fork, pid_t *pid, int *ischild) { + asm volatile ( + " mov %2, %%o0\n\t" + " call syscall, 0\n\t" + " nop\n\t" + " mov %%o0, %0\n\t" + " mov %%o1, %1\n\t" + : "=r" (*pid), "=r" (*ischild) + : "r" (nr_fork) : + ); +} +#endif + // Run the specified command in a separate process. Return its exit value, // or -1 on failure (e.g. can't fork a new process). // Unlike system(), this function can be called from signal handler. It // doesn't block SIGINT et al. int os::fork_and_exec(char* cmd) { const char * argv[4] = {"sh", "-c", cmd, NULL}; + int is_child; + pid_t pid; // fork() in LinuxThreads/NPTL is not async-safe. It needs to run // pthread_atfork handlers and reset pthread library. All we need is a // separate process to execve. Make a direct syscall to fork process. // On IA64 there's no fork syscall, we have to use fork() and hope for // the best... - pid_t pid = NOT_IA64(syscall(__NR_fork);) +#if defined(SPARC) + sparc_fork(__NR_fork, &pid, &is_child); +#else + pid = NOT_IA64(syscall(__NR_fork);) IA64_ONLY(fork();) + // set the is_child flag by checking the pid + if (pid == 0) { + is_child = 1; + } else { + is_child = 0; + } +#endif + if (pid < 0) { // fork failed return -1; - } else if (pid == 0) { + } else if (is_child) { // child process // execve() in LinuxThreads will call pthread_kill_other_threads_np()