On Tue, 19 Nov 2019, Qais Yousef wrote: > On 11/19/19 23:21, Thomas Gleixner wrote: > > On Wed, 30 Oct 2019, Qais Yousef wrote: > > > void machine_shutdown(void) > > > { > > > #ifdef CONFIG_HOTPLUG_CPU > > > - int cpu; > > > - > > > - for_each_online_cpu(cpu) { > > > - if (cpu != smp_processor_id()) > > > - cpu_down(cpu); > > > - } > > > + /* TODO: Can we use disable_nonboot_cpus()? */ > > > + freeze_secondary_cpus(smp_processor_id()); > > > > freeze_secondary_cpus() is only available for CONFIG_PM_SLEEP_SMP=y and > > disable_nonboot_cpus() is a NOOP for CONFIG_PM_SLEEP_SMP=n :) > > I thought I replied to this :-( > > My plan was to simply make freeze_secondary_cpus() available and protected by > CONFIG_SMP only instead. > > Good plan? No. freeze_secondary_cpus() is really for hibernation. Look at the exit conditions there. So you really want a seperate function which depends on CONFIG_HOTPLUG_CPU and provides an inline stub for the CONFIG_HOTPLUG_CPU=n case. But I have a hard time to see how that stuff works at all on ia64: cpu_down() might sleep, i.e. it must be called from preemptible context. smp_processor_id() is invalid from preemtible context. As this is obviously broken and ia64 is in keep compile mode only, it should just go away. Thanks, tglx