--- old/src/hotspot/share/runtime/deoptimization.cpp 2019-08-28 09:09:01.119062511 +0200 +++ new/src/hotspot/share/runtime/deoptimization.cpp 2019-08-28 09:09:00.798051513 +0200 @@ -253,7 +253,12 @@ } #if !INCLUDE_JVMCI } + // Revoke biases, done with in java state. + revoke_from_deopt_handler(thread, deoptee, &map); if (EliminateLocks) { +#else + // Revoke biases, done with in java state. + revoke_from_deopt_handler(thread, deoptee, &map); #endif // INCLUDE_JVMCI #ifndef PRODUCT bool first = true; @@ -288,6 +293,9 @@ } #if !INCLUDE_JVMCI } + } else { + // Revoke biases, done with in java state. + revoke_from_deopt_handler(thread, deoptee, &map); } #endif // INCLUDE_JVMCI #endif // COMPILER2_OR_JVMCI @@ -780,13 +788,11 @@ JRT_END class DeoptimizeMarkedTC : public ThreadClosure { - bool _in_handshake; public: - DeoptimizeMarkedTC(bool in_handshake) : _in_handshake(in_handshake) {} virtual void do_thread(Thread* thread) { assert(thread->is_Java_thread(), "must be"); JavaThread* jt = (JavaThread*)thread; - jt->deoptimize_marked_methods(_in_handshake); + jt->deoptimize_marked_methods(); } }; @@ -795,7 +801,7 @@ DeoptimizationMarker dm; if (SafepointSynchronize::is_at_safepoint()) { - DeoptimizeMarkedTC deopt(false); + DeoptimizeMarkedTC deopt; // Make the dependent methods not entrant CodeCache::make_marked_nmethods_not_entrant(); Threads::java_threads_do(&deopt); @@ -805,7 +811,7 @@ MutexLocker mu(CodeCache_lock, Mutex::_no_safepoint_check_flag); CodeCache::make_marked_nmethods_not_entrant(); } - DeoptimizeMarkedTC deopt(true); + DeoptimizeMarkedTC deopt; Handshake::execute(&deopt); } } @@ -1448,21 +1454,7 @@ collect_monitors(cvf, objects_to_revoke); } -void Deoptimization::revoke_using_safepoint(JavaThread* thread, frame fr, RegisterMap* map) { - if (!UseBiasedLocking) { - return; - } - GrowableArray* objects_to_revoke = new GrowableArray(); - get_monitors_from_stack(objects_to_revoke, thread, fr, map); - - if (SafepointSynchronize::is_at_safepoint()) { - BiasedLocking::revoke_at_safepoint(objects_to_revoke); - } else { - BiasedLocking::revoke(objects_to_revoke, thread); - } -} - -void Deoptimization::revoke_using_handshake(JavaThread* thread, frame fr, RegisterMap* map) { +void Deoptimization::revoke_from_deopt_handler(JavaThread* thread, frame fr, RegisterMap* map) { if (!UseBiasedLocking) { return; } @@ -1505,16 +1497,7 @@ fr.deoptimize(thread); } -void Deoptimization::deoptimize(JavaThread* thread, frame fr, RegisterMap *map, bool in_handshake) { - deopt_thread(in_handshake, thread, fr, map, Reason_constraint); -} - void Deoptimization::deoptimize(JavaThread* thread, frame fr, RegisterMap *map, DeoptReason reason) { - deopt_thread(false, thread, fr, map, reason); -} - -void Deoptimization::deopt_thread(bool in_handshake, JavaThread* thread, - frame fr, RegisterMap *map, DeoptReason reason) { // Deoptimize only if the frame comes from compile code. // Do not deoptimize the frame which is already patched // during the execution of the loops below. @@ -1523,15 +1506,7 @@ } ResourceMark rm; DeoptimizationMarker dm; - if (UseBiasedLocking) { - if (in_handshake) { - revoke_using_handshake(thread, fr, map); - } else { - revoke_using_safepoint(thread, fr, map); - } - } deoptimize_single_frame(thread, fr, reason); - } #if INCLUDE_JVMCI @@ -1692,9 +1667,6 @@ { ResourceMark rm; - // Revoke biases of any monitors in the frame to ensure we can migrate them - revoke_biases_of_monitors(thread, fr, ®_map); - DeoptReason reason = trap_request_reason(trap_request); DeoptAction action = trap_request_action(trap_request); #if INCLUDE_JVMCI --- old/src/hotspot/share/runtime/deoptimization.hpp 2019-08-28 09:09:03.012127368 +0200 +++ new/src/hotspot/share/runtime/deoptimization.hpp 2019-08-28 09:09:02.688116267 +0200 @@ -143,14 +143,13 @@ // Checks all compiled methods. Invalid methods are deleted and // corresponding activations are deoptimized. static int deoptimize_dependents(); - static void revoke_using_handshake(JavaThread* thread, frame fr, RegisterMap* map); - static void revoke_using_safepoint(JavaThread* thread, frame fr, RegisterMap* map); - static void deopt_thread(bool in_handshake, JavaThread* thread, frame fr, RegisterMap *map, DeoptReason reason); + + // Revoke biased locks at deopt. + static void revoke_from_deopt_handler(JavaThread* thread, frame fr, RegisterMap* map); public: // Deoptimizes a frame lazily. nmethod gets patched deopt happens on return to the frame - static void deoptimize(JavaThread* thread, frame fr, RegisterMap *map, bool in_handshake = false); - static void deoptimize(JavaThread* thread, frame fr, RegisterMap *reg_map, DeoptReason reason); + static void deoptimize(JavaThread* thread, frame fr, RegisterMap *reg_map, DeoptReason reason = Reason_constraint); #if INCLUDE_JVMCI static address deoptimize_for_missing_exception_handler(CompiledMethod* cm); @@ -161,12 +160,6 @@ // Does the actual work for deoptimizing a single frame static void deoptimize_single_frame(JavaThread* thread, frame fr, DeoptReason reason); - // Helper function to revoke biases of all monitors in frame if UseBiasedLocking - // is enabled - static void revoke_biases_of_monitors(JavaThread* thread, frame fr, RegisterMap* map) { - revoke_using_safepoint(thread, fr, map); - } - #if COMPILER2_OR_JVMCI JVMCI_ONLY(public:) --- old/src/hotspot/share/runtime/thread.cpp 2019-08-28 09:09:04.820189313 +0200 +++ new/src/hotspot/share/runtime/thread.cpp 2019-08-28 09:09:04.494178144 +0200 @@ -2859,13 +2859,13 @@ #endif // PRODUCT -void JavaThread::deoptimize_marked_methods(bool in_handshake) { +void JavaThread::deoptimize_marked_methods() { if (!has_last_Java_frame()) return; // BiasedLocking needs an updated RegisterMap for the revoke monitors pass StackFrameStream fst(this, UseBiasedLocking); for (; !fst.is_done(); fst.next()) { if (fst.current()->should_be_deoptimized()) { - Deoptimization::deoptimize(this, *fst.current(), fst.register_map(), in_handshake); + Deoptimization::deoptimize(this, *fst.current(), fst.register_map()); } } } --- old/src/hotspot/share/runtime/thread.hpp 2019-08-28 09:09:06.726254616 +0200 +++ new/src/hotspot/share/runtime/thread.hpp 2019-08-28 09:09:06.401243480 +0200 @@ -1889,7 +1889,7 @@ void deoptimize(); void make_zombies(); - void deoptimize_marked_methods(bool in_handshake); + void deoptimize_marked_methods(); public: // Returns the running thread as a JavaThread