Re: [PATCH 2/5] kernel/watchdog_hld: clarify the condition in hardlockup_detector_event_create()

From: Andrew Morton
Date: Wed Sep 15 2021 - 00:06:30 EST


On Wed, 15 Sep 2021 11:51:00 +0800 Pingfan Liu <kernelfans@xxxxxxxxx> wrote:

> hardlockup_detector_event_create() indirectly calls
> kmem_cache_alloc_node(), which is blockable.
>
> So here, the really planned context is is_percpu_thread().
>
> ...
>
> --- a/kernel/watchdog_hld.c
> +++ b/kernel/watchdog_hld.c
> @@ -165,10 +165,13 @@ static void watchdog_overflow_callback(struct perf_event *event,
>
> static int hardlockup_detector_event_create(void)
> {
> - unsigned int cpu = smp_processor_id();
> + unsigned int cpu;
> struct perf_event_attr *wd_attr;
> struct perf_event *evt;
>
> + /* This function plans to execute in cpu bound kthread */
> + BUG_ON(!is_percpu_thread());

Can we avoid adding the BUG()? Find a way to emit a WARNing and then
permit the kernel to continue?

> + cpu = raw_smp_processor_id();
> wd_attr = &wd_hw_attr;
> wd_attr->sample_period = hw_nmi_get_sample_period(watchdog_thresh);