Message ID | 20191030153837.18107-4-qais.yousef@arm.com (mailing list archive) |
---|---|
State | Not Applicable |
Headers | show |
Series | Convert cpu_up/down to device_online/offline | expand |
Qais Yousef <qais.yousef@arm.com> writes: > The core device API performs extra housekeeping bits that are missing > from directly calling cpu_up/down. > > See commit a6717c01ddc2 ("powerpc/rtas: use device model APIs and > serialization during LPM") for an example description of what might go > wrong. > > This also prepares to make cpu_up/down a private interface for anything > but the cpu subsystem. > > Signed-off-by: Qais Yousef <qais.yousef@arm.com> > CC: Benjamin Herrenschmidt <benh@kernel.crashing.org> > CC: Paul Mackerras <paulus@samba.org> > CC: Michael Ellerman <mpe@ellerman.id.au> > CC: Enrico Weigelt <info@metux.net> > CC: Ram Pai <linuxram@us.ibm.com> > CC: Nicholas Piggin <npiggin@gmail.com> > CC: Thiago Jung Bauermann <bauerman@linux.ibm.com> > CC: Christophe Leroy <christophe.leroy@c-s.fr> > CC: Thomas Gleixner <tglx@linutronix.de> > CC: linuxppc-dev@lists.ozlabs.org > CC: linux-kernel@vger.kernel.org > --- > arch/powerpc/kernel/machine_kexec_64.c | 4 +++- > 1 file changed, 3 insertions(+), 1 deletion(-) My initial though is "what about kdump", but that function is not called during kdump, so there should be no issue with the extra locking leading to deadlocks in a crash. Acked-by: Michael Ellerman <mpe@ellerman.id.au> I assume you haven't actually tested it? cheers > diff --git a/arch/powerpc/kernel/machine_kexec_64.c b/arch/powerpc/kernel/machine_kexec_64.c > index 04a7cba58eff..ebf8cc7acc4d 100644 > --- a/arch/powerpc/kernel/machine_kexec_64.c > +++ b/arch/powerpc/kernel/machine_kexec_64.c > @@ -208,13 +208,15 @@ static void wake_offline_cpus(void) > { > int cpu = 0; > > + lock_device_hotplug(); > for_each_present_cpu(cpu) { > if (!cpu_online(cpu)) { > printk(KERN_INFO "kexec: Waking offline cpu %d.\n", > cpu); > - WARN_ON(cpu_up(cpu)); > + WARN_ON(device_online(get_cpu_device(cpu))); > } > } > + unlock_device_hotplug(); > } > > static void kexec_prepare_cpus(void) > -- > 2.17.1
On 11/19/19 12:19, Michael Ellerman wrote: > Qais Yousef <qais.yousef@arm.com> writes: > > The core device API performs extra housekeeping bits that are missing > > from directly calling cpu_up/down. > > > > See commit a6717c01ddc2 ("powerpc/rtas: use device model APIs and > > serialization during LPM") for an example description of what might go > > wrong. > > > > This also prepares to make cpu_up/down a private interface for anything > > but the cpu subsystem. > > > > Signed-off-by: Qais Yousef <qais.yousef@arm.com> > > CC: Benjamin Herrenschmidt <benh@kernel.crashing.org> > > CC: Paul Mackerras <paulus@samba.org> > > CC: Michael Ellerman <mpe@ellerman.id.au> > > CC: Enrico Weigelt <info@metux.net> > > CC: Ram Pai <linuxram@us.ibm.com> > > CC: Nicholas Piggin <npiggin@gmail.com> > > CC: Thiago Jung Bauermann <bauerman@linux.ibm.com> > > CC: Christophe Leroy <christophe.leroy@c-s.fr> > > CC: Thomas Gleixner <tglx@linutronix.de> > > CC: linuxppc-dev@lists.ozlabs.org > > CC: linux-kernel@vger.kernel.org > > --- > > arch/powerpc/kernel/machine_kexec_64.c | 4 +++- > > 1 file changed, 3 insertions(+), 1 deletion(-) > > My initial though is "what about kdump", but that function is not called > during kdump, so there should be no issue with the extra locking leading > to deadlocks in a crash. > > Acked-by: Michael Ellerman <mpe@ellerman.id.au> Thanks. > > I assume you haven't actually tested it? Only compile tested it I'm afraid. Would appreciate if you can give it a spin. Otherwise I'd be happy to try it out on qemu. Cheers -- Qais Yousef
diff --git a/arch/powerpc/kernel/machine_kexec_64.c b/arch/powerpc/kernel/machine_kexec_64.c index 04a7cba58eff..ebf8cc7acc4d 100644 --- a/arch/powerpc/kernel/machine_kexec_64.c +++ b/arch/powerpc/kernel/machine_kexec_64.c @@ -208,13 +208,15 @@ static void wake_offline_cpus(void) { int cpu = 0; + lock_device_hotplug(); for_each_present_cpu(cpu) { if (!cpu_online(cpu)) { printk(KERN_INFO "kexec: Waking offline cpu %d.\n", cpu); - WARN_ON(cpu_up(cpu)); + WARN_ON(device_online(get_cpu_device(cpu))); } } + unlock_device_hotplug(); } static void kexec_prepare_cpus(void)
The core device API performs extra housekeeping bits that are missing from directly calling cpu_up/down. See commit a6717c01ddc2 ("powerpc/rtas: use device model APIs and serialization during LPM") for an example description of what might go wrong. This also prepares to make cpu_up/down a private interface for anything but the cpu subsystem. Signed-off-by: Qais Yousef <qais.yousef@arm.com> CC: Benjamin Herrenschmidt <benh@kernel.crashing.org> CC: Paul Mackerras <paulus@samba.org> CC: Michael Ellerman <mpe@ellerman.id.au> CC: Enrico Weigelt <info@metux.net> CC: Ram Pai <linuxram@us.ibm.com> CC: Nicholas Piggin <npiggin@gmail.com> CC: Thiago Jung Bauermann <bauerman@linux.ibm.com> CC: Christophe Leroy <christophe.leroy@c-s.fr> CC: Thomas Gleixner <tglx@linutronix.de> CC: linuxppc-dev@lists.ozlabs.org CC: linux-kernel@vger.kernel.org --- arch/powerpc/kernel/machine_kexec_64.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)