2017-06-10

本文以2.6.18内核来说明.

1. 检测

每间隔HZ, 会喂watchdog.

tick                         watchdog
|                              |
|           wakup              |
|- - - - -  - - -  - - - >     |
|check                         | touch
|                              |
|                              |
|           wakup              |
|- - - - -  - - -  - - - >     |
|check                         | touch
|                              |
|                              |

若watchdog线程迟迟没有被调度到, 则导致watchdog没有touch, 这样, tick 时钟会检查到该问题, 报 soft lockup .

2. 打印出来的是谁的栈

softlockup_tick
{
    if (time_after(jiffies, touch_timestamp + 10*HZ))
    {
        ...
        per_cpu(print_timestamp, this_cpu) = touch_timestamp;

        dump_stack(); 
        ...
    }

}

问题:上面这个dump_stack()有意义吗? 打印出来的是谁的栈?

答: 由于 watchdog 线程无法调度到, 那么, 也就是有 task 长期占用着cpu, 所以, 时钟中断发生时, 大概率是处在这个 长期占用的cpu的task上, 故 这里dump_stack()大概率打印出 这个task.

本文地址: https://awakening-fong.github.io/posts/debug/softlockup

转载请注明出处: https://awakening-fong.github.io


若无法评论, 请打开JavaScript, 并通过proxy.


blog comments powered by Disqus