Open3
WasmLinux: idleスレッド暴走問題
syscallを発行したらidleスレッドが暴走して帰ってこなくなってしまった。。現状のLKLはSMP でない のでカーネルを実行できるのは同時に1スレッドのみで、idleスレッドが暴走していると他の誰もカーネルを実行できなくなってしまう。
stop tickが怪しい
(lldb) bt
* thread #2, name = 'runner'
* frame #0: 0x0000000000403058 runner`i64_store(mem=0x00007ffdf0000b80, addr=1408440, value=125920000000) at lin.c:164:1
frame #1: 0x0000000000d58bea runner`w2c_kernel_tick_nohz_idle_stop_tick(instance=0x00007ffdf0000b70) at lin.c:1092173
frame #2: 0x00000000012a3cda runner`w2c_kernel_do_idle(instance=0x00007ffdf0000b70) at lin.c:1621581
frame #3: 0x00000000012a4003 runner`w2c_kernel_cpu_startup_entry(instance=0x00007ffdf0000b70, var_p0=236) at lin.c:1621667
frame #4: 0x00000000010fe321 runner`w2c_kernel_rest_init(instance=0x00007ffdf0000b70) at lin.c:1454470
frame #5: 0x00000000010ff5ba runner`w2c_kernel_arch_call_rest_init(instance=0x00007ffdf0000b70) at lin.c:1454961
frame #6: 0x00000000010ffeac runner`w2c_kernel_start_kernel(instance=0x00007ffdf0000b70) at lin.c:1455137
frame #7: 0x0000000001299702 runner`w2c_kernel_lkl_run_kernel(instance=0x00007ffdf0000b70, var_p0=0) at lin.c:1618376
frame #8: 0x00000000026371ed runner`thr_trampoline(objid=6) at runner.cpp:309:16
frame #9: 0x000000000263a833 runner`unsigned long std::__invoke_impl<unsigned long, unsigned long (*)(int), int>((null)=__invoke_other @ 0x00007ffdf7a20b10, __f=0x0000000002983790, (null)=0x0000000002983788) at invoke.h:61:36
frame #10: 0x000000000263a69b runner`std::__invoke_result<unsigned long (*)(int), int>::type std::__invoke<unsigned long (*)(int), int>(__fn=0x0000000002983790, (null)=0x0000000002983788) at invoke.h:96:40
frame #11: 0x000000000263a4af runner`unsigned long std::thread::_Invoker<std::tuple<unsigned long (*)(int), int>>::_M_invoke<0ul, 1ul>(this=0x0000000002983788, (null)=_Index_tuple<0, 1> @ 0x00007ffdf7a20b70) at std_thread.h:292:26
frame #12: 0x000000000263a3b6 runner`std::thread::_Invoker<std::tuple<unsigned long (*)(int), int>>::operator()(this=0x0000000002983788) at std_thread.h:299:20
frame #13: 0x000000000263a362 runner`std::thread::_State_impl<std::thread::_Invoker<std::tuple<unsigned long (*)(int), int>>>::_M_run(this=0x0000000002983780) at std_thread.h:244:20
frame #14: 0x00007ffff7ce31b3 libstdc++.so.6`execute_native_thread_routine + 19
frame #15: 0x00007ffff7aae947 libc.so.6`start_thread + 759
frame #16: 0x00007ffff7b34860 libc.so.6`__clone3 + 48
タイマを適当に処理したツケが廻ってきてるな。。?
このアドレス 1408440
は tick_cpu_sched
で、これは単なる統計データのようだ。
157d10 8836ae c0 tick_cpu_sched
ねっとりとステップ実行してみて気になるのは、
ここで idle_host_task
が 0 であること。
TLS key = 0 がダメだった
ここでidleタスクの起動に失敗していた。
というわけでTLSのkeyにゼロを使わないようにしたら問題なくなった。。