Message ID | 20241120103749.1450017-1-ping.bai@nxp.com |
---|---|
State | Superseded |
Headers | show |
Series | [v2] cpuidle: psci: Init cpuidle only for present CPUs | expand |
Hi Jacky, I wasn't Cc-ed on the original patch. I was searching to provide feedback but couldn't find one. On Wed, Mar 05, 2025 at 02:31:57PM +0800, Yuanjie Yang wrote: > On Wed, Nov 20, 2024 at 06:37:49PM +0800, Jacky Bai wrote: > > With 'nosmp' or 'maxcpus=0' boot command line parameters, > > the 'cpu_present_mask' may not be the same as 'cpu_possible_mask'. > > > > In current psci cpuidle driver init, for_each_possible_cpu() > > is used to init the cpuidle for each possible CPU. but in > > drivers/base/cpu.c ->cpu_dev_register_generic(), > > for_each_present_cpu() is used to register cpu device for > > present CPUs. > > > > When boot system with 'nosmp' or 'maxcpus=0', the cpuidle driver > > init failed due to no valid CPU device sysfs node for non-boot CPUs. > > > > [ 0.182993] Failed to register cpuidle device for cpu1 > > > > Use for_each_present_cpu() to register cpuidle only for present > > CPUs. > > Can you reword it something like " for_each_possible_cpu() is currently used to initialize cpuidle in the PSCI cpuidle driver. However, in cpu_dev_register_generic(), for_each_present_cpu() is used to register CPU devices which means the CPU devices are only registered for present CPUs and not all possible CPUs. With nosmp or maxcpus=0, only the boot CPU is present, leading to the failure: | Failed to register cpuidle device for cpu1 Change for_each_possible_cpu() to for_each_present_cpu() in the PSCI cpuidle driver to ensure it only registers cpuidle devices for CPUs that are actually present. " With that, you can add: Reviewed-by: Sudeep Holla <sudeep.holla@arm.com> Please cc Ulf Hansson <ulf.hansson@linaro.org> as well. Either him or Rafael can then pick up the patch.
diff --git a/drivers/cpuidle/cpuidle-psci.c b/drivers/cpuidle/cpuidle-psci.c index 2562dc001fc1..00117e9b33e8 100644 --- a/drivers/cpuidle/cpuidle-psci.c +++ b/drivers/cpuidle/cpuidle-psci.c @@ -410,7 +410,7 @@ static int psci_cpuidle_probe(struct platform_device *pdev) struct cpuidle_driver *drv; struct cpuidle_device *dev; - for_each_possible_cpu(cpu) { + for_each_present_cpu(cpu) { ret = psci_idle_init_cpu(&pdev->dev, cpu); if (ret) goto out_fail;