[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20180608095220.GA18941@redhat.com>
Date: Fri, 8 Jun 2018 11:52:20 +0200
From: Oleg Nesterov <oleg@...hat.com>
To: Peter Zijlstra <peterz@...radead.org>
Cc: mingo@...nel.org, gkohli@...eaurora.org, tglx@...utronix.de,
mpe@...erman.id.au, bigeasy@...utronix.de,
linux-kernel@...r.kernel.org, will.deacon@....com
Subject: Re: [PATCH 4/4] kthread: Simplify kthread_park() completion
Peter,
I am travelling till the end of the next week, unlikely I will be able
to reply to emails or even read them.
But I want very much to comment this change,
On 06/07, Peter Zijlstra wrote:
>
> Now that smpboot_update_cpumask_percpu_thread() is gone, we no longer
> have anybody calling kthread_park() on already parked threads. So
> revert commit:
>
> b1f5b378e126 ("kthread: Allow kthread_park() on a parked kthread")
Great, I obviously like this patch but the changelog should be fixed ;)
smpboot_update_cpumask_percpu_thread() was actually fine. And we can
(should) revert this commit in any case. Unless I am totally confused.
So how this code
for_each_cpu_and(cpu, &tmp, cpu_online_mask)
smpboot_park_thread(plug_thread, cpu);
in smpboot_update_cpumask_percpu_thread() can hit a KTHREAD_SHOULD_PARK
thread? Lets look into kernel test robot's .config:
CONFIG_NR_CPUS=1
Now look at NR_CPUS==1 version of for_each_cpu* helpers:
#define for_each_cpu(cpu, mask) \
for ((cpu) = 0; (cpu) < 1; (cpu)++, (void)mask)
#define for_each_cpu_not(cpu, mask) \
for ((cpu) = 0; (cpu) < 1; (cpu)++, (void)mask)
#define for_each_cpu_wrap(cpu, mask, start) \
for ((cpu) = 0; (cpu) < 1; (cpu)++, (void)mask, (void)(start))
#define for_each_cpu_and(cpu, mask, and) \
for ((cpu) = 0; (cpu) < 1; (cpu)++, (void)mask, (void)and)
See? They all ignore the "mask" argument, and this is obviously wrong.
So even if the "tmp" cpumask is empty the code above always does
smpboot_park_thread(plug_thread, 0);
and hits the already parked kthread.
Oleg.
Powered by blists - more mailing lists