Open3

WasmLinux: idleスレッド暴走問題

okuokuokuoku

syscallを発行したらidleスレッドが暴走して帰ってこなくなってしまった。。現状のLKLはSMP でない のでカーネルを実行できるのは同時に1スレッドのみで、idleスレッドが暴走していると他の誰もカーネルを実行できなくなってしまう。

okuokuokuoku

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

タイマを適当に処理したツケが廻ってきてるな。。?

このアドレス 1408440tick_cpu_sched で、これは単なる統計データのようだ。

  157d10   8836ae       c0                 tick_cpu_sched

ねっとりとステップ実行してみて気になるのは、

https://github.com/lkl/linux/blob/3023e6f25fbf6d5f95b4e7ebd011fa688434ce5f/arch/lkl/kernel/syscalls.c#L136-L140

ここで idle_host_task が 0 であること。