RFR: 8212107: VMThread issues and cleanup
Robbin Ehn
rehn at openjdk.java.net
Fri Sep 18 09:20:08 UTC 2020
On Fri, 18 Sep 2020 05:04:30 GMT, Aleksey Shipilev <shade at openjdk.org> wrote:
>> We simplify the vmThread by removing the queue and refactor the the main loop.
>> This solves the issues listed:
>> - It can create an extra safepoint directly after a safepoint.
>> - It's not safe for a non-JavaThread to add safepoint to queue while GC do oops do.
>> - The exposure of the vm operation is dangerous if it's a handshake.
>> - The code is a hornets nest with the repetition of checks and branches
>>
>> Passes t1-8, and a benchmark run.
>>
>> If you want a smaller diff the commits contains the incremental progress and each commit passed t1.
>
> src/hotspot/share/runtime/mutexLocker.cpp line 68:
>
>> 66: Mutex* TouchedMethodLog_lock = NULL;
>> 67: Mutex* RetData_lock = NULL;
>> 68: Monitor* VMOperation_lock = NULL;
>
> Indenting is a bit off here?
Fixing
> src/hotspot/share/runtime/mutexLocker.hpp line 61:
>
>> 59: extern Mutex* TouchedMethodLog_lock; // a lock on allocation of LogExecutedMethods info
>> 60: extern Mutex* RetData_lock; // a lock on installation of RetData inside method data
>> 61: extern Monitor* VMOperation_lock; // a lock on queue of vm_operations waiting to execute
>
> Indenting is a bit off?
Fixing
> src/hotspot/share/runtime/thread.hpp line 625:
>
>> 623:
>> 624: // For tracking the heavyweight monitor the thread is pending on.
>> 625: ObjectMonitor* current_pending_monitor() {
>
> If this goes, then the declaration of `_vm_operation_started_count` can also go?
Fixing
> src/hotspot/share/runtime/thread.hpp line 627:
>
>> 625: ObjectMonitor* current_pending_monitor() {
>> 626: return _current_pending_monitor;
>> 627: }
>
> Ditto for `_vm_operation_completed_count`?
Fixing
> src/hotspot/share/runtime/vmThread.cpp line 222:
>
>> 220: void VMThread::wait_for_vm_thread_exit() {
>> 221: assert(Thread::current()->is_Java_thread(), "Should be a JavaThread");
>> 222: assert(((JavaThread*)Thread::current())->is_terminated(), "Should be terminated");
>
> Looks like just `assert(JavaThread::current()->is_terminated(), "Should be terminated")`.
Fixing
> src/hotspot/share/runtime/vmThread.cpp line 305:
>
>> 303: // we emit a handshake if it's been more than a second since last.
>> 304: jlong deadline_ms = GuaranteedSafepointInterval != 0 ? GuaranteedSafepointInterval : 1000;
>> 305: deadline_ms += last_halot_ms;
>
> It would seem more straight-forward to write it like this, to highlight the "base" `last_halot_ms` and the "addition"
> `interval`:
> // ...
> jlong interval = (GuaranteedSafepointInterval != 0 ? GuaranteedSafepointInterval : 1000);
> jlong deadline_ms = last_halot_ms + interval;
> if (now_ms > deadline_ms) {
> last_halot_ms = now_ms;
> return true;
> }
> return false;
>
> ...but that's just a personal preference.
Fixing
> src/hotspot/share/runtime/vmThread.cpp line 313:
>
>> 311: }
>> 312:
>> 313: void VMThread::cleanup_safepoint_alot() {
>
> This handles `GuaranteedSafepointInterval` periodic op as well, so `cleanup_safepoint_alot` seems misnomer.
Fixing, but not sure if you like.
> src/hotspot/share/runtime/vmThread.cpp line 344:
>
>> 342: }
>> 343:
>> 344: void VMThread::until_executed(VM_Operation* op) {
>
> ...`until_executed`? Feels like missing a verb, e.g. `wait_until_executed`?
Fixing
> src/hotspot/share/runtime/vmThread.cpp line 392:
>
>> 390:
>> 391: HandleMark hm(VMThread::vm_thread());
>> 392: EventMark em("Executing %s VM operation: %s", prev_vm_operation ? "nested" : "", op->name());
>
> Check `prev_vm_operation != NULL` explicitly?
Fixing
> src/hotspot/share/runtime/vmThread.cpp line 427:
>
>> 425:
>> 426: // Notify previous op done
>> 427: mu_queue.notify();
>
> So, `notify`, not `notifyAll` here? We sure we want to bet who -- of all current waiters -- gets the notification?
Will be changed, due to above issue.
> src/hotspot/share/runtime/vmThread.cpp line 470:
>
>> 468: while (true) {
>> 469: wait_for_operation();
>> 470: if (!should_terminate()) {
>
> This is a trailing block. So it might just be `do { ... } while (!should_terminate())`?
Fixing
> src/hotspot/share/runtime/vmThread.hpp line 103:
>
>> 101: // Returns the current vm operation if any.
>> 102: static VM_Operation* vm_operation() {
>> 103: assert(Thread::current()->is_VM_thread(), "Must be);");
>
> Typos in `Must be);`.
Fixing
> src/hotspot/share/runtime/vmThread.hpp line 129:
>
>> 127: // VM_Operation support
>> 128: static VM_Operation* _cur_vm_operation; // Current VM operation
>> 129: static VM_Operation* _next_vm_operation;
>
> Comment to match `// Current VM operation` above?
Fixing
-------------
PR: https://git.openjdk.java.net/jdk/pull/228
More information about the hotspot-dev
mailing list