On 2017-01-13 at 10:52 Barret Rhoden <b...@cs.berkeley.edu> wrote: > Given all this, here was the bug that caused this.
for those curious about the debugging steps (including false trails) that i took figuring this out, i attached my 12-monkeys-style scribbles. barret -- You received this message because you are subscribed to the Google Groups "Akaros" group. To unsubscribe from this group and stop receiving emails from it, send an email to akaros+unsubscr...@googlegroups.com. To post to this group, send email to akaros@googlegroups.com. For more options, visit https://groups.google.com/d/optout.
Possibly related, while running a VM and doing weird shit with ssh: Type 'help' for a list of commands. HW TRAP frame at 0xfffffff00021ee60 on core 13 rax 0xfffffff00021ef28 rbx 0xffffffffc54d9248 rcx 0x0000000000000001 rdx 0x0000000092b24000 rbp 0xfffffff00021ef58 rsi 0xffff800092b24000 rdi 0x0000000000000000 r8 0x0000000000001d40 r9 0xfffffff00021eec0 r10 0x0000000000000018 r11 0xfffffff00021eee0 r12 0xffff8000061ca520 r13 0xfffffff00021ef28 r14 0x00000000ffffffff r15 0x0000000000000000 trap 0x00000006 Invalid Opcode gsbs 0xffffffffc5620e00 fsbs 0x0000000000000000 err 0x--------00000000 rip 0xffffffffc2135dab cs 0x------------0008 flag 0x0000000000010003 rsp 0xfffffff00021ef28 ss 0x------------0010 ROS(Core 13)> ROS(Core 13)> bt Stack Backtrace on Core 13: #01 [<0xffffffffc201ecd4>] in mon_backtrace #02 [<0xffffffffc201fcd7>] in monitor #03 [<0xffffffffc2130d11>] in trap ROS(Core 13)> bt 0xffffffffc2135dab 0xfffffff00021ef58 Backtrace from instruction 0xffffffffc2135dab, with frame pointer 0xfffffff00021ef58 Backtrace of kernel context on Core 13: #01 [<0xffffffffc2135dab>] in vmx_clear_vmcs #02 [<0xffffffffc212e4c0>] in __abandon_core #03 [<0xffffffffc2051532>] in proc_restartcore that's this ud2: static inline void __invept(int ext, uint64_t eptp, gpa_t gpa) { struct { uint64_t eptp, gpa; } operand = {eptp, gpa}; asm volatile (ASM_VMX_INVEPT /* CF==1 or ZF==1 --> rc = -1 */ "; ja 1f ; ud2 ; 1:\n" : : "a" (&operand), "c" (ext) : "cc", "memory"); } ffffffffc213609c: b9 01 00 00 00 mov $0x1,%ecx ffffffffc21360a1: 4c 89 e8 mov %r13,%rax ffffffffc21360a4: 66 0f 38 80 08 invept (%rax),%rcx so both of these still happen (strace triggers the panic from unload guest pcore), and i can get the ud2 strace/perf doesn't always trigger it. ud2 was hard. seems more reliable if we're spinning in the VM and then we do something (like ctrl-c it) for i in `seq 1 99999999999999`; do echo foo > /dev/null; done - this does it reliably ud2: vmx_clear_vmcs should only clear if it thinks it has a GPC. that's probably the fucked up part. that came from the PERCPU_VAR(gpc-to-clear-to) the __invept triggers a UD2, probably when one of those flags are set. rfl is 0x0000000000010003 CR, RSVD, RF (resume) CF is set, which means FailInvalid rax 0xfffffff000113f28 (rcx == 1) ROS(Core 12)> kfunc hexdump 0xfffffff000113f28 128 fffffff000113f28: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ fffffff000113f38: 0c 00 00 00 f0 ff ff ff 0c 00 00 00 00 00 00 00 ................ fffffff000113f48: 11 00 00 00 00 00 00 00 68 2f 00 00 00 10 00 00 ........h/...... fffffff000113f58: 78 3f 11 00 f0 ff ff ff 90 e7 12 c2 ff ff ff ff x?.............. fffffff000113f68: ff ff ff ff 00 00 00 00 c0 fb cc c7 ff ff ff ff ................ fffffff000113f78: 98 3f 11 00 f0 ff ff ff c2 16 05 c2 ff ff ff ff .?.............. fffffff000113f88: b0 e8 9f ff 7f 7f 00 00 b0 e8 9f ff 7f 7f 00 00 ................ fffffff000113f98: 00 00 00 00 00 00 00 00 b0 39 13 c2 ff ff ff ff .........9...... note that is a stack addr (0xfffffff000000000) RSP is 0xfffffff000113f28 rax is 0xfffffff000113f28 invept passes eptp and gpa as a struct on the stack, addr is in rax first thing was the arg passed in (rax in the asm, so only in memory), then the gpa, which happens to be 0 based on the asm, it looks like we passed null eptp null eptp, gpc was 0xffff800008d83c20 null eptp, proc was 0xffff800007ece200 null eptp, pid was 275 null eptp, PCPU was 0xffff800008d83c20 that proc is vmrunkernel. we're looking for p->pgdir.eptp. pgdir is embedded. did we somehow set it to 0 when killing the process, but before decrefs? that happens in __proc_free, which shouldn't happen until all refs are in do we decref before flushing ept? no - we hold our ref until after clearing vmcs. unless some weird shit is going on. refcounting bug? maybe we're storing refs in weird places with vms / gpcs, got confused, and decreffed too many times. if we hadn't hit the ud2, we'd panic in kref yes - the ref is already 0. so someone fucked up and decreffed the proc too much. - makes sense that this happens when we're killing the VM/process k, so we have someone calling __abandon_core(pcpui->cur_proc), but the ref is 0. BT said it was proc_restartcore, which calls it when we don't have an owning proc. could happen if we unblocked a thread on a core the process wasn't running on, completed the kthread/syscall, then tried to idle. is this a VM problem, or can any process (like an MCP spinning?) trigger this? pthread_test didn't easily trigger it might need to use some other services that vms use? that ctrl-c is sent to DB, which does the killing. the core that panics is an MCP core - could be any of them. probably was the core that was spinning in the guest it traps, takes the __death message, which finalizes the context, clears owning proc, then returns via restartcore. that abandons, since no owning core. finalize -> unload_guest_pcore XXX hey - if this is what happened, then what did unload_guest_pcore from __death do? remove the GPC? - no, with lazy unload, we clear some MSRs, but the VMCS isn't unloaded. - the pcore->gpc = -1. the gpc->core_id() is our core, our core's PCPU is set to GPC. - later, we call __abandon_core. that sees the GPC (from PCPU), clears the VMCS, and attempts to clear EPT, but our refcnt is already too low. proc_decref isn't called in VM code - hardly any arch specific code given that, there might be a refcnt bug elswhere? like something with cores coming and going, kthreads restarting on top of other processes, etc though having it spin seems critical to trigger it. does that imply a clobber? if someone decrefs too much, they usually decref their ref. but for something like cur_proc, maybe we overwrite it? cur_proc: written in proc64.c, kthread.c, proc.c. also look for 'current' (mon.c too) maybe some interaction with switch_to and other code, before switch_back? kth_save_addr_space? what if i'm told to abandon_core during a switch_to/switch_back? switch_to, old p is returned, ref for new p is stored in cur_proc block or something. (kth_save?) kth should get a refcnt'd copy of new_p new_p is cur abandon, decref new_p. now the new_p ref is in the kth unblock. load as current, shouldn't incref, since we transfer the ref from the kth. switch_back return new_p, restore old_p. seems OK. unless kth_save_addr wasn't on (for non-ktask) is it possible to have an errant kthread->proc set? if we have an uncounted ref there, but treat it as counted, etc... looks like no. we're pretty good about zeroing it last time we had this, i did some trace_printks for each decref source. there was a shitload of stuff to wade through. prob esp bad the longer a process runs. maybe turn it on an off? like right before hitting ctl-c? maybe make sure we didn't lose the ref already? (pip is racy btw) maybe a different tool? one that pairs the ref with its source? does it happen if it dies from the shell? No... which makes #cons more suspicious that shit looks OK though. we aren't actually killing from there - we send sigint via event... the diff is the process tries to kill itself via proc_destroy, possibly on another core. though also maybe on the core that was spinning wake up, vc ctx, see the handler, do a sys_proc_destroy doesn't happen if we kill from the kernel race with the process killing? you can trigger it with kill from bash (signal) so it seems like the process killing itself, possibly from a sig handler, matters does the constant start/stop of vcores also matter? (could be the racy part. but also we always fail, not just on occasion). maybe - pthread_test didn't trigger it. the VM might matter, due to the VMCS unload stuff, but OTOH, this is a refcnt problem, only triggered by the invept #alarm uses refcnts, and we're often doing things with #alarm with the VMM 2LS. if you're in the monitor, (trace syscalls) you have to leave, so ssh/DB can do its thing (obviously) but doesn't die via ssh ctrl-c if verbose syscall tracing is on implies there is a race where printing saves it sometimes it does - at least with a quick trace syscall start. this trace is from launching kill 276 (vmrunkernel, which was on vcore 2, pcore 5 right before (might have moved)) E [5518933.526522648]-[ 0.000000000] Syscall 101 ( write):(0xf, 0x400001856e0f, 0x13, 0x0, 0x0, 0x0) ret: --- proc: 276 core: 5 vcore: 2 da' X [5518933.526522648]-[5518933.543441149] Syscall 101 ( write):(0xf, 0x400001856e0f, 0x13, 0x0, 0x0, 0x0) ret: 0x13 proc: 276 core: 5 vcore: 2 data: '0x002f0' resetting an alarm E [5518933.560444592]-[ 0.000000000] Syscall 30 ( poke_ksched):(0x0, 0x0, 0x0, 0x0, 0x0, 0x0) ret: --- proc: 276 core: 5 vcore: 2 data: '' X [5518933.560444592]-[5518933.573971249] Syscall 30 ( poke_ksched):(0x0, 0x0, 0x0, 0x0, 0x0, 0x0) ret: 0x0 proc: 276 core: 5 vcore: 2 data: '' probably asked for more cores E [5518933.573993291]-[ 0.000000000] Syscall 38 (vmm_poke_guest):(0x0, 0x0, 0x0, 0x0, 0x0, 0x0) ret: --- proc: 276 core: 14 vcore: 0 data: '' inject IRQ, on new core E [5518933.587522703]-[ 0.000000000] Syscall 101 ( write):(0xf, 0x400001856eff, 0x13, 0x0, 0x0, 0x0) ret: --- proc: 276 core: 5 vcore: 2 data: '0x000000' alarm reset, old core X [5518933.573993291]-[5518933.601315825] Syscall 38 (vmm_poke_guest):(0x0, 0x0, 0x0, 0x0, 0x0, 0x0) ret: 0x0 proc: 276 core: 14 vcore: 0 data: '' irq inject completed (might have sent an IPI to pcore 5, or wherever GPC 0 was) X [5518933.587522703]-[5518933.618227163] Syscall 101 ( write):(0xf, 0x400001856eff, 0x13, 0x0, 0x0, 0x0) ret: 0x13 proc: 276 core: 5 vcore: 2 data: '0x00000' alarm reset completed E [5518933.632019549]-[ 0.000000000] Syscall 2 ( block):(0x186a0, 0x0, 0x0, 0x0, 0x0, 0x0) ret: --- proc: 276 core: 14 vcore: 0 data: '' some sort of timer sleep. would block and return to VC ctx E [5518933.649028297]-[ 0.000000000] Syscall 37 ( pop_ctx):(0x7f7fffa03800, 0x0, 0x0, 0x0, 0x0, 0x0) ret: --- proc: 276 core: 5 vcore: 2 data: '' trying to enter the VM (pcore 5) E [5518933.662998606]-[ 0.000000000] Syscall 13 ( proc_yield):(0x0, 0x0, 0x0, 0x0, 0x0, 0x0) ret: --- proc: 276 core: 14 vcore: 0 data: '' the timer sleep vc returned and now yields X [5518933.649028297]-[5518933.677488263] Syscall 37 ( pop_ctx):(0x7f7fffa03800, 0x0, 0x0, 0x0, 0x0, 0x0) ret: 0x0 proc: 27e6 core: 5 vcore: 2 data: '' X [5518933.662998606]-[5518933.691111915] Syscall 13 ( proc_yield):(0x0, 0x0, 0x0, 0x0, 0x0, 0x0) ret: 0x0 proc: 276 core: 14 vcore: 0 data: '' X [5518933.632019549]-[5518933.763017413] Syscall 2 ( block):(0x186a0, 0x0, 0x0, 0x0, 0x0, 0x0) ret: 0x0 proc: 276 core: 14 vcore: 0 data: '' the timer woke up. E [5518933.776992600]-[ 0.000000000] Syscall 101 ( write):(0xf, 0x400001856e0f, 0x13, 0x0, 0x0, 0x0) ret: --- proc: 276 core: 5 vcore: 2 data: '0x002f07' X [5518933.776992600]-[5518933.793907500] Syscall 101 ( write):(0xf, 0x400001856e0f, 0x13, 0x0, 0x0, 0x0) ret: 0x13 proc: 276 core: 5 vcore: 2 data: '0x002f0' PC 5 probably got an event for the completion of sys_block(), then decided to set its alarm E [5518933.810901923]-[ 0.000000000] Syscall 30 ( poke_ksched):(0x0, 0x0, 0x0, 0x0, 0x0, 0x0) ret: --- proc: 276 core: 5 vcore: 2 data: '' X [5518933.810901923]-[5518933.824437943] Syscall 30 ( poke_ksched):(0x0, 0x0, 0x0, 0x0, 0x0, 0x0) ret: 0x0 proc: 276 core: 5 vcore: 2 data: '' then asked for another vcore E [5518933.824460692]-[ 0.000000000] Syscall 38 (vmm_poke_guest):(0x0, 0x0, 0x0, 0x0, 0x0, 0x0) ret: --- proc: 276 core: 9 vcore: 0 data: '' here's the other vcore - doing a poke. this is probably the timer inject thread E [5518933.837985832]-[ 0.000000000] Syscall 101 ( write):(0xf, 0x400001856eff, 0x13, 0x0, 0x0, 0x0) ret: --- proc: 276 core: 5 vcore: 2 data: '0x000000' X [5518933.824460692]-[5518933.851696265] Syscall 38 (vmm_poke_guest):(0x0, 0x0, 0x0, 0x0, 0x0, 0x0) ret: 0x0 proc: 276 core: 9 vcore: 0 data: '' X [5518933.837985832]-[5518933.868614011] Syscall 101 ( write):(0xf, 0x400001856eff, 0x13, 0x0, 0x0, 0x0) ret: 0x13 proc: x276 core: 5 vcore: 2 data: '0x0000' E [5518933.882320368]-[ 0.000000000] Syscall 2 ( block):(0x186a0, 0x0, 0x0, 0x0, 0x0, 0x0) ret: --- proc: 276 core: 9 vcore: 0 data: '' E [5518933.899411003]-[ 0.000000000] Syscall 37 ( pop_ctx):(0x7f7fffa03800, 0x0, 0x0, 0x0, 0x0, 0x0) ret: --- proc: 276 core: 5 vcore: 2 data: '' E [5518933.913292787]-[ 0.000000000] Syscall 13 ( proc_yield):(0x0, 0x0, 0x0, 0x0, 0x0, 0x0) ret: --- proc: 276 core: 9 vcore: 0 data: '' X [5518933.899411003]-[5518933.927781679] Syscall 37 ( pop_ctx):(0x7f7fffa03800, 0x0, 0x0, 0x0, 0x0, 0x0) ret: 0x0 proc: 276 core: 5 vcore: 2 data: '' X [5518933.913292787]-[5518933.941317484] Syscall 13 ( proc_yield):(0x0, 0x0, 0x0, 0x0, 0x0, 0x0) ret: 0x0 proc: 276 core: 9 vcore: 0 data: '' timer thread blocked again, VC yielded, PC 5 went back to running the guest iX [5518933.882320368]-[5518934.013312910] Syscall 2 ( block):(0x186a0, 0x0, 0x0, 0x0, 0x0, 0x0) ret: 0x0 proc: 276 core: 9 vcore: 0 data: '' an errant 'i' in the output. i might have been trying to type "exit\n\n\n", to get out of the monitor and finish the "kill 276". there's a t and \ns below. E [5518934.027196521]-[ 0.000000000] Syscall 101 ( write):(0xf, 0x400001856e0f, 0x13, 0x0, 0x0, 0x0) ret: --- proc: 276 core: 5 vcore: 2 data: '0x002f07' X [5518934.027196521]-[5518934.044111341] Syscall 101 ( write):(0xf, 0x400001856e0f, 0x13, 0x0, 0x0, 0x0) ret: 0x13 proc: 276 core: 5 vcore: 2 data: '0x002f0' E [5518934.061108604]-[ 0.000000000] Syscall 30 ( poke_ksched):(0x0, 0x0, 0x0, 0x0, 0x0, 0x0) ret: --- proc: 276 core: 5 vcore: 2 data: '' X [5518934.061108604]-[5518934.074644789] Syscall 30 ( poke_ksched):(0x0, 0x0, 0x0, 0x0, 0x0, 0x0) ret: 0x0 proc: 276 core: 5 vcore: 2 data: '' E [5518934.074666776]-[ 0.000000000] Syscall 38 (vmm_poke_guest):(0x0, 0x0, 0x0, 0x0, 0x0, 0x0) ret: --- proc: 276 core: 6 vcore: 0 data: '' tE [5518934.088183109]-[ 0.000000000] Syscall 101 ( write):(0xf, 0x400001856eff, 0x13, 0x0, 0x0, 0x0) ret: --- proc: 276 core: 5 vcore: 2 data: '0x00000' X [5518934.074666776]-[5518934.101893311] Syscall 38 (vmm_poke_guest):(0x0, 0x0, 0x0, 0x0, 0x0, 0x0) ret: 0x0 proc: 276 core: 6 vcore: 0 data: '' X [5518934.088183109]-[5518934.118887777] Syscall 101 ( write):(0xf, 0x400001856eff, 0x13, 0x0, 0x0, 0x0) ret: 0x13 proc: 276 core: 5 vcore: 2 data: '0x00000' E [5518934.132586014]-[ 0.000000000] Syscall 2 ( block):(0x186a0, 0x0, 0x0, 0x0, 0x0, 0x0) ret: --- proc: 276 core: 6 vcore: 0 data: '' E [5518934.149588418]-[ 0.000000000] Syscall 37 ( pop_ctx):(0x7f7fffa03800, 0x0, 0x0, 0x0, 0x0, 0x0) ret: --- proc: 276 core: 5 vcore: 2 data: '' E [5518934.163473611]-[ 0.000000000] Syscall 13 ( proc_yield):(0x0, 0x0, 0x0, 0x0, 0x0, 0x0) ret: --- proc: 276 core: 6 vcore: 0 data: '' X [5518934.149588418]-[5518934.177957474] Syscall 37 ( pop_ctx):(0x7f7fffa03800, 0x0, 0x0, 0x0, 0x0, 0x0) ret: 0x0 proc: 276 core: 5 vcore: 2 data: '' X [5518934.163473611]-[5518934.191487899] Syscall 13 ( proc_yield):(0x0, 0x0, 0x0, 0x0, 0x0, 0x0) ret: 0x0 proc: 276 core: 6 vcore: 0 data: '' X [5518934.132586014]-[5518934.263492588] Syscall 2 ( block):(0x186a0, 0x0, 0x0, 0x0, 0x0, 0x0) ret: 0x0 proc: 276 core: 6 vcore: 0 data: '' E [5518934.277377040]-[ 0.000000000] Syscall 101 ( write):(0xf, 0x400001856e0f, 0x13, 0x0, 0x0, 0x0) ret: --- proc: 276 core: 5 vcore: 2 data: '0x002f07' X [5518934.277377040]-[5518934.294298482] Syscall 101 ( write):(0xf, 0x400001856e0f, 0x13, 0x0, 0x0, 0x0) ret: 0x13 proc: 276 core: 5 vcore: 2 data: '0x002f0' E [5518934.311901351]-[ 0.000000000] Syscall 30 ( poke_ksched):(0x0, 0x0, 0x0, 0x0, 0x0, 0x0) ret: --- proc: 276 core: 5 vcore: 2 data: '' E [5518934.320178047]-[ 0.000000000] Syscall 38 (vmm_poke_guest):(0x0, 0x0, 0x0, 0x0, 0x0, 0x0) ret: --- proc: 276 core: 13 vcore: 0 data: '' X [5518934.311901351]-[5518934.325430378] Syscall 30 ( poke_ksched):(0x0, 0x0, 0x0, 0x0, 0x0, 0x0) ret: 0x0 proc: 276 core: 5 vcore: 2 data: '' X [5518934.320178047]-[5518934.339217278] Syscall 38 (vmm_poke_guest):(0x0, 0x0, 0x0, 0x0, 0x0, 0x0) ret: 0x0 proc: 276 core: 13 vcore: 0 data: '' E [5518934.352745834]-[ 0.000000000] Syscall 101 ( write):(0xf, 0x400001856eff, 0x13, 0x0, 0x0, 0x0) ret: --- proc: 276 core: 5 vcore: 2 data: '0x000000' E [5518934.366530580]-[ 0.000000000] Syscall 2 ( block):(0x186a0, 0x0, 0x0, 0x0, 0x0, 0x0) ret: --- proc: 276 core: 13 vcore: 0 data: '' X [5518934.352745834]-[5518934.383440612] Syscall 101 ( write):(0xf, 0x400001856eff, 0x13, 0x0, 0x0, 0x0) ret: 0x13 proc: 276 core: 5 vcore: 2 data: '0x00000' E [5518934.397416981]-[ 0.000000000] Syscall 13 ( proc_yield):(0x0, 0x0, 0x0, 0x0, 0x0, 0x0) ret: --- proc: 276 core: 13 vcore: 0 data: '' E [5518934.414410718]-[ 0.000000000] Syscall 37 ( pop_ctx):(0x7f7fffa03800, 0x0, 0x0, 0x0, 0x0, 0x0) ret: --- proc: 276 core: 5 vcore: 2 data: '' X [5518934.397416981]-[5518934.428022642] Syscall 13 ( proc_yield):(0x0, 0x0, 0x0, 0x0, 0x0, 0x0) ret: 0x0 proc: 276 core: 13 vcore: 0 data: '' X [5518934.414410718]-[5518934.442506898] Syscall 37 ( pop_ctx):(0x7f7fffa03800, 0x0, 0x0, 0x0, 0x0, 0x0) ret: 0x0 proc: 276 core: 5 vcore: 2 data: '' another loop of timerthread done E [5518934.467562753]-[ 0.000000000] Syscall 101 ( write):(0x2, 0x400000558000, 0x1, 0x0, 0x0, 0x0) ret: --- proc: 270 core: 0 vcore: 0 data: '\012' X [5518934.467562753]-[5518934.486022838] Syscall 101 ( write):(0x2, 0x400000558000, 0x1, 0x0, 0x0, 0x0) ret: 0x1 proc: 270 core: 0 vcore: 0 data: '\012' PID 270 here. that's the shell that DB launched. see some TC shit later. X [5518934.366530580]-[5518934.497435556] Syscall 2 ( block):(0x186a0, 0x0, 0x0, 0x0, 0x0, 0x0) ret: 0x0 proc: 276 core: 13 vcore: 0 data: '' VM timerthread waking up E [5518934.500859799]-[ 0.000000000] Syscall 142 ( tcsetattr):(0x0, 0x1, 0x6e08a0, 0x0, 0x0, 0x0) ret: --- proc: 270 core: 0 vcore: 0 data: '' E [5518934.514814507]-[ 0.000000000] Syscall 101 ( write):(0xf, 0x400001856e0f, 0x13, 0x0, 0x0, 0x0) ret: --- proc: 276 core: 5 vcore: 2 data: '0x002f07' doing the usual alarm dance X [5518934.500859799]-[5518934.528766984] Syscall 142 ( tcsetattr):(0x0, 0x1, 0x6e08a0, 0x0, 0x0, 0x0) ret: 0x0 proc: 270 core: 0 vcore: 0 data: '' X [5518934.514814507]-[5518934.545676053] Syscall 101 ( write):(0xf, 0x400001856e0f, 0x13, 0x0, 0x0, 0x0) ret: 0x13 proc: 276 core: 5 vcore: 2 data: '0x002f0' E [5518934.559674711]-[ 0.000000000] Syscall 25 ( notify):(0x114, 0xc, 0x7f7fff9fea80, 0x0, 0x0, 0x0) ret: --- proc: 270 core: 0 vcore: 0 data: '' here's the kill 276 (0x114 == 276, 0xc = EV_POSIX_SIGNAL) E [5518934.576631750]-[ 0.000000000] Syscall 30 ( poke_ksched):(0x0, 0x0, 0x0, 0x0, 0x0, 0x0) ret: --- proc: 276 core: 5 vcore: 2 data: '' VMM 2LS asking for more cores X [5518934.559674711]-[5518934.591290179] Syscall 25 ( notify):(0x114, 0xc, 0x7f7fff9fea80, 0x0, 0x0, 0x0) ret: 0x0 proc: 270 core: 0 vcore: 0 data: '' at this point, the notify has been sent to the VM E [5518934.604827950]-[ 0.000000000] Syscall 38 (vmm_poke_guest):(0x0, 0x0, 0x0, 0x0, 0x0, 0x0) ret: --- proc: 276 core: 2 vcore: 0 data: '' the VMM is running on two pcores. we saw 5 poking, and then pcore 2 just started up. one of them got the POSIX_SIGNAL signal events are a UCQ + INDIR + SPAM_INDIR + IPI, etc. so either PC 2 or 5 got the IPI. probably PC 2 (VC 0), if it was noticed being up yet (racy) X [5518934.576631750]-[5518934.604807318] Syscall 30 ( poke_ksched):(0x0, 0x0, 0x0, 0x0, 0x0, 0x0) ret: 0x0 proc: 276 core: 5 vcore: 2 data: '' PC 5 returned from asking for more VCs E [5518934.619485393]-[ 0.000000000] Syscall 17 ( waitpid):(0xffffffffffffffff, 0x7f7fff9fdd8c, 0x1, 0x0, 0x0, 0x0) ret: --- proc: 270 core: 0 vcore: 0 d' this is something bb/ash does from time to time. E [5518934.646699446]-[ 0.000000000] Syscall 12 (proc_destroy):(0x114, 0xf, 0x0, 0x0, 0x0, 0x0) ret: --- proc: 276 core: 5 vcore: 2 data: '' k, this is the response to the sig handler. looks like PC 5 got the event afterall, decided to kill the process. X [5518934.604827950]-[5518934.633158490] Syscall 38 (vmm_poke_guest):(0x0, 0x0, 0x0, 0x0, 0x0, 0x0) ret: 0x0 proc: 276 core: 2 vcore: 0 data: '' oh, and PC 2 was still trying to IPI/inject to the guest X [5518934.619485393]-[5518934.662916501] Syscall 17 ( waitpid):(0xffffffffffffffff, 0x7f7fff9fdd8c, 0x1, 0x0, 0x0, 0x0) ret: 0xffffffff proc: 270 core: 0 vco' bb/ash finished waiting X [5518934.646699446]-[5518934.676639849] Syscall 12 (proc_destroy):(0x114, 0xf, 0x0, 0x0, 0x0, 0x0) ret: 0x0 proc: 276 core: 5 vcore: 2 data: '' proc_destroy finished. that means we should have closed all of our files, sent RKMs to all of our cores (including our self), and started to aborted all syscs E [5518934.707148418]-[ 0.000000000] Syscall 13 ( proc_yield):(0x0, 0x0, 0x0, 0x0, 0x0, 0x0) ret: --- proc: 272 core: 0 vcore: 0 data: '' X [5518934.707148418]-[5518934.734343251] Syscall 13 ( proc_yield):(0x0, 0x0, 0x0, 0x0, 0x0, 0x0) ret: 0x0 proc: 272 core: 0 vcore: 0 data: '' note that this is process 272, the parent of VMM. it might have been woken up (not shown) then decided to yield. that's all we see. note it is on PC 0 - its an SCP (which is correct) null eptp, gpc was 0xffff800009933ba0 this is the beginning of panic prints, later we see them to be on core 5, when our refcnt is 0. down below, we see more prints, interleaved with other syscalls, and eventually the Invalid Opcode trap (which is the invept) k, so what now? got some refcnt prints in there. but they don't help much, since we know PC2 should have gotten a death message. refcnt was 13 (11 idle, which still seems like 1 too many). 2 more for running (owning and cur_proc on PC 5) 11 is probably ok. i read the blocked syscalls wrong (or timed it poorly). (caught two reads on eventfd) 5 syscalls, 4 alarms, parent, self PID 44 killing self, refcnt pre destroy 14 13 is good. +1 for sys_proc_destroy PID 44 killing self, refcnt post destroy 9 lost 5 refs when we closed FDs. PID 44 killing self, refcnt fin destroy 8 dropped our ref. 8 out there still. what do we think each PC was doing? PC 5: E [5518934.747888412]-[ 0.000000000] Syscall 141 ( tcgetattr):(0x0, 0x7f7fff9fea20, 0x0, 0x0, 0x0, 0x0) ret: --- proc: 272 core: 0 vcore: 0 data: '' null eptp, proc was 0xffff800007ec8d00 X [5518934.747888412]-[5518934.766173783] Syscall 141 ( tcgetattr):(0x0, 0x7f7fff9fea20, 0x0, 0x0, 0x0, 0x0) ret: 0x0 proc: 272 core: 0 vcore: 0 data: '' null eptp, pid was 276 E [5518934.784566228]-[ 0.000000000] Syscall 142 ( tcsetattr):(0x0, 0x0, 0x7f7fff9fea5c, 0x0, 0x0, 0x0) ret: --- proc: 272 core: 0 vcore: 0 data: '' null eptp, PCPU was 0xffff800009933ba0 X [5518934.784566228]-[5518934.801564915] Syscall 142 ( tcsetattr):(0x0, 0x0, 0x7f7fff9fea5c, 0x0, 0x0, 0x0) ret: 0x0 proc: 272 core: 0 vcore: 0 data: '' null eptp, ref was 0 E [5518934.819973976]-[ 0.000000000] Syscall 141 ( tcgetaEtr):(0x0, 0x7f7fff9fdd20, 0x0, 0x0, 0x0, 0x0) ret: --- proc: 27@ring Nanwan's Dungeon on Core 5 (I: type 'help' for a list of commands. 0x0, 0x0) ret: --- proc: 27T core: 0 vcore: 0 data: '' mmands. 0 TRAP frame at 0xfffffff00H [5518934.819973976]-[5518934.851453553] SyscX rax 0xfffffff00010df28 8934.851453553] Syscall 141 ( tcgeta tr):(0x0, 0x7f7fff9fdd20,t rbx 0xffff800009933ba0 0x0, 0x0, 0x0, 0x0) ret: 0x0 proc: 27 core: 0 vcore: 0 data: '0 rcx 0x0000000000000001 ' [5518934.877005159]-[ E rdx 0x000000000000c253 0.000000000] Syscall 142 ( tcseta tr):(0x0, 0x1, 0x7f7fff9ft rbp 0xfffffff00010df58 dd20, 0x0, 0x0, 0x0) ret: --- proc: 27 core: 0 vcore: 0 data: '0 rsi 0x0000000000000780 ' [5518934.877005159]-[551X rdi 0x000000000000000a 8934.900222775] Syscall 142 ( tcseta tr):(0x0, 0x1, 0x7f7fff9ft r8 0xffffffffc7cc8d00 dd20, 0x0, 0x0, 0x0) ret: 0x0 proc: 27 core: 0 vcore: 0 data: '0 r9 0x00000000000137e0 ' [5518934.923459879]-[ E r10 0xffffffffc7cc8c60 0.000000000] Syscall 117 ( get wd):(0x1000000053f0, 0xc0c r11 0xffffffffc7cc8c20 , 0x0, 0x0, 0x0, 0x0) ret: --- proc: 2 2 core: 0 vcore: 0 data: 7 r12 0xffffffffc7b87bc8 '' [5518934.923459879]-[551X r13 0xfffffff00010df28 8934.946767566] Syscall 117 ( get wd):(0x1000000053f0, 0xc0c r14 0x00000000ffffffff , 0x0, 0x0, 0x0, 0x0) ret: 0x0 proc: 2 2 core: 0 vcore: 0 data: 7 r15 0x0000000000000000 '' r5518934.970098414]-[ E trap 0x00000006 Invalid Opcode 0000000] Syscall 101 ( wr te):(0x1, 0x400000353000, 0x4, 0i gsbs 0xffffffffc7ccec00 0x4, 0x0, 0x0, 0x0) ret: --- proc: 27 core: 0 vcore: 0 data: '2 fsbs 0x0000000000000000 / $ ' [5518934.970098414]-[551X err 0x--------00000000 8934.994264093] Syscall 101 ( wr te):(0x1, 0x400000353000,i rip 0xffffffffc21360ab 0x4, 0x0, 0x0, 0x0) ret: 0x4 proc: 27 core: 0 vcore: 0 data: '2 cs 0x------------0008 / $ ' c5518935.017852056]-[ E flag 0x0000000000010003 0.000000000] Syscall 104 ( fs at):(0x0, 0x7f7fff9fe600,t rsp 0xfffffff00010df28 0x0, 0x0, 0x0, 0x0) ret: --- proc: 27 core: 0 vcore: 0 data: '2 ss 0x------------0010 ' [5518935.017852056]-[551XOS(Core 5)> 7852056]-[5518935.041055433] Syscall 104 ( fsRat):(0x0, 0xtat):(0x0, 0x7f7fff9fe600, 0x0, 0x0, 0x0, 0x0) ret: 0x0 proc7 2 core: 0 vcore: 0 data: '' 2 [5518935.059972424]-[ 0.000000000]E [5518935.059972424]-[ 0.000000000] Syscall 101 ( write):(0xe, 0x4000019a8d80, 0x4, 0x0, 0x0, 0x0) ret: --- pr' X [5518935.059972424]-[5518935.078783031] Syscall 101 ( wrXte):(0xe, 0x4000019a8d80, 0x4, 0x0, 0x0, 0x0) ret: 0x4 proc: 27@Core 5)> ite):(0xe, 0x4000019a8d80' E [5518935.101344461]-[ 0.000000000] Syscall 100 ( read):(0x0, 0x7f7fff9fea11, 0x1, 0x0, 0x0, 0x0) ret: --- proc: 27 2 core: 0 vcore: 0 data: '' 2 c5518935.116454475]-[ 0.000000000]E [5518935.116454475]-[ 0.000000000] Syscall 100 ( read):(0xa, 0x4000019a8d80, 0x200, 0x0, 0x0, 0x0) ret: --- ' E [5518935.135091954]-[ 0.000000000] Syscall 13 ( proc_yield):(0x0, 0x0, 0x0, 0x0, 0x0, 0x0) ret: --- proc: 272 core: 0 v core: 0 data: '' co[5518935.135091954]-[5518935X [5518935.135091954]-[5518935.149246089] Syscall 13 ( proc_yield):(0x0, 0x0, 0x0, 0x0, 0x0, 0x0) ret: 0x0 proc: 272 core: 0 vcore:' E [5518935.165805826]-[ 0.000000000] Syscall 31 ( abort_sysc):(0x7f7fff9fe760, 0x0, 0x0, 0x0, 0x0, 0x0) ret: --- proc: 27 1 core: 0 vcore: 0 data: '' 1 [5518935.165805826]-[5518935.180912680]X [5518935.165805826]-[5518935.180912680] Syscall 31 ( abort_sysc):(0x7f7fff9fe760, 0x0, 0x0, 0x0, 0x0, 0x0) ret: 0x1 pr' E [5518935.199376625]-[ 0.000000000] Syscall 101 ( write):(0x2, 0x400000558000, 0xa, 0x0, 0x0, 0x0) ret: --- proc: 270 core: 0 vcore: 0 data: 'bash-4.3$' bash-4.3$ ROS(Core 5)> ROS(Core 5)> X [5518935.199376625]-[5518935.216480420] Syscall 101 ( write):(0x2, 0x400000558000, 0xa, 0x0, 0x0, 0x0) ret: 0xa proc: 2' E [5518935.234680557]-[ 0.000000000] Syscall 100 ( read):(0x0, 0x7f7fff9fdd2f, 0x1, 0x0, 0x0, 0x0) ret: --- proc: 27 0 core: 0 vcore: 0 data: '' 0 [5518935.234680557]-[5518935.249791870]X [5518935.234680557]-[5518935.249791870] Syscall 100 ( read):(0x0, 0x7f7fff9fdd2f, 0x1, 0x0, 0x0, 0x0) ret: 0x1 pr' E [5518935.268608194]-[ 0.000000000] Syscall 100 ( read):(0x4, 0x7f7fff9fe98f, 0x1, 0x0, 0x0, 0x0) ret: --- proc: 27 1 core: 0 vcore: 0 data: '' 1 [5518935.268608194]-[5518935.283717811]X [5518935.268608194]-[5518935.283717811] Syscall 100 ( read):(0x4, 0x7f7fff9fe98f, 0x1, 0x0, 0x0, 0x0) ret: 0xffff' E [5518935.303484443]-[ 0.000000000] Syscall 101 ( write):(0x2, 0x400000558000, 0x1, 0x0, 0x0, 0x0) ret: --- proc: 27 0 core: 0 vcore: 0 data: '\012' 0 core: 0 vcore: 0 data: '\012' ROS(Core 5)> X [5518935.303484443]-[5518935.323968799] Syscall 101 ( write):(0x2, 0x400000558000, 0x1, 0x0, 0x0, 0x0) ret: 0x1 proc: 270 core: 0 vcore: 0 data: '\012' E [5518935.338810560]-[ 0.000000000] Syscall 142 ( tcsetattr):(0x0, 0x1, 0x6e08a0, 0x0, 0x0, 0x0) ret: --- proc: 270 core: 0 vcore: 0 data: '' X [5518935.338810560]-[5518935.352773778] Syscall 142 ( tcsetattr):(0x0, 0x1, 0x6e08a0, 0x0, 0x0, 0x0) ret: 0x0 proc: 270 core: 0 vcore: 0 data: '' E [5518935.366748239]-[ 0.000000000] Syscall 100 ( read):(0x6, 0x1000000187a8, 0x10, 0x0, 0x0, 0x0) ret: --- proc: 271 core: 0 vcore: 0 data: '' X [5518935.366748239]-[5518935.381328778] Syscall 100 ( read):(0x6, 0x1000000187a8, 0x10, 0x0, 0x0, 0x0) ret: 0xffffffffffffffff proc: 271 core: 0 vcore: 0 ' E [5518935.397648877]-[ 0.000000000] Syscall 17 ( waitpid):(0xffffffffffffffff, 0x7f7fff9fdd8c, 0x1, 0x0, 0x0, 0x0) ret: --- proc: 270 core: 0 vcore: 0 d' X [5518935.397648877]-[5518935.413874984] Syscall 17 ( waitpid):(0xffffffffffffffff, 0x7f7fff9fdd8c, 0x1, 0x0, 0x0, 0x0) ret: 0xffffffff proc: 270 core: 0 vco' E [5518935.430723542]-[ 0.000000000] Syscall 141 ( tcgetattr):(0x0, 0x7f7fff9fdd20, 0x0, 0x0, 0x0, 0x0) ret: --- proc: 270 core: 0 vcore: 0 data: '' X [5518935.430723542]-[5518935.445212738] Syscall 141 ( tcgetattr):(0x0, 0x7f7fff9fdd20, 0x0, 0x0, 0x0, 0x0) ret: 0x0 proc: 270 core: 0 vcore: 0 data: '' E [5518935.459695904]-[ 0.000000000] Syscall 142 ( tcsetattr):(0x0, 0x1, 0x7f7fff9fdd20, 0x0, 0x0, 0x0) ret: --- proc: 270 core: 0 vcore: 0 data: '' X [5518935.459695904]-[5518935.474178990] Syscall 142 ( tcsetattr):(0x0, 0x1, 0x7f7fff9fdd20, 0x0, 0x0, 0x0) ret: 0x0 proc: 270 core: 0 vcore: 0 data: '' E [5518935.488667105]-[ 0.000000000] Syscall 100 ( read):(0xd, 0x10000000da91, 0x3ff7, 0x0, 0x0, 0x0) ret: --- proc: 271 core: 0 vcore: 0 data: '' X [5518935.488667105]-[5518935.503416746] Syscall 100 ( read):(0xd, 0x10000000da91, 0x3ff7, 0x0, 0x0, 0x0) ret: 0x4 proc: 271 core: 0 vcore: 0 data: '/ $ ' E [5518935.518959357]-[ 0.000000000] Syscall 101 ( write):(0x2, 0x400000558000, 0xa, 0x0, 0x0, 0x0) ret: --- proc: 270 core: 0 vcore: 0 data: 'bash-4.3$' bash-4.3$ X [5518935.518959357]-[5518935.535475271] Syscall 101 ( write):(0x2, 0x400000558000, 0xa, 0x0, 0x0, 0x0) ret: 0xa proc: 270 core: 0 vcore: 0 data: ' E [5518935.551424483]-[ 0.000000000] Syscall 100 ( read):(0x0, 0x7f7fff9fdd2f, 0x1, 0x0, 0x0, 0x0) ret: --- proc: 270 core: 0 vcore: 0 data: '' X [5518935.551424483]-[5518935.565917718] Syscall 100 ( read):(0x0, 0x7f7fff9fdd2f, 0x1, 0x0, 0x0, 0x0) ret: 0x1 proc: 270 core: 0 vcore: 0 data: '\012' E [5518935.580752716]-[ 0.000000000] Syscall 101 ( write):(0x2, 0x400000558000, 0x1, 0x0, 0x0, 0x0) ret: --- proc: 270 core: 0 vcore: 0 data: '\012' X [5518935.580752716]-[5518935.596200654] Syscall 101 ( write):(0x2, 0x400000558000, 0x1, 0x0, 0x0, 0x0) ret: 0x1 proc: 270 core: 0 vcore: 0 data: '\012' E [5518935.611036352]-[ 0.000000000] Syscall 142 ( tcsetattr):(0x0, 0x1, 0x6e08a0, 0x0, 0x0, 0x0) ret: --- proc: 270 core: 0 vcore: 0 data: '' X [5518935.611036352]-[5518935.625000363] Syscall 142 ( tcsetattr):(0x0, 0x1, 0x6e08a0, 0x0, 0x0, 0x0) ret: 0x0 proc: 270 core: 0 vcore: 0 data: '' E [5518935.638974329]-[ 0.000000000] Syscall 17 ( waitpid):(0xffffffffffffffff, 0x7f7fff9fdd8c, 0x1, 0x0, 0x0, 0x0) ret: --- proc: 270 core: 0 vcore: 0 d' X [5518935.638974329]-[5518935.655195625] Syscall 17 ( waitpid):(0xffffffffffffffff, 0x7f7fff9fdd8c, 0x1, 0x0, 0x0, 0x0) ret: 0xffffffff proc: 270 core: 0 vco' E [5518935.672036076]-[ 0.000000000] Syscall 141 ( tcgetattr):(0x0, 0x7f7fff9fdd20, 0x0, 0x0, 0x0, 0x0) ret: --- proc: 270 core: 0 vcore: 0 data: '' X [5518935.672036076]-[5518935.686515827] Syscall 141 ( tcgetattr):(0x0, 0x7f7fff9fdd20, 0x0, 0x0, 0x0, 0x0) ret: 0x0 proc: 270 core: 0 vcore: 0 data: '' E [5518935.701011106]-[ 0.000000000] Syscall 142 ( tcsetattr):(0x0, 0x1, 0x7f7fff9fdd20, 0x0, 0x0, 0x0) ret: --- proc: 270 core: 0 vcore: 0 data: '' X [5518935.701011106]-[5518935.715495080] Syscall 142 ( tcsetattr):(0x0, 0x1, 0x7f7fff9fdd20, 0x0, 0x0, 0x0) ret: 0x0 proc: 270 core: 0 vcore: 0 data: '' E [5518935.730014422]-[ 0.000000000] Syscall 101 ( write):(0x6, 0x1000000188c8, 0x40, 0x0, 0x0, 0x0) ret: --- proc: 271 core: 0 vcore: 0 data: '}\000YW\' X [5518935.730014422]-[5518935.761607260] Syscall 101 ( write):(0x6, 0x1000000188c8, 0x40, 0x0, 0x0, 0x0) ret: 0x40 proc: 271 core: 0 vcore: 0 data: '}\000YW' E [5518935.793312557]-[ 0.000000000] Syscall 101 ( write):(0x2, 0x400000558000, 0xa, 0x0, 0x0, 0x0) ret: --- proc: 270 core: 0 vcore: 0 data: 'bash-4.3$' bash-4.3$ X [5518935.793312557]-[5518935.809826475] Syscall 101 ( write):(0x2, 0x400000558000, 0xa, 0x0, 0x0, 0x0) ret: 0xa proc: 270 core: 0 vcore: 0 data: ' E [5518935.825766138]-[ 0.000000000] Syscall 100 ( read):(0x0, 0x7f7fff9fdd2f, 0x1, 0x0, 0x0, 0x0) ret: --- proc: 270 core: 0 vcore: 0 data: '' X [5518935.825766138]-[5518935.840251689] Syscall 100 ( read):(0x0, 0x7f7fff9fdd2f, 0x1, 0x0, 0x0, 0x0) ret: 0x1 proc: 270 core: 0 vcore: 0 data: '\012' E [5518935.855087191]-[ 0.000000000] Syscall 101 ( write):(0x2, 0x400000558000, 0x1, 0x0, 0x0, 0x0) ret: --- proc: 270 core: 0 vcore: 0 data: '\012' X [5518935.855087191]-[5518935.870532152] Syscall 101 ( write):(0x2, 0x400000558000, 0x1, 0x0, 0x0, 0x0) ret: 0x1 proc: 270 core: 0 vcore: 0 data: '\012' E [5518935.885367421]-[ 0.000000000] Syscall 104 ( fstat):(0x4, 0x7f7fff9fe8b0, 0x0, 0x0, 0x0, 0x0) ret: --- proc: 271 core: 0 vcore: 0 data: '' X [5518935.885367421]-[5518935.899855854] Syscall 104 ( fstat):(0x4, 0x7f7fff9fe8b0, 0x0, 0x0, 0x0, 0x0) ret: 0x0 proc: 271 core: 0 vcore: 0 data: '' E [5518935.914346588]-[ 0.000000000] Syscall 104 ( fstat):(0x6, 0x7f7fff9fe8b0, 0x0, 0x0, 0x0, 0x0) ret: --- proc: 271 core: 0 vcore: 0 data: '' X [5518935.914346588]-[5518935.928839820] Syscall 104 ( fstat):(0x6, 0x7f7fff9fe8b0, 0x0, 0x0, 0x0, 0x0) ret: 0x0 proc: 271 core: 0 vcore: 0 data: '' E [5518935.943337892]-[ 0.000000000] Syscall 104 ( fstat):(0xd, 0x7f7fff9fe8b0, 0x0, 0x0, 0x0, 0x0) ret: --- proc: 271 core: 0 vcore: 0 data: '' X [5518935.943337892]-[5518935.957827629] Syscall 104 ( fstat):(0xd, 0x7f7fff9fe8b0, 0x0, 0x0, 0x0, 0x0) ret: 0x0 proc: 271 core: 0 vcore: 0 data: '' E [5518935.972310629]-[ 0.000000000] Syscall 142 ( tcsetattr):(0x0, 0x1, 0x6e08a0, 0x0, 0x0, 0x0) ret: --- proc: 270 core: 0 vcore: 0 data: '' X [5518935.972310629]-[5518935.986267744] Syscall 142 ( tcsetattr):(0x0, 0x1, 0x6e08a0, 0x0, 0x0, 0x0) ret: 0x0 proc: 270 core: 0 vcore: 0 data: '' E [5518936.000254923]-[ 0.000000000] Syscall 2 ( block):(0x5f8df80, 0x100000002430, 0x7f7fff9fe760, 0x0, 0x7f7fff9fe760, 0x0) ret: --- proc: 271 core:' E [5518936.017614094]-[ 0.000000000] Syscall 17 ( waitpid):(0xffffffffffffffff, 0x7f7fff9fdd8c, 0x1, 0x0, 0x0, 0x0) ret: --- proc: 270 core: 0 vcore: 0 d' X [5518936.017614094]-[5518936.033850018] Syscall 17 ( waitpid):(0xffffffffffffffff, 0x7f7fff9fdd8c, 0x1, 0x0, 0x0, 0x0) ret: 0xffffffff proc: 270 core: 0 vco' E [5518936.050696334]-[ 0.000000000] Syscall 141 ( tcgetattr):(0x0, 0x7f7fff9fdd20, 0x0, 0x0, 0x0, 0x0) ret: --- proc: 270 core: 0 vcore: 0 data: '' X [5518936.050696334]-[5518936.065183237] Syscall 141 ( tcgetattr):(0x0, 0x7f7fff9fdd20, 0x0, 0x0, 0x0, 0x0) ret: 0x0 proc: 270 core: 0 vcore: 0 data: '' E [5518936.079670791]-[ 0.000000000] Syscall 142 ( tcsetattr):(0x0, 0x1, 0x7f7fff9fdd20, 0x0, 0x0, 0x0) ret: --- proc: 270 core: 0 vcore: 0 data: '' X [5518936.079670791]-[5518936.094152716] Syscall 142 ( tcsetattr):(0x0, 0x1, 0x7f7fff9fdd20, 0x0, 0x0, 0x0) ret: 0x0 proc: 270 core: 0 vcore: 0 data: '' E [5518936.108641989]-[ 0.000000000] Syscall 13 ( proc_yield):(0x0, 0x0, 0x0, 0x0, 0x0, 0x0) ret: --- proc: 271 core: 0 vcore: 0 data: '' X [5518936.108641989]-[5518936.122171235] Syscall 13 ( proc_yield):(0x0, 0x0, 0x0, 0x0, 0x0, 0x0) ret: 0x0 proc: 271 core: 0 vcore: 0 data: '' E [5518936.135710485]-[ 0.000000000] Syscall 101 ( write):(0x2, 0x400000558000, 0xa, 0x0, 0x0, 0x0) ret: --- proc: 270 core: 0 vcore: 0 data: 'bash-4.3$' bash-4.3$ X [5518936.135710485]-[5518936.152201610] Syscall 101 ( write):(0x2, 0x400000558000, 0xa, 0x0, 0x0, 0x0) ret: 0xa proc: 270 core: 0 vcore: 0 data: ' E [5518936.168133443]-[ 0.000000000] Syscall 100 ( read):(0x0, 0x7f7fff9fdd2f, 0x1, 0x0, 0x0, 0x0) ret: --- proc: 270 core: 0 vcore: 0 data: '' E [5518936.182623493]-[ 0.000000000] Syscall 13 ( proc_yield):(0x0, 0x0, 0x0, 0x0, 0x0, 0x0) ret: --- proc: 270 core: 0 vcore: 0 data: '' X [5518936.182623493]-[5518936.196158224] Syscall 13 ( proc_yield):(0x0, 0x0, 0x0, 0x0, 0x0, 0x0) ret: 0x0 proc: 270 core: 0 vcore: 0 data: '' ROS(Core 5)> refcnts: Program name: vmrunkernel PID: 274 PPID: 270 State: WAITING (0x0000000000000008) Is an MCP Refcnt: 11 Open Files: FD: 00, Chan flags: 0x0000000000000001, pathname: #pipe./data1, ref: 8, Dev: pipe, Devinfo: Qdata1, ID 5, tapped, rq len 0, wq len 0 FD: 01, Chan flags: 0x0000000000000001, pathname: #pipe./data1, ref: 8, Dev: pipe, Devinfo: Qdata1, ID 5, tapped, rq len 0, wq len 0 FD: 02, Chan flags: 0x0000000000000001, pathname: #pipe./data1, ref: 8, Dev: pipe, Devinfo: Qdata1, ID 5, tapped, rq len 0, wq len 0 FD: 03, Chan flags: 0x0000000000080001, pathname: #alarm./clone, ref: 1, Dev: alarm, Devinfo: Id 0, tapped, expires 12345, period 0, count 0 FD: 04, Chan flags: 0x0000000000080001, pathname: #alarm./a0/timer, ref: 2, Dev: alarm, Devinfo: Id 0, tapped, expires 12345, period 0, count 0 FD: 05, Chan flags: 0x0000000000008001, pathname: #pipe., ref: 1, Dev: pipe, Devinfo: Qdir, ID 12 FD: 06, Chan flags: 0x0000000000080001, pathname: #alarm./clone, ref: 1, Dev: alarm, Devinfo: Id 1, tapped, expires 13041036611853105, period 0, count 0 FD: 07, Chan flags: 0x0000000000080001, pathname: #alarm./a1/timer, ref: 2, Dev: alarm, Devinfo: Id 1, tapped, expires 13041036611853105, period 0, count 0 FD: 08, Chan flags: 0x0000000000008001, pathname: #pipe., ref: 3, Dev: pipe, Devinfo: Qdir, ID 5 FD: 09, Chan flags: 0x0000000000000801, pathname: #pipe./data, ref: 1, Dev: pipe, Devinfo: Qdata0, ID 12, untapped, rq len 0, wq len 2804 FD: 10, Chan flags: 0x0000000000080001, pathname: #alarm./clone, ref: 1, Dev: alarm, Devinfo: Id 2, tapped, expires 13041002838964331, period 0, count 0 FD: 11, Chan flags: 0x0000000000100000, pathname: #srv./snoop-274, ref: 1, Dev: srv, Devinfo: qid.path: 0x0000000000000002, qid.type: 01 FD: 12, Chan flags: 0x0000000000008001, pathname: #pipe., ref: 3, Dev: pipe, Devinfo: Qdir, ID 6 FD: 13, Chan flags: 0x0000000000080001, pathname: #alarm./clone, ref: 1, Dev: alarm, Devinfo: Id 3, tapped, expires 13041036851838980, period 0, count 0 FD: 14, Chan flags: 0x0000000000000801, pathname: /net/tcp/2/data, ref: 2, Dev: ip, Devinfo: Qdata, tapped, proto tcp, conv idx 2, rq len 0, wq len 0 FD: 15, Chan flags: 0x0000000000080001, pathname: #alarm./a2/timer, ref: 2, Dev: alarm, Devinfo: Id 2, tapped, expires 13041002838964331, period 0, count 0 FD: 16, Chan flags: 0x0000000000080001, pathname: #alarm./a3/timer, ref: 2, Dev: alarm, Devinfo: Id 3, tapped, expires 13041036851838980, period 0, count 0 FD: 17, Chan flags: 0x0000000000000001, pathname: #eventf/efd, ref: 1, Dev: eventfd, Devinfo: QID type efd, flags 0x0000000000000000, counter 0x000000000003 FD: 18, Chan flags: 0x0000000000000001, pathname: #eventf/efd, ref: 2, Dev: eventfd, Devinfo: QID type efd, flags 0x0000000000000000, counter 0x000000000000 FD: 19, Chan flags: 0x0000000000000001, pathname: #eventf/efd, ref: 1, Dev: eventfd, Devinfo: QID type efd, flags 0x0000000000000000, counter 0x000000000000 FD: 20, Chan flags: 0x0000000000000001, pathname: #eventf/efd, ref: 2, Dev: eventfd, Devinfo: QID type efd, flags 0x0000000000000000, counter 0x000000000000 Children: (PID (struct proc *)) which refs should we have? 4 syscalls: (refs) WRONG - saw 5 syscalls ----------- read on FD 0 read on FD 18 block 100 ms block 30 sec 4 #alarms (ID 0, 1, 2, 3) parent ksched find_first_kid in #cons Who's doing the decrefs? 76 killing self, refcnt pre destroy 14 13 + 1 for proc_destroy now we called proc_destroy. Core 1 about to decref PID 276's ref, was 13 core 1, 13->12 Core 0 about to decref PID 276's ref, was 14 core 0 did it first, 14 -> 13 one was the alarm, the other the MCP ksched destroy was closing FDs, should be core 1. so core 0 must have gotten an RKM k, so the ksched saw us. since it's an RKM and on core 0, it looks like a timer tick went off while we were dying. Stack Backtrace on Core 1: #01 [<0xffffffffc204f940>] in proc_decref #02 [<0xffffffffc20fc540>] in alarm_release #03 [<0xffffffffc203cf58>] in chan_release #04 [<0xffffffffc203c8ab>] in kref_put #05 [<0xffffffffc200a5c5>] in tap_min_release #06 [<0xffffffffc205f4ab>] in kref_put #07 [<0xffffffffc2063e32>] in close_fdt #08 [<0xffffffffc2051451>] in proc_destroy #09 [<0xffffffffc205a27c>] in sys_proc_destroy #10 [<0xffffffffc205c801>] in syscall #11 [<0xffffffffc205caf8>] in run_local_syscall #12 [<0xffffffffc2131b7a>] in sysenter_callwrapper 1 alarm # manually constructed this, from core 0 (interleaved Stack Backtrace on Core 0: #01 [<0xffffffffc204f940>] in proc_decref #02 [<0xffffffffc2054892>] in __run_mcp_ksched #03 [<0xffffffffc2003995>] in poke #04 [<0xffffffffc2054e12>] in run_scheduler #05 [<0xffffffffc2054e59>] in __ksched_tick #06 [<0xffffffffc20000c4>] in __run_awaiter #07 [<0xffffffffc205d8ef>] in process_routine_kmsg #08 [<0xffffffffc2056e63>] in __smp_idle Core 1 about to decref PID 276's ref, was 12 Stack Backtrace on Core 1: #01 [<0xffffffffc204f940>] in proc_decref #02 [<0xffffffffc20fc540>] in alarm_release #03 [<0xffffffffc203cf58>] in chan_release #04 [<0xffffffffc203c8ab>] in kref_put #05 [<0xffffffffc200a5c5>] in tap_min_release #06 [<0xffffffffc205f4ab>] in kref_put #07 [<0xffffffffc2063e32>] in close_fdt #08 [<0xffffffffc2051451>] in proc_destroy #09 [<0xffffffffc205a27c>] in sys_proc_destroy #10 [<0xffffffffc205c801>] in syscall #11 [<0xffffffffc205caf8>] in run_local_syscall #12 [<0xffffffffc2131b7a>] in sysenter_callwrapper 2 alarms Core 1 about to decref PID 276's ref, was 11 Stack Backtrace on Core 1: #01 [<0xffffffffc204f940>] in proc_decref #02 [<0xffffffffc20fc540>] in alarm_release #03 [<0xffffffffc203cf58>] in chan_release #04 [<0xffffffffc203c8ab>] in kref_put #05 [<0xffffffffc200a5c5>] in tap_min_release tap - the alarm was tapped. closing the FD closes the tap, which closes its chan. since closing the tap happens after the FD chan, tapped FDs should close like this. #06 [<0xffffffffc205f4ab>] in kref_put #07 [<0xffffffffc2063e32>] in close_fdt #08 [<0xffffffffc2051451>] in proc_destroy #09 [<0xffffffffc205a27c>] in sys_proc_destroy #10 [<0xffffffffc205c801>] in syscall #11 [<0xffffffffc205caf8>] in run_local_syscall #12 [<0xffffffffc2131b7a>] in sysenter_callwrapper 3 alarms Core 1 about to decref PID 276's ref, was 10 Stack Backtrace on Core 1: #01 [<0xffffffffc204f940>] in proc_decref #02 [<0xffffffffc20fc540>] in alarm_release #03 [<0xffffffffc203cf58>] in chan_release #04 [<0xffffffffc203c8ab>] in kref_put #05 [<0xffffffffc200a5c5>] in tap_min_release #06 [<0xffffffffc205f4ab>] in kref_put #07 [<0xffffffffc2063e32>] in close_fdt #08 [<0xffffffffc2051451>] in proc_destroy #09 [<0xffffffffc205a27c>] in sys_proc_destroy #10 [<0xffffffffc205c801>] in syscall #11 [<0xffffffffc205caf8>] in run_local_syscall #12 [<0xffffffffc2131b7a>] in sysenter_callwrapper 4 alarms closed. plus ksched. down to 9 (from 14). Core 1 about to decref PID 276's ref, was 9 Stack Backtrace on Core 1: #01 [<0xffffffffc204f940>] in proc_decref #02 [<0xffffffffc2051474>] in proc_destroy #03 [<0xffffffffc205a27c>] in sys_proc_destroy #04 [<0xffffffffc205c801>] in syscall #05 [<0xffffffffc205caf8>] in run_local_syscall #06 [<0xffffffffc2131b7a>] in sysenter_callwrapper wtf is this decref? looks like sched_proc_destroy. (that #2 in proc_destroy is right after __sched_proc_destroy, before signal_parent) yeah, that calls proc_decref right at the end. but we already closed the ksched ref... looks like we have two decrefs in the ksched. the comments say that shouldn't happen, but it looks like it does. let's see the others real quick for the race, you'd need to proc_destroy yourself as a running MCP why does the VM trigger it every time? is it because of all of the FDs open? (the race is from setting DYING to locking the ksched, which is increased by the number and complexity of open files (more tapped files, etc) - that makes it more likely since this actually isn't it, it might just be a red herring. wait - this is OK. that decref we saw was from the MCP ksched, but the ref wasn't the ksched's ref, it was the one we grabbed 10 lines up which wasn't printed. we didn't see the incref for that though. PID 276 killing self, refcnt post destroy 8 Core 1 about to decref PID 276's ref, was 8 Stack Backtrace on Core 1: #01 [<0xffffffffc204f940>] in proc_decref #02 [<0xffffffffc205a291>] in sys_proc_destroy #03 [<0xffffffffc205c801>] in syscall #04 [<0xffffffffc205caf8>] in run_local_syscall #05 [<0xffffffffc2131b7a>] in sysenter_callwrapper this was the ref in sys_proc_destroy PID 276 killing self, refcnt fin destroy 7 PID 276 killing self, refcnt wait destroy 7 PID 276 killing self, refcnt wait destroy 7 PID 276 killing self, refcnt wait destroy 7 PID 276 killing self, refcnt wait destroy 7 PID 276 killing self, refcnt wait destroy 7 2 for my core, 5 syscalls, parent. whoops. Core 1 about to decref PID 276's ref, was 7 Stack Backtrace on Core 1: #01 [<0xffffffffc204f940>] in proc_decref #02 [<0xffffffffc205d8ef>] in process_routine_kmsg #03 [<0xffffffffc2051735>] in proc_restartcore in a kmsg. should be __death, clearing owning_proc Core 1 about to decref PID 276's ref, was 6 Stack Backtrace on Core 1: #01 [<0xffffffffc204f940>] in proc_decref #02 [<0xffffffffc2018e89>] in restart_kthread #03 [<0xffffffffc2018eef>] in __launch_kthread #04 [<0xffffffffc205d8ef>] in process_routine_kmsg #05 [<0xffffffffc2051735>] in proc_restartcore this looks like an aborted syscall (5 of them) Core 1 about to decref PID 276's ref, was 5 Stack Backtrace on Core 1: #01 [<0xffffffffc204f940>] in proc_decref #02 [<0xffffffffc2018e89>] in restart_kthread #03 [<0xffffffffc2018eef>] in __launch_kthread #04 [<0xffffffffc205d8ef>] in process_routine_kmsg #05 [<0xffffffffc2051735>] in proc_restartcore Core 1 about to decref PID 276's ref, was 4 Stack Backtrace on Core 1: #01 [<0xffffffffc204f940>] in proc_decref #02 [<0xffffffffc2018e89>] in restart_kthread #03 [<0xffffffffc2018eef>] in __launch_kthread #04 [<0xffffffffc205d8ef>] in process_routine_kmsg #05 [<0xffffffffc2051735>] in proc_restartcore Core 1 about to decref PID 276's ref, was 3 Stack Backtrace on Core 1: #01 [<0xffffffffc204f940>] in proc_decref #02 [<0xffffffffc2018e89>] in restart_kthread #03 [<0xffffffffc2018eef>] in __launch_kthread #04 [<0xffffffffc205d8ef>] in process_routine_kmsg #05 [<0xffffffffc2051735>] in proc_restartcore Core 1 about to decref PID 276's ref, was 2 Stack Backtrace on Core 1: #01 [<0xffffffffc204f940>] in proc_decref #02 [<0xffffffffc2018e38>] in restart_kthread #03 [<0xffffffffc2018eef>] in __launch_kthread #04 [<0xffffffffc205d8ef>] in process_routine_kmsg #05 [<0xffffffffc2051735>] in proc_restartcore Core 1 about to decref PID 276's ref, was 1 Stack Backtrace on Core 1: #01 [<0xffffffffc204f940>] in proc_decref #02 [<0xffffffffc2050134>] in __proc_disown_child #03 [<0xffffffffc2059bba>] in try_wait.isra.4 #04 [<0xffffffffc2059c33>] in try_wait_any.isra.6 #05 [<0xffffffffc2059d9b>] in sys_waitpid #06 [<0xffffffffc205c801>] in syscall #07 [<0xffffffffc205caf8>] in run_local_syscall #08 [<0xffffffffc2131b7a>] in sysenter_callwrapper this is the parent. ok, let's try again: PID 272 core 6 killing self, refcnt pre destroy 14 bash-4.3$ 14 refs, sounds right normally. 5 syscalls, 4 alarms, parent, ksched, 2 for core 6, one for sys_proc_destroy. assuming the MCP sched isn't running. Core 6 about to decref PID 272's ref, was 14 Stack Backtrace on Core 6: #01 [<0xffffffffc204f9d2>] in proc_decref #02 [<0xffffffffc20fc5d0>] in alarm_release #03 [<0xffffffffc203cf58>] in chan_release #04 [<0xffffffffc203c8ab>] in kref_put #05 [<0xffffffffc200a5c5>] in tap_min_release #06 [<0xffffffffc205f53b>] in kref_put #07 [<0xffffffffc2063ec2>] in close_fdt #08 [<0xffffffffc20514d1>] in proc_destroy #09 [<0xffffffffc205a2fc>] in sys_proc_destroy #10 [<0xffffffffc205c891>] in syscall #11 [<0xffffffffc205cb88>] in run_local_syscall #12 [<0xffffffffc2131c0a>] in sysenter_callwrapper 1 alarm Core 0 about to incref PID 272's ref, was 13 Stack Backtrace on Core 0: #01 [<0xffffffffc204f01f>] in proc_incref #02 [<0xffffffffc2054613>] in __run_mcp_ksched #03 [<0xffffffffc2003995>] in poke #04 [<0xffffffffc2054e92>] in run_scheduler #05 [<0xffffffffc2054ed9>] in __ksched_tick #06 [<0xffffffffc20000c4>] in __run_awaiter #07 [<0xffffffffc205d97f>] in process_routine_kmsg #08 [<0xffffffffc2056ee3>] in __smp_idle incref in mcp ksched. back up to 14. Core 6 about to decref PID 272's ref, was 14 Stack Backtrace on Core 6: #01 [<0xffffffffc204f9d2>] in proc_decref #02 [<0xffffffffc20fc5d0>] in alarm_release #03 [<0xffffffffc203cf58>] in chan_release #04 [<0xffffffffc203c8ab>] in kref_put #05 [<0xffffffffc200a5c5>] in tap_min_release #06 [<0xffffffffc205f53b>] in kref_put #07 [<0xffffffffc2063ec2>] in close_fdt #08 [<0xffffffffc20514d1>] in proc_destroy #09 [<0xffffffffc205a2fc>] in sys_proc_destroy #10 [<0xffffffffc205c891>] in syscall #11 [<0xffffffffc205cb88>] in run_local_syscall #12 [<0xffffffffc2131c0a>] in sysenter_callwrapper 2 alarm Core 8 about to decref PID 272's ref, was 13 Stack Backtrace on Core 8: #01 [<0xffffffffc204f9d2>] in proc_decref #02 [<0xffffffffc212ea07>] in __abandon_core #03 [<0xffffffffc2051812>] in proc_restartcore core 8 decref, cur_proc! (unexpected) Core 6 about to decref PID 272's ref, was 12 Stack Backtrace on Core 6: #01 [<0xffffffffc204f9d2>] in proc_decref #02 [<0xffffffffc20fc5d0>] in alarm_release #03 [<0xffffffffc203cf58>] in chan_release #04 [<0xffffffffc203c8ab>] in kref_put #05 [<0xffffffffc200a5c5>] in tap_min_release #06 [<0xffffffffc205f53b>] in kref_put #07 [<0xffffffffc2063ec2>] in close_fdt #08 [<0xffffffffc20514d1>] in proc_destroy #09 [<0xffffffffc205a2fc>] in sys_proc_destroy #10 [<0xffffffffc205c891>] in syscall #11 [<0xffffffffc205cb88>] in run_local_syscall #12 [<0xffffffffc2131c0a>] in sysenter_callwrapper 3 alarm Core 0 about to decref PID 272's ref, was 11 Stack Backtrace on Core 0: #01 [<0xffffffffc204f9d2>] in proc_decref #02 [<0xffffffffc2054912>] in __run_mcp_ksched #03 [<0xffffffffc2003995>] in poke #04 [<0xffffffffc2054e92>] in run_scheduler #05 [<0xffffffffc2054ed9>] in __ksched_tick #06 [<0xffffffffc20000c4>] in __run_awaiter #07 [<0xffffffffc205d97f>] in process_routine_kmsg #08 [<0xffffffffc2056ee3>] in __smp_idle mcp ksched, decreffing the incref from above Core 6 about to decref PID 272's ref, was 10 Stack Backtrace on Core 6: #01 [<0xffffffffc204f9d2>] in proc_decref #02 [<0xffffffffc20fc5d0>] in alarm_release #03 [<0xffffffffc203cf58>] in chan_release #04 [<0xffffffffc203c8ab>] in kref_put #05 [<0xffffffffc200a5c5>] in tap_min_release #06 [<0xffffffffc205f53b>] in kref_put #07 [<0xffffffffc2063ec2>] in close_fdt #08 [<0xffffffffc20514d1>] in proc_destroy #09 [<0xffffffffc205a2fc>] in sys_proc_destroy #10 [<0xffffffffc205c891>] in syscall #11 [<0xffffffffc205cb88>] in run_local_syscall #12 [<0xffffffffc2131c0a>] in sysenter_callwrapper 4 alarm Core 6 about to decref PID 272's ref, was 9 Stack Backtrace on Core 6: #01 [<0xffffffffc204f9d2>] in proc_decref #02 [<0xffffffffc20514f4>] in proc_destroy #03 [<0xffffffffc205a2fc>] in sys_proc_destroy #04 [<0xffffffffc205c891>] in syscall #05 [<0xffffffffc205cb88>] in run_local_syscall #06 [<0xffffffffc2131c0a>] in sysenter_callwrapper PID 272 killing self, refcnt post destroy 8 and of __schec_proc_destroy, this is the cradle-to-grave ref Core 6 about to decref PID 272's ref, was 8 Stack Backtrace on Core 6: #01 [<0xffffffffc204f9d2>] in proc_decref #02 [<0xffffffffc205a311>] in sys_proc_destroy #03 [<0xffffffffc205c891>] in syscall #04 [<0xffffffffc205cb88>] in run_local_syscall #05 [<0xffffffffc2131c0a>] in sysenter_callwrapper sys_proc_destroy's ref PID 272 killing self, refcnt fin destroy 7 PID 272 killing self, refcnt wait destroy 7 PID 272 killing self, refcnt wait destroy 7 PID 272 killing self, refcnt wait destroy 7 PID 272 killing self, refcnt wait destroy 7 PID 272 killing self, refcnt wait destroy 7 Core 6 about to decref PID 272's ref, was 7 Stack Backtrace on Core 6: #01 [<0xffffffffc204f9d2>] in proc_decref #02 [<0xffffffffc205d97f>] in process_routine_kmsg #03 [<0xffffffffc20517b5>] in proc_restartcore __death / clear_owning_proc (1 ref for core 6) Core 6 about to decref PID 272's ref, was 6 Stack Backtrace on Core 6: #01 [<0xffffffffc204f9d2>] in proc_decref #02 [<0xffffffffc2018e89>] in restart_kthread #03 [<0xffffffffc2018eef>] in __launch_kthread #04 [<0xffffffffc205d97f>] in process_routine_kmsg #05 [<0xffffffffc20517b5>] in proc_restartcore Core 6 about to decref PID 272's ref, was 5 Stack Backtrace on Core 6: #01 [<0xffffffffc204f9d2>] in proc_decref #02 [<0xffffffffc2018e89>] in restart_kthread #03 [<0xffffffffc2018eef>] in __launch_kthread #04 [<0xffffffffc205d97f>] in process_routine_kmsg #05 [<0xffffffffc20517b5>] in proc_restartcore Core 6 about to decref PID 272's ref, was 4 Stack Backtrace on Core 6: #01 [<0xffffffffc204f9d2>] in proc_decref #02 [<0xffffffffc2018e89>] in restart_kthread #03 [<0xffffffffc2018eef>] in __launch_kthread #04 [<0xffffffffc205d97f>] in process_routine_kmsg #05 [<0xffffffffc20517b5>] in proc_restartcore Core 6 about to decref PID 272's ref, was 3 Stack Backtrace on Core 6: #01 [<0xffffffffc204f9d2>] in proc_decref #02 [<0xffffffffc2018e89>] in restart_kthread #03 [<0xffffffffc2018eef>] in __launch_kthread #04 [<0xffffffffc205d97f>] in process_routine_kmsg #05 [<0xffffffffc20517b5>] in proc_restartcore Core 6 about to decref PID 272's ref, was 2 Stack Backtrace on Core 6: #01 [<0xffffffffc204f9d2>] in proc_decref #02 [<0xffffffffc2018e38>] in restart_kthread #03 [<0xffffffffc2018eef>] in __launch_kthread #04 [<0xffffffffc205d97f>] in process_routine_kmsg #05 [<0xffffffffc20517b5>] in proc_restartcore 5 syscalls Core 6 about to decref PID 272's ref, was 1 Stack Backtrace on Core 6: #01 [<0xffffffffc204f9d2>] in proc_decref #02 [<0xffffffffc20501c4>] in __proc_disown_child #03 [<0xffffffffc2059c3a>] in try_wait.isra.4 #04 [<0xffffffffc2059cb3>] in try_wait_any.isra.6 #05 [<0xffffffffc2059e1b>] in sys_waitpid #06 [<0xffffffffc205c891>] in syscall #07 [<0xffffffffc205cb88>] in run_local_syscall #08 [<0xffffffffc2131c0a>] in sysenter_callwrapper parent null eptp, gpc was 0xffff800009939aa0 null eptp, proc was 0xffff800007ec8d00 null eptp, pid was 272 null eptp, PCPU was 0xffff800009939aa0 null eptp, ref was 0 k, so we didn't have enough refs. core 8 was actually current ah, core 8 was running. this is dropping cur_proc. i didn't count this one earlier, so we were actually off by one and should have started at 15. why exactly did this run? this abandon is called after PRKM when we see owning_proc is clear. we should have received __death. but we don't see the clear_owning_proc / PRKM that we see on core 6. perhaps we already yielded, dropping owning_proc, then came out and dropped cur_proc no - since yield also abandons core let's see the RKMs too? i didn't see this decref the first time around, right? (above) (right) see it all the time now (3 in a row) since the count seems right at idle (11), it seems like the problem is the other core that comes and goes. meaning, the base 11: 5 syscalls, 4 alarms, parent, ksched, never change, and probably are fine there should be 2-4 refs for the two vcores that are running. clearly 2 for the active core. both depend on the state of the core (owning, cur, etc). could spin for a while before destroying. then print cur_proc/owning proc for all vcores (trace coretf -1) might give clues if there's some corruption k, printed the RKMs for non-core 0: RKM, core 2, 0xffffffffc204fa60 (__startcore) RKM, core 10, 0xffffffffc204d710 (__notify) (this is the kill event) PID 274 core 10 killing self, refcnt pre destroy 14 Core 10 about to decref PID 274's ref, was 14 Stack Backtrace on Core 10: #01 [<0xffffffffc204f9d2>] in proc_decref #02 [<0xffffffffc20fc660>] in alarm_release #03 [<0xffffffffc203cf58>] in chan_release #04 [<0xffffffffc203c8ab>] in kref_put #05 [<0xffffffffc200a5c5>] in tap_min_release #06 [<0xffffffffc205f5cb>] in kref_put #07 [<0xffffffffc2063f52>] in close_fdt #08 [<0xffffffffc20514d1>] in proc_destroy #09 [<0xffffffffc205a33c>] in sys_proc_destroy #10 [<0xffffffffc205c8d1>] in syscall #11 [<0xffffffffc205cbc8>] in run_local_syscall RKM, core 2, 0xffffffffc2018ea0 concurrent message, partway through the decref backtrace! (this is __launch_kthread) #12 [<0xffffffffc2131c9a>] in sysenter_callwrapper Core 2 about to decref PID 274's ref, was 13 Stack Backtrace on Core 2: #01 [<0xffffffffc204f9d2>] in proc_decref #02 [<0xffffffffc212ea97>] in __abandon_core #03 [<0xffffffffc2051812>] in proc_restartcore so core 2 was likely running in userspace (__startcore). did it yield from lack of work yet? probably, since we don't see a __death message for it (not printed here) if it yielded, it should have cleared owning_proc and current though it probably entered via userspace (sys_proc_yield()), and hadn't completely idled yet. reason: proc_restartcore was in the BT launch_kthread: if it restored a thread for the proc, it would load cur_proc, but not owning_proc which would then get cleared in abandon_core. given the timing, it looks like the kthread that woke up might be related to the alarm closing. not sure why that would run on core 2. qlocks and CVs and shit in there. #alarm should run on core 0 though. (pcpui 0 tchain) let's print a little more. Core 12 about to decref PID 274's ref, was 14 Stack Backtrace on Core 12: #01 [<0xffffffffc204fa62>] in proc_decref #02 [<0xffffffffc20fc6f0>] in alarm_release #03 [<0xffffffffc203cfe8>] in chan_release #04 [<0xffffffffc203c93b>] in kref_put #05 [<0xffffffffc200a5c5>] in tap_min_release #06 [<0xffffffffc205f65b>] in kref_put #07 [<0xffffffffc2063fe2>] in close_fdt #08 [<0xffffffffc2051561>] in proc_destroy RKM, core 13, 0xffffffffc2018ea0 (__launch_kthread) #09 [<0xffffffffc205a3cc>] in sys_proc_destroy core 13, launch kth, msg from 13, kth PID 274, cur_proc 0, sysc 0x0000400001870ec0, flags 0x2, name block for 100000 usec, rip 0xffffffffc20193ca #10 [<0xffffffffc205c961>] in syscall #11 [<0xffffffffc205cc58>] in run_local_syscall #12 [<0xffffffffc2131d2a>] in sysenter_callwrapper Core 13 about to decref PID 274's ref, was 13 Stack Backtrace on Core 13: #01 [<0xffffffffc204fa62>] in proc_decref #02 [<0xffffffffc212eb27>] in __abandon_core #03 [<0xffffffffc20518a2>] in proc_restartcore k, it was not #alarm, but a block syscall. this was actually the timer tick, which is implemented with sys_block. that sets a timer on the core it was on (not the best practice, btw), but explains why core 13 would get it. that rip is in sem_down btw, as expected for a sleeping kth. the flag is KTH_SAVE_ADDR_SPACE cur_proc == 0, which means PID 274 wasn't running there yet (probably just yielded, but that's unconfirmed). the kth clearly wants to be in 274's addr space. we don't see an incref when that kth starts, since the kth's counted ref gets transferred to cur_proc what this means is that this ref being dropped was actually from a syscall - one of our 5. but we had 5 other decrefs that looked like syscalls aborting... did we have more than 5 syscalls? that'd throw off the count our extra prints have some more info farther down in the trace core 12, launch kth, msg from 12, kth PID 274, cur_proc 274, sysc 0x0000400000816e80, flags 0x2, name block for 30000000 usec, rip 0xffffffffc20193ca Core 12 about to decref PID 274's ref, was 6 Stack Backtrace on Core 12: #01 [<0xffffffffc204fa62>] in proc_decref #02 [<0xffffffffc2018e89>] in restart_kthread #03 [<0xffffffffc2018f69>] in __launch_kthread #04 [<0xffffffffc205d9eb>] in process_routine_kmsg #05 [<0xffffffffc2051845>] in proc_restartcore btw, the reason this looks different than the other __launch_kth case is because of where the decref happens. if cur_proc is already kth->proc, we decref in restart_kthread RKM, core 12, 0xffffffffc2018ea0 core 12, launch kth, msg from 12, kth PID 274, cur_proc 274, sysc 0x0000400001872e20, flags 0x2, name read on fd 0, rip 0xffffffffc20193ca Core 12 about to decref PID 274's ref, was 5 Stack Backtrace on Core 12: #01 [<0xffffffffc204fa62>] in proc_decref #02 [<0xffffffffc2018e89>] in restart_kthread #03 [<0xffffffffc2018f69>] in __launch_kthread #04 [<0xffffffffc205d9eb>] in process_routine_kmsg #05 [<0xffffffffc2051845>] in proc_restartcore RKM, core 12, 0xffffffffc2018ea0 core 12, launch kth, msg from 12, kth PID 274, cur_proc 274, sysc 0x0000400001874db0, flags 0x2, name read on fd 18, rip 0xffffffffc20193ca Core 12 about to decref PID 274's ref, was 4 Stack Backtrace on Core 12: #01 [<0xffffffffc204fa62>] in proc_decref #02 [<0xffffffffc2018e89>] in restart_kthread #03 [<0xffffffffc2018f69>] in __launch_kthread #04 [<0xffffffffc205d9eb>] in process_routine_kmsg #05 [<0xffffffffc2051845>] in proc_restartcore RKM, core 12, 0xffffffffc2018ea0 core 12, launch kth, msg from 12, kth PID 274, cur_proc 274, sysc 0x0000400001878dc0, flags 0x2, name read on fd 20, rip 0xffffffffc20193ca Core 12 about to decref PID 274's ref, was 3 Stack Backtrace on Core 12: #01 [<0xffffffffc204fa62>] in proc_decref #02 [<0xffffffffc2018e89>] in restart_kthread #03 [<0xffffffffc2018f69>] in __launch_kthread #04 [<0xffffffffc205d9eb>] in process_routine_kmsg #05 [<0xffffffffc2051845>] in proc_restartcore RKM, core 12, 0xffffffffc2018ea0 core 12, launch kth, msg from 12, kth PID 273, cur_proc 274, sysc 0x00007f7fff9fe8b0, flags 0x2, name waitpid on -1, rip 0xffffffffc20193ca Core 12 about to decref PID 274's ref, was 2 Stack Backtrace on Core 12: #01 [<0xffffffffc204fa62>] in proc_decref #02 [<0xffffffffc2018e38>] in restart_kthread #03 [<0xffffffffc2018f69>] in __launch_kthread #04 [<0xffffffffc205d9eb>] in process_routine_kmsg #05 [<0xffffffffc2051845>] in proc_restartcore here's the 5 decrefs for unblocked syscalls: core 12, launch kth, msg from 12, kth PID 274, cur_proc 274, sysc 0x0000400000816e80, flags 0x2, name block for 30000000 usec, rip 0xffffffffc20193ca core 12, launch kth, msg from 12, kth PID 274, cur_proc 274, sysc 0x0000400001872e20, flags 0x2, name read on fd 0, rip 0xffffffffc20193ca core 12, launch kth, msg from 12, kth PID 274, cur_proc 274, sysc 0x0000400001874db0, flags 0x2, name read on fd 18, rip 0xffffffffc20193ca core 12, launch kth, msg from 12, kth PID 274, cur_proc 274, sysc 0x0000400001878dc0, flags 0x2, name read on fd 20, rip 0xffffffffc20193ca core 12, launch kth, msg from 12, kth PID 273, cur_proc 274, sysc 0x00007f7fff9fe8b0, flags 0x2, name waitpid on -1, rip 0xffffffffc20193ca ok, that last one isn't our PID's syscall... that's our parent, waiting on us. it decreffed us in restart_kthread. that's a different part of restart_kthread than the others (check the PCs) and it's fine - that's us dropping PID 274's ref, since right after this, PID 273 is cur_proc this is all due to signalling our parent. so we're actually OK. we had 5 syscalls, but not where we expected. however, cur_proc should be 273 at this point. later in the trace, we dec'd another ref for cur_proc. so next what happens: Core 12 about to decref PID 274's ref, was 1 Stack Backtrace on Core 12: #01 [<0xffffffffc204fa62>] in proc_decref #02 [<0xffffffffc2050254>] in __proc_disown_child #03 [<0xffffffffc2059d0a>] in try_wait.isra.4 #04 [<0xffffffffc2059d83>] in try_wait_any.isra.6 #05 [<0xffffffffc2059eeb>] in sys_waitpid #06 [<0xffffffffc205c961>] in syscall #07 [<0xffffffffc205cc58>] in run_local_syscall #08 [<0xffffffffc2131d2a>] in sysenter_callwrapper that's our parent, dropping our ref. cur_proc should be 273, not 274. but then: null eptp, gpc was 0xffff8000098e39a0 null eptp, proc was 0xffff800007eca000 null eptp, pid was 274 null eptp, PCPU was 0xffff8000098e39a0 null eptp, ref was 0 (debugging prints) Entering Nanwan's Dungeon on Core 12 (Ints on): Type 'help' for a list of commands. HW TRAP frame at 0xfffffff000107e60 on core 12 rax 0xfffffff000107f28 rbx 0xffff8000098e39a0 rcx 0x0000000000000001 rdx 0x000000000000ced8 rbp 0xfffffff000107f58 rsi 0x0000000000000780 rdi 0x000000000000000a r8 0xffffffffc7cc8d00 r9 0x00000000000137e0 r10 0xffffffffc7cc8c60 r11 0xffffffffc7cc8c20 r12 0xffffffffc7b87bc8 r13 0xfffffff000107f28 r14 0x00000000ffffffff r15 0x0000000000000000 trap 0x00000006 Invalid Opcode gsbs 0xffffffffc7ccfbc0 fsbs 0x0000000000000000 err 0x--------00000000 rip 0xffffffffc213642b cs 0x------------0008 flag 0x0000000000010003 rsp 0xfffffff000107f28 ss 0x------------0010 ROS(Core 12)> bt 0xffffffffc213642b 0xfffffff000107f58 Backtrace from instruction 0xffffffffc213642b, with frame pointer 0xfffffff000107f58 Backtrace of kernel context on Core 12: #01 [<0xffffffffc213642b>] in vmx_clear_vmcs #02 [<0xffffffffc212eb10>] in __abandon_core #03 [<0xffffffffc20518a2>] in proc_restartcore so proc_restartcore abandons, but for some reason it still thinks 274 is cur_proc, even though PRKM changed it. ah, warning sirens are going off. struct per_cpu_info *pcpui = &per_cpu_info[core_id()]; assert(!pcpui->cur_kthread->sysc); process_routine_kmsg(); /* If there is no owning process, just idle, since we don't know what to do. * This could be because the process had been restarted a long time ago and * has since left the core, or due to a KMSG like __preempt or __death. */ if (!pcpui->owning_proc) { abandon_core(); smp_idle(); } with aggressive inlining and whatnot, could this be reading cur_proc before PRKM, then not noticing the change? unlikely, those funcs are in another C file. confirmed via asm. also, wait a sec - when 273's syscall kth restarts and finishes, why does it go back to proc_restartcore? ah, it's the proc_restartcore from 273. it's walking back its sysenter/syscall TF. or is cur_proc still legit 274? (note that owning_proc should be 0, since we saw __death earlier, which cleared_owning_proc). if so, who changed it back? uh, a printk in abandon_core says it thinks cur_proc is 273... ah, here's the issue __abandon_core() is given 273. flushes PTs, decrefs ok, etc. it's decreffing 273, not 274. so our refcounting is actually fine. the problem is when we abandon_core, we try to remove all the GPCs. the GPCs have an uncounted ref to proc that's why it looks like they correctly have a ref of 0 in the print we don't get to the 'extra' decref of 274, which i figured would happen, since we die in __invept had i commented that out, we would have kept going, then decreffed 273 and not panicked. overall, abandon_core() isn't "definitely remove the process", it's more like "remove the process if its still there". (its listed as stop-whatever-was-there) there's an assumption in __abandon_core() when it calls the VMCS stuff that it is getting called on the process whos VCMS / GPC is there. the process was already removed before, and happened to already be fully decreffed, leaving it behind but we could be in another process. (the parent, in this case) because we never removed the VMM process, we replaced it's cur_proc in restart_kthread it might also be possible that there is no process on the core, perhaps if we ran a ktask kthread? not currently in short - the process could have left the core (the core is no long in that process's context; it is not cur_proc; and that ref is gone) before abandon core a couple choices: refcnt gpc->proc's references. they should all get cleaned up when we kill and ultimately abandon_core are there situations where a GPC / process will not get reaped, since we never abandon core? i think we flush the EPT when we changing owning_core or something (check this) wait a sec - abandon_core is removing the VMCS. the GPC should have been unloaded already. the GPC was unloaded when we finalized the context when does that happen for dying processes? (in __death) remove the GPCs when we remove the addr space / cur_proc and don't forget to remove the VMCS fully overkill: a sysc briefly pops into another user's addr space, (think of switch_to / send_event), then we unloaded the GPC/finalized the context need to think a little more the reason the VMCS cleanup was in abandon_core was i wanted to not leave any turds around when a process left a core. that's probably the wrong place for it. should be in __death or __preempt. any time we change owning_proc