wq: handle VM suspension in stall detection
authorSergey Senozhatsky <senozhatsky@chromium.org>
Thu, 20 May 2021 10:14:22 +0000 (19:14 +0900)
committerTejun Heo <tj@kernel.org>
Thu, 20 May 2021 16:58:30 +0000 (12:58 -0400)
commit940d71c6462e8151c78f28e4919aa8882ff2054e
tree3e632fd3aa8fd5c5a10ec2ed1a1ca43e7baa0d8f
parentc3d0e3fd41b7f0f5d5d5b6022ab7e813f04ea727
wq: handle VM suspension in stall detection

If VCPU is suspended (VM suspend) in wq_watchdog_timer_fn() then
once this VCPU resumes it will see the new jiffies value, while it
may take a while before IRQ detects PVCLOCK_GUEST_STOPPED on this
VCPU and updates all the watchdogs via pvclock_touch_watchdogs().
There is a small chance of misreported WQ stalls in the meantime,
because new jiffies is time_after() old 'ts + thresh'.

wq_watchdog_timer_fn()
{
for_each_pool(pool, pi) {
if (time_after(jiffies, ts + thresh)) {
pr_emerg("BUG: workqueue lockup - pool");
}
}
}

Save jiffies at the beginning of this function and use that value
for stall detection. If VM gets suspended then we continue using
"old" jiffies value and old WQ touch timestamps. If IRQ at some
point restarts the stall detection cycle (pvclock_touch_watchdogs())
then old jiffies will always be before new 'ts + thresh'.

Signed-off-by: Sergey Senozhatsky <senozhatsky@chromium.org>
Signed-off-by: Tejun Heo <tj@kernel.org>
kernel/workqueue.c