8064815: Zero+PPC64: Stack overflow when running Maven
Reviewed-by: kvn, simonis
Contributed-by: sgehwolf@redhat.com
--- a/hotspot/src/cpu/zero/vm/stack_zero.cpp Thu Nov 13 16:58:56 2014 +0100
+++ b/hotspot/src/cpu/zero/vm/stack_zero.cpp Tue Nov 18 19:17:16 2014 +0100
@@ -30,7 +30,9 @@
int ZeroStack::suggest_size(Thread *thread) const {
assert(needs_setup(), "already set up");
- return align_size_down(abi_stack_available(thread) / 2, wordSize);
+ int abi_available = abi_stack_available(thread);
+ assert(abi_available >= 0, "available abi stack must be >= 0");
+ return align_size_down(abi_available / 2, wordSize);
}
void ZeroStack::handle_overflow(TRAPS) {
--- a/hotspot/src/cpu/zero/vm/stack_zero.inline.hpp Thu Nov 13 16:58:56 2014 +0100
+++ b/hotspot/src/cpu/zero/vm/stack_zero.inline.hpp Tue Nov 18 19:17:16 2014 +0100
@@ -48,9 +48,11 @@
// to use under normal circumstances. Note that the returned
// value can be negative.
inline int ZeroStack::abi_stack_available(Thread *thread) const {
- int stack_used = thread->stack_base() - (address) &stack_used;
+ guarantee(Thread::current() == thread, "should run in the same thread");
+ int stack_used = thread->stack_base() - (address) &stack_used
+ + (StackYellowPages+StackRedPages+StackShadowPages) * os::vm_page_size();
int stack_free = thread->stack_size() - stack_used;
- return stack_free - shadow_pages_size();
+ return stack_free;
}
#endif // CPU_ZERO_VM_STACK_ZERO_INLINE_HPP