From: Petr Mladek <pmladek@suse.com>
To: 王擎 <wangqing@vivo.com>
Cc: Tejun Heo <tj@kernel.org>, Lai Jiangshan <jiangshanlai@gmail.com>,
Andrew Morton <akpm@linux-foundation.org>,
"Guilherme G. Piccoli" <gpiccoli@canonical.com>,
Andrey Ignatov <rdna@fb.com>, Vlastimil Babka <vbabka@suse.cz>,
Santosh Sivaraj <santosh@fossix.org>,
linux-kernel@vger.kernel.org
Subject: Re: Re: Re: [PATCH V2] workqueue: watchdog: update wq_watchdog_touched for unbound lockup checking
Date: Wed, 24 Mar 2021 09:50:51 +0100 [thread overview]
Message-ID: <YFr9a5tws6PhAjye@alley> (raw)
In-Reply-To: <ADYALADXDuGCRBjCE77aRKpD.3.1616552206707.Hmail.wangqing@vivo.com>
On Wed 2021-03-24 10:16:46, 王擎 wrote:
>
> >On Tue 2021-03-23 20:37:35, 王擎 wrote:
> >>
> >> >On Fri 2021-03-19 16:00:36, Wang Qing wrote:
> >> >> When touch_softlockup_watchdog() is called, only wq_watchdog_touched_cpu
> >> >> updated, while the unbound worker_pool running on its core uses
> >> >> wq_watchdog_touched to determine whether locked up. This may be mischecked.
> >> >
> >> >By other words, unbound workqueues are not aware of the more common
> >> >touch_softlockup_watchdog() because it updates only
> >> >wq_watchdog_touched_cpu for the affected CPU. As a result,
> >> >the workqueue watchdog might report lockup in unbound workqueue
> >> >even though it is blocked by a known slow code.
> >>
> >> Yes, this is the problem I'm talking about.
> >
> >I thought more about it. This patch prevents a false positive.
> >Could it bring an opposite problem and hide real problems?
> >
> >I mean that an unbound workqueue might get blocked on CPU A
> >because of a real softlockup. But we might not notice it because
> >CPU B is touched. Well, there are other ways how to detect
> >this situation, e.g. the softlockup watchdog.
> >
> >
> >> >> My suggestion is to update both when touch_softlockup_watchdog() is called,
> >> >> use wq_watchdog_touched_cpu to check bound, and use wq_watchdog_touched
> >> >> to check unbound worker_pool.
> >> >>
> >> >> Signed-off-by: Wang Qing <wangqing@vivo.com>
> >> >> ---
> >> >> kernel/watchdog.c | 5 +++--
> >> >> kernel/workqueue.c | 17 ++++++-----------
> >> >> 2 files changed, 9 insertions(+), 13 deletions(-)
> >> >>
> >> >> diff --git a/kernel/watchdog.c b/kernel/watchdog.c
> >> >> index 7110906..107bc38
> >> >> --- a/kernel/watchdog.c
> >> >> +++ b/kernel/watchdog.c
> >> >> @@ -278,9 +278,10 @@ void touch_all_softlockup_watchdogs(void)
> >> >> * update as well, the only side effect might be a cycle delay for
> >> >> * the softlockup check.
> >> >> */
> >> >> - for_each_cpu(cpu, &watchdog_allowed_mask)
> >> >> + for_each_cpu(cpu, &watchdog_allowed_mask) {
> >> >> per_cpu(watchdog_touch_ts, cpu) = SOFTLOCKUP_RESET;
> >> >> - wq_watchdog_touch(-1);
> >> >> + wq_watchdog_touch(cpu);
> >> >
> >> >Note that wq_watchdog_touch(cpu) newly always updates
> >> >wq_watchdog_touched. This cycle will set the same jiffies
> >> >value cpu-times to the same variable.
> >> >
> >> Although there is a bit of redundancy here, but the most concise way of
> >> implementation, and it is certain that it will not affect performance.
> >>
> Another way to implement is wq_watchdog_touch() remain unchanged, but need
> to modify touch_softlockup_watchdog() and touch_all_softlockup_watchdogs():
> notrace void touch_softlockup_watchdog(void)
> {
> touch_softlockup_watchdog_sched();
> wq_watchdog_touch(raw_smp_processor_id());
> + wq_watchdog_touch(-1);
> }
> void touch_all_softlockup_watchdogs(void)
> * update as well, the only side effect might be a cycle delay for
> * the softlockup check.
> */
> - for_each_cpu(cpu, &watchdog_allowed_mask)
> + for_each_cpu(cpu, &watchdog_allowed_mask) {
> per_cpu(watchdog_touch_ts, cpu) = SOFTLOCKUP_RESET;
> + wq_watchdog_touch(cpu);
> + }
> wq_watchdog_touch(-1);
> }
> So wq_watchdog_touched will not get updated many times,
> which do you think is better, Petr?
I actually prefer the original patch. It makes wq_watchdog_touch()
easy to use. The complexity is hidden in wq-specific code.
The alternative way updates each timestamp only once but the use
is more complicated. IMHO, it is more error prone.
Best Regards,
Petr
next prev parent reply other threads:[~2021-03-24 8:51 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-03-19 8:00 Wang Qing
2021-03-20 18:20 ` Tejun Heo
2021-03-22 1:47 ` 王擎
2021-03-22 10:59 ` Petr Mladek
2021-03-23 12:37 ` 王擎
2021-03-23 15:06 ` Petr Mladek
2021-03-24 2:16 ` 王擎
2021-03-24 8:50 ` Petr Mladek [this message]
2021-03-24 9:42 ` Re:Re: " 王擎
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=YFr9a5tws6PhAjye@alley \
--to=pmladek@suse.com \
--cc=akpm@linux-foundation.org \
--cc=gpiccoli@canonical.com \
--cc=jiangshanlai@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=rdna@fb.com \
--cc=santosh@fossix.org \
--cc=tj@kernel.org \
--cc=vbabka@suse.cz \
--cc=wangqing@vivo.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®