Skip to content
This repository has been archived by the owner on Apr 24, 2023. It is now read-only.
/ jdk20 Public archive

Commit

Permalink
8298400: Virtual thread instability when stack overflows
Browse files Browse the repository at this point in the history
Co-authored-by: Fei Yang <fyang@openjdk.org>
Co-authored-by: Richard Reingruber <rrich@openjdk.org>
Reviewed-by: dlong, pchilanomate
  • Loading branch information
3 people committed Jan 19, 2023
1 parent 62a2f23 commit 1c84050
Show file tree
Hide file tree
Showing 5 changed files with 42 additions and 2 deletions.
9 changes: 9 additions & 0 deletions src/hotspot/cpu/aarch64/sharedRuntime_aarch64.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1218,6 +1218,15 @@ static void gen_continuation_yield(MacroAssembler* masm,

__ bind(pinned); // pinned -- return to caller

// handle pending exception thrown by freeze
__ ldr(rscratch1, Address(rthread, in_bytes(Thread::pending_exception_offset())));
Label ok;
__ cbz(rscratch1, ok);
__ leave();
__ lea(rscratch1, RuntimeAddress(StubRoutines::forward_exception_entry()));
__ br(rscratch1);
__ bind(ok);

__ leave();
__ ret(lr);

Expand Down
13 changes: 13 additions & 0 deletions src/hotspot/cpu/ppc/sharedRuntime_ppc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1990,6 +1990,19 @@ static void gen_continuation_yield(MacroAssembler* masm,

__ bind(L_pinned); // pinned -- return to caller

// handle pending exception thrown by freeze
Label ok;
__ ld(tmp, in_bytes(JavaThread::pending_exception_offset()), R16_thread);
__ cmpdi(CCR0, tmp, 0);
__ beq(CCR0, ok);
__ pop_frame();
__ ld(R0, _abi0(lr), R1_SP); // Return pc
__ mtlr(R0);
__ load_const_optimized(tmp, StubRoutines::forward_exception_entry(), R0);
__ mtctr(tmp);
__ bctr();
__ bind(ok);

// Pop frame and return
__ pop_frame();
__ ld(R0, _abi0(lr), R1_SP); // Return pc
Expand Down
9 changes: 9 additions & 0 deletions src/hotspot/cpu/riscv/sharedRuntime_riscv.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1095,6 +1095,15 @@ static void gen_continuation_yield(MacroAssembler* masm,

__ bind(pinned); // pinned -- return to caller

// handle pending exception thrown by freeze
__ ld(t0, Address(xthread, in_bytes(Thread::pending_exception_offset())));
Label ok;
__ beqz(t0, ok);
__ leave();
__ la(t0, RuntimeAddress(StubRoutines::forward_exception_entry()));
__ jr(t0);
__ bind(ok);

__ leave();
__ ret();

Expand Down
9 changes: 9 additions & 0 deletions src/hotspot/cpu/x86/sharedRuntime_x86_64.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1587,6 +1587,15 @@ static void gen_continuation_yield(MacroAssembler* masm,
__ bind(L_pinned);

// Pinned, return to caller

// handle pending exception thrown by freeze
__ cmpptr(Address(r15_thread, Thread::pending_exception_offset()), NULL_WORD);
Label ok;
__ jcc(Assembler::equal, ok);
__ leave();
__ jump(RuntimeAddress(StubRoutines::forward_exception_entry()));
__ bind(ok);

__ leave();
__ ret(0);
}
Expand Down
4 changes: 2 additions & 2 deletions src/hotspot/share/runtime/continuationFreezeThaw.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -274,7 +274,7 @@ class Config {
static bool stack_overflow_check(JavaThread* thread, int size, address sp) {
const int page_size = os::vm_page_size();
if (size > page_size) {
if (sp - size < thread->stack_overflow_state()->stack_overflow_limit()) {
if (sp - size < thread->stack_overflow_state()->shadow_zone_safe_limit()) {
return false;
}
}
Expand Down Expand Up @@ -1259,7 +1259,7 @@ NOINLINE void FreezeBase::finish_freeze(const frame& f, const frame& top) {
inline bool FreezeBase::stack_overflow() { // detect stack overflow in recursive native code
JavaThread* t = !_preempt ? _thread : JavaThread::current();
assert(t == JavaThread::current(), "");
if (os::current_stack_pointer() < t->stack_overflow_state()->stack_overflow_limit()) {
if (os::current_stack_pointer() < t->stack_overflow_state()->shadow_zone_safe_limit()) {
if (!_preempt) {
ContinuationWrapper::SafepointOp so(t, _cont); // could also call _cont.done() instead
Exceptions::_throw_msg(t, __FILE__, __LINE__, vmSymbols::java_lang_StackOverflowError(), "Stack overflow while freezing");
Expand Down

1 comment on commit 1c84050

@openjdk-notifier
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.