Hi Dengcheng, On Mon, Jul 23, 2018 at 07:48:14AM -0700, Dengcheng Zhu wrote: > Extract play_dead() from CONFIG_HOTPLUG_CPU and share with CONFIG_KEXEC. > Also, add one parameter to it to avoid doing unnecessary things in the case > of kexec. I'd prefer that we use a separate function to play_dead() for this, for example we could provide an implementation of crash_smp_send_stop() much like ARM's which invokes a machine_crash_nonpanic_core() function on all CPUs other than the crash CPU. This would prevent the kexec/kdump functionality from depending on the board/platform specific play_dead(), and wouldn't need these changes to all of the implementations of play_dead(). We should also be calling crash_save_cpu() on each CPU, which is a further difference from play_dead(). > This is needed to correctly support SMP new kernel in kexec. Before doing > this, all non-crashing CPUs are waiting for the reboot signal > (kexec_ready_to_reboot) to jump to kexec_start_address in kexec_smp_wait(), > which creates some problems like incorrect CPU topology upon booting from > new UP kernel, Do you know how that happens? I'd expect detecting topology not to depend upon what state CPUs are in. That should certainly be the case for smp-cps/CONFIG_MIPS_CPS which detects topology just by reading CM/CPC/GIC registers. > sluggish performance in MT environment during and after reboot, The function running on non-crash CPUs would just need to execute a loop of wait instructions to avoid this. > new SMP kernel not able to bring up secondary CPU etc. If the SMP implementation can reset CPUs then that ought not to happen, since no matter what the CPU was doing Linux should be able to cause it to reset & run some known piece of code. I'm not sure the current Octeon SMP code can do that, but there are patches in patchwork that look like they might (& patches to remove Octeon's current kexec/kdump code which suggests nobody cares much about it). I'd suggest we could perhaps add a boolean to struct plat_smp_ops to indicate whether kexec is supported, and start by setting it to true for cps_smp_ops. Then we can have machine_kexec_prepare() return an error if it finds !mp_ops->kexec_supported, and deal with enabling kexec per platform. I think this would be better than Kconfig because there are systems where we may use one of multiple SMP implementations - for example Malta might use smp-cps (which would be OK for kexec) or smp-cmp (which wouldn't). If we get to a point where all our SMP implementations can deal with kexec we could remove the field later. Thanks, Paul