Skip to contentSkip to conversation

smp: Add bootcpus parameter to boot subset of CPUs

PATCH In review Elliot Berman 6 participants 14 messages Oct 22, 2020 – Nov 3, 2020

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 smp: Add bootcpus parameter to boot subset of CPUs

In a heterogeneous multiprocessor system, specifying the 'maxcpus' parameter on kernel command line does not provide sufficient control over which CPUs are brought online at kernel boot time, since CPUs may have nonuniform performance characteristics. Thus, add bootcpus kernel parameter to control which CPUs should be brought online during kernel boot. When both maxcpus and bootcpus is set, the more restrictive of the two are booted.

---
 Documentation/admin-guide/kernel-parameters.txt |  8 +++++++
 include/linux/cpu.h                             |  2 +-
 kernel/cpu.c                                    |  4 ++--
 kernel/smp.c                                    | 28 +++++++++++++++++++++++--
 4 files changed, 37 insertions(+), 5 deletions(-)
Documentation/admin-guide/kernel-parameters.txt +8 -0
index 65d047f..ea31af3 100644
@@ -449,6 +449,14 @@
 
 			See Documentation/admin-guide/bootconfig.rst
 
+	bootcpus=	[SMP]  List of processors that an SMP kernel
+			will bring up during bootup. Similar to maxcpus, except
+			as a cpu list as described above. The more restrictive
+			of maxcpus and bootcpus applies. If bootcpus=1-3 and
+			maxcpus=2, only processors 1 and 2 are booted. As with
+			maxcpus, you can bring up other plugged cpu by executing
+			"echo 1 > /sys/devices/system/cpu/cpuX/online"
+
 	bert_disable	[ACPI]
 			Disable BERT OS support on buggy BIOSes.
 
include/linux/cpu.h +1 -1
index 8aa84c0..4146f71 100644
@@ -95,7 +95,7 @@ void notify_cpu_starting(unsigned int cpu);
 extern void cpu_maps_update_begin(void);
 extern void cpu_maps_update_done(void);
 int bringup_hibernate_cpu(unsigned int sleep_cpu);
-void bringup_nonboot_cpus(unsigned int setup_max_cpus);
+void bringup_nonboot_cpus(unsigned int setup_max_cpus, cpumask_var_t boot_cpus);
 
 #else	/* CONFIG_SMP */
 #define cpuhp_tasks_frozen	0
kernel/cpu.c +2 -2
index 6ff2578..71f626b 100644
@@ -1328,14 +1328,14 @@ int bringup_hibernate_cpu(unsigned int sleep_cpu)
 	return 0;
 }
 
-void bringup_nonboot_cpus(unsigned int setup_max_cpus)
+void bringup_nonboot_cpus(unsigned int setup_max_cpus, cpumask_var_t boot_cpus)
 {
 	unsigned int cpu;
 
 	for_each_present_cpu(cpu) {
 		if (num_online_cpus() >= setup_max_cpus)
 			break;
-		if (!cpu_online(cpu))
+		if (!cpu_online(cpu) && cpumask_test_cpu(cpu, boot_cpus))
 			cpu_up(cpu, CPUHP_ONLINE);
 	}
 }
kernel/smp.c +26 -2
index 4d17501..727e003 100644
@@ -738,7 +738,7 @@ EXPORT_SYMBOL(smp_call_function);
 /* Setup configured maximum number of CPUs to activate */
 unsigned int setup_max_cpus = NR_CPUS;
 EXPORT_SYMBOL(setup_max_cpus);
-
+static cpumask_var_t boot_cpus;
 
 /*
  * Setup routine for controlling SMP activation
@@ -787,6 +787,27 @@ static int __init maxcpus(char *str)
 
 early_param("maxcpus", maxcpus);
 
+static int __init bootcpus(char *str)
+{
+	alloc_bootmem_cpumask_var(&boot_cpus);
+	if (cpulist_parse(str, boot_cpus) < 0) {
+		pr_warn("incorrect bootcpus mask\n");
+		return -EINVAL;
+	}
+	cpumask_set_cpu(smp_processor_id(), boot_cpus);
+	return 0;
+}
+
+early_param("bootcpus", bootcpus);
+
+static void __init boot_cpus_init(void)
+{
+	if (!cpumask_available(boot_cpus))
+		zalloc_cpumask_var(&boot_cpus, GFP_NOWAIT);
+	if (cpumask_empty(boot_cpus))
+		cpumask_setall(boot_cpus);
+}
+
 /* Setup number of possible processor ids */
 unsigned int nr_cpu_ids __read_mostly = NR_CPUS;
 EXPORT_SYMBOL(nr_cpu_ids);
@@ -804,10 +825,13 @@ void __init smp_init(void)
 
 	idle_threads_init();
 	cpuhp_threads_init();
+	boot_cpus_init();
 
 	pr_info("Bringing up secondary CPUs ...\n");
 
-	bringup_nonboot_cpus(setup_max_cpus);
+	bringup_nonboot_cpus(setup_max_cpus, boot_cpus);
+
+	free_bootmem_cpumask_var(boot_cpus);
 
 	num_nodes = num_online_nodes();
 	num_cpus  = num_online_cpus();
Signature · 2 lines
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project
maintainer
#1 lore raw
Quoted 7 lines · Elliot Berman

In a heterogeneous multiprocessor system, specifying the 'maxcpus' parameter on kernel command line does not provide sufficient control over which CPUs are brought online at kernel boot time, since CPUs may have nonuniform performance characteristics. Thus, add bootcpus kernel parameter to control which CPUs should be brought online during kernel boot. When both maxcpus and bootcpus is set, the more restrictive of the two are booted.

Why would one wish to do so? Having the ability for abilities sake is no good.

#2 lore raw
In reply to Elliot Berman
Quoted 7 lines · Elliot Berman

In a heterogeneous multiprocessor system, specifying the 'maxcpus' parameter on kernel command line does not provide sufficient control over which CPUs are brought online at kernel boot time, since CPUs may have nonuniform performance characteristics. Thus, add bootcpus kernel parameter to control which CPUs should be brought online during kernel boot. When both maxcpus and bootcpus is set, the more restrictive of the two are booted.

What for? 'maxcpus' is a debug hack at best and outright dangerous on certain architectures. Why do we need more of that? Just let the machine boot and offline the CPUs from user space.

Thanks,

tglx

#3 lore raw
Quoted 9 lines · Thomas Gleixner
Quoted 7 lines · Elliot Berman

In a heterogeneous multiprocessor system, specifying the 'maxcpus' parameter on kernel command line does not provide sufficient control over which CPUs are brought online at kernel boot time, since CPUs may have nonuniform performance characteristics. Thus, add bootcpus kernel parameter to control which CPUs should be brought online during kernel boot. When both maxcpus and bootcpus is set, the more restrictive of the two are booted.

Quoted 3 lines

What for? 'maxcpus' is a debug hack at best and outright dangerous on certain architectures. Why do we need more of that? Just let the machine boot and offline the CPUs from user space.

Hi Thomas and Peter,

Based on my understanding with maxcpus option provides, maximum no of CPUs are brough up during the device boot up. There is a different case, in which we want to restrict which CPUs to be brough up. On a system with 8 cpus, if we set maxcpus as 3, cpu0, cpu1, and cpu2 are brough up during the bootup. For example, if we want to bring core0, core3 and core4 current maxcpu(as 3) setting would not help us. On some platform we want the flexibility on which CPUs to bring up during the device bootup. bootcpus command line is helping to bring specific CPUs and these patches are working downstream.

Quoted 4 lines

Thanks,

tglx

maintainer
#4 lore raw
Quoted 17 lines · On Mon, Oct 26, 2020 at 10:08:47AM -0700, [email protected] wrote:
Quoted 10 lines · Thomas Gleixner
Quoted 8 lines · Elliot Berman

In a heterogeneous multiprocessor system, specifying the 'maxcpus' parameter on kernel command line does not provide sufficient control over which CPUs are brought online at kernel boot time, since CPUs may have nonuniform performance characteristics. Thus, add bootcpus kernel parameter to control which CPUs should be brought online during kernel boot. When both maxcpus and bootcpus is set, the more restrictive of the
two are booted.

Quoted 3 lines

What for? 'maxcpus' is a debug hack at best and outright dangerous on certain architectures. Why do we need more of that? Just let the machine boot and offline the CPUs from user space.

Hi Thomas and Peter,

Quoted 9 lines

Based on my understanding with maxcpus option provides, maximum no of CPUs are brough up during the device boot up. There is a different case, in which we want to restrict which CPUs to be brough up.
On a system with 8 cpus, if we set maxcpus as 3, cpu0, cpu1, and cpu2 are brough up during the bootup. For example, if we want to bring core0, core3 and core4 current maxcpu(as 3) setting would not help us.
On some platform we want the flexibility on which CPUs to bring up during the device bootup. bootcpus command line is helping to bring specific CPUs and these patches are working downstream.

That's a lot of words, but exactly 0 on _WHY_ you would want to do that.

#5 lore raw
Quoted 28 lines · Peter Zijlstra
Quoted 17 lines · On Mon, Oct 26, 2020 at 10:08:47AM -0700, [email protected] wrote:
Quoted 10 lines · Thomas Gleixner
Quoted 8 lines · Elliot Berman

In a heterogeneous multiprocessor system, specifying the 'maxcpus' parameter on kernel command line does not provide sufficient control over which CPUs are brought online at kernel boot time, since CPUs may have nonuniform performance characteristics. Thus, add bootcpus kernel parameter to control which CPUs should be brought online during kernel boot. When both maxcpus and bootcpus is set, the more restrictive of the
two are booted.

Quoted 3 lines

What for? 'maxcpus' is a debug hack at best and outright dangerous on certain architectures. Why do we need more of that? Just let the machine boot and offline the CPUs from user space.

Hi Thomas and Peter,

Quoted 9 lines

Based on my understanding with maxcpus option provides, maximum no of CPUs are brough up during the device boot up. There is a different case, in which we want to restrict which CPUs to be brough up.
On a system with 8 cpus, if we set maxcpus as 3, cpu0, cpu1, and cpu2 are brough up during the bootup. For example, if we want to bring core0, core3 and core4 current maxcpu(as 3) setting would not help us.
On some platform we want the flexibility on which CPUs to bring up during the device bootup. bootcpus command line is helping to bring specific CPUs and these patches are working downstream.

Quoted 2 lines

That's a lot of words, but exactly 0 on _WHY_ you would want to do that.

We find the ability to limit the number of cpus brought online at bootup useful, and to possibly later enable those cores. One use case is when device is undergoing initial testing is to use bootcpus to limit bootup to only a couple cores and later bring up the other cores for a controlled stress test. A core brought up during boot is also running device initialization. Besides being useful for SoC vendor bringup which typically occurs downstream, this particular use case could be exercised by developer of upstream support for a SoC when initial CPU settings are being determined.

Another use case is if user wishes to limit bootup only to the smaller or bigger cores. maxcpus= is not sufficient here to ensure that only those cores are booted since it limits only to the first N cores, which may not be the desired small or big cores. User may want to bring up only the smaller cores during bootup for thermal reasons. For instance, device may be later sufficiently charged such that boot up of the bigger cores is now permissible. Relying on thermal drivers to later take care of putting core into lower power idle may not occur until much later in boot (for instance, if the governor is a module).

#6 lore raw

Hi Elliot

+ Sudeep

Quoted 43 lines · Elliot Berman
Quoted 28 lines · Peter Zijlstra
Quoted 17 lines · On Mon, Oct 26, 2020 at 10:08:47AM -0700, [email protected] wrote:
Quoted 10 lines · Thomas Gleixner
Quoted 8 lines · Elliot Berman

In a heterogeneous multiprocessor system, specifying the 'maxcpus' parameter on kernel command line does not provide sufficient control over which CPUs are brought online at kernel boot time, since CPUs may have nonuniform performance characteristics. Thus, add bootcpus kernel parameter to control which CPUs should be brought online during kernel boot. When both maxcpus and bootcpus is set, the more restrictive of the
two are booted.

Quoted 3 lines

What for? 'maxcpus' is a debug hack at best and outright dangerous on certain architectures. Why do we need more of that? Just let the machine boot and offline the CPUs from user space.

Hi Thomas and Peter,

Quoted 9 lines

Based on my understanding with maxcpus option provides, maximum no of CPUs are brough up during the device boot up. There is a different case, in which we want to restrict which CPUs to be brough up.
On a system with 8 cpus, if we set maxcpus as 3, cpu0, cpu1, and cpu2 are brough up during the bootup. For example, if we want to bring core0, core3 and core4 current maxcpu(as 3) setting would not help us.
On some platform we want the flexibility on which CPUs to bring up during the device bootup. bootcpus command line is helping to bring specific CPUs and these patches are working downstream.

Quoted 2 lines

That's a lot of words, but exactly 0 on _WHY_ you would want to do that.

We find the ability to limit the number of cpus brought online at bootup useful, and to possibly later enable those cores. One use case is when device is undergoing initial testing is to use bootcpus to limit bootup to only a couple cores and later bring up the other cores for a controlled stress test. A core brought up during boot is also running device initialization. Besides being useful for SoC vendor bringup which typically occurs downstream, this particular use case could be exercised by developer of upstream support for a SoC when initial CPU settings are being determined.

Quoted 9 lines

Another use case is if user wishes to limit bootup only to the smaller or bigger cores. maxcpus= is not sufficient here to ensure that only those cores are booted since it limits only to the first N cores, which may not be the desired small or big cores. User may want to bring up only the smaller cores during bootup for thermal reasons. For instance, device may be later sufficiently charged such that boot up of the bigger cores is now permissible. Relying on thermal drivers to later take care of putting core into lower power idle may not occur until much later in boot (for instance, if the governor is a module).

I would have thought that FW/SCP would have the power to block booting up the CPUs if it deemed that to be unsafe.

Any thoughts Sudeep?

Thanks

--
Qais Yousef

#7 lore raw
Quoted 22 lines · Qais Yousef

Hi Elliot

+ Sudeep

Quoted 17 lines · Elliot Berman
Quoted 15 lines · Peter Zijlstra
Quoted 14 lines · On Mon, Oct 26, 2020 at 10:08:47AM -0700, [email protected] wrote:
Quoted 13 lines · Thomas Gleixner
Quoted 8 lines · Elliot Berman

In a heterogeneous multiprocessor system, specifying the 'maxcpus' parameter on kernel command line does not provide sufficient control over which CPUs are brought online at kernel boot time, since CPUs may have nonuniform performance characteristics. Thus, add bootcpus kernel parameter to control which CPUs should be brought online during kernel boot. When both maxcpus and bootcpus is set, the more restrictive of the
two are booted.

What for? 'maxcpus' is a debug hack at best and outright dangerous on certain architectures. Why do we need more of that? Just let the machine boot and offline the CPUs from user space.

Completely agreed, this is what I have suggested people in the past.

Quoted 13 lines
Quoted 13 lines
Quoted 13 lines
Quoted 12 lines

Hi Thomas and Peter,

Based on my understanding with maxcpus option provides, maximum no of CPUs are brough up during the device boot up. There is a different case, in which we want to restrict which CPUs to be brough up.
On a system with 8 cpus, if we set maxcpus as 3, cpu0, cpu1, and cpu2 are brough up during the bootup. For example, if we want to bring core0, core3 and core4 current maxcpu(as 3) setting would not help us.
On some platform we want the flexibility on which CPUs to bring up during the device bootup. bootcpus command line is helping to bring specific CPUs and these patches are working downstream.

Either offline "unwanted" CPUs from user space. If that is not possible for whatever thermal reasons, we need to check if we can disable them in the DT like ACPI does. IIUC, it is not supported for some reasons I need to recall/check, can't remember that now. If that is not possible, make those nodes disappear in the bootloader ?

Quoted 13 lines
Quoted 13 lines
Quoted 2 lines

That's a lot of words, but exactly 0 on _WHY_ you would want to do that.

We find the ability to limit the number of cpus brought online at bootup useful, and to possibly later enable those cores. One use case is when device is undergoing initial testing is to use bootcpus to limit bootup to only a couple cores and later bring up the other cores for a controlled stress test. A core brought up during boot is also running device initialization. Besides being useful for SoC vendor bringup which typically occurs downstream, this particular use case could be exercised by developer of upstream support for a SoC when initial CPU settings are being determined.

Why not try single core instead of couple of core and add the needed ones for the user-space ?

Quoted 10 lines
Quoted 9 lines

Another use case is if user wishes to limit bootup only to the smaller or bigger cores. maxcpus= is not sufficient here to ensure that only those cores are booted since it limits only to the first N cores, which may not be the desired small or big cores. User may want to bring up only the smaller cores during bootup for thermal reasons. For instance, device may be later sufficiently charged such that boot up of the bigger cores is now permissible. Relying on thermal drivers to later take care of putting core into lower power idle may not occur until much later in boot (for instance, if the governor is a module).

Quoted 3 lines

I would have thought that FW/SCP would have the power to block booting up the CPUs if it deemed that to be unsafe.

I think it is more like *desire* to run with whatever battery life is left rather than *unsafe* to bring up the core.

Also not sure if we can put such battery life related policies in the firmware. If there is a thermal constraint, I am sure f/w will and must refuse to boot the core. I doubt if we are talking about that here. It is more a policy to extract max out of the battery life left, at-least the way I see this issue. I may not have full context here, sorry.

Signature · 2 lines
Regards,
Sudeep
#8 lore raw
Quoted 13 lines · Sudeep Holla
Quoted 12 lines
Quoted 12 lines
Quoted 12 lines
Quoted 11 lines

Hi Thomas and Peter,

Based on my understanding with maxcpus option provides, maximum no of CPUs are brough up during the device boot up. There is a different case, in which we want to restrict which CPUs to be brough up.
On a system with 8 cpus, if we set maxcpus as 3, cpu0, cpu1, and cpu2 are brough up during the bootup. For example, if we want to bring core0, core3 and core4 current maxcpu(as 3) setting would not help us.
On some platform we want the flexibility on which CPUs to bring up during the device bootup. bootcpus command line is helping to bring specific CPUs and these patches are working downstream.

Quoted 6 lines

Either offline "unwanted" CPUs from user space. If that is not possible for whatever thermal reasons, we need to check if we can disable them in the DT like ACPI does. IIUC, it is not supported for some reasons I need to recall/check, can't remember that now. If that is not possible, make those nodes disappear in the bootloader ?

If I disappear the cpu nodes in bootloader, then I can't later online these cpus back up when policy permits. In our experience, there is a performance hit of ~100ms to modify any devicetree node in bootloader, which is significant on a commercial device wanting to disable bootup of certain cores for thermal.

Quoted 14 lines
Quoted 13 lines
Quoted 13 lines
Quoted 2 lines

That's a lot of words, but exactly 0 on _WHY_ you would want to do that.

We find the ability to limit the number of cpus brought online at bootup useful, and to possibly later enable those cores. One use case is when device is undergoing initial testing is to use bootcpus to limit bootup to only a couple cores and later bring up the other cores for a controlled stress test. A core brought up during boot is also running device initialization. Besides being useful for SoC vendor bringup which typically occurs downstream, this particular use case could be exercised by developer of upstream support for a SoC when initial CPU settings are being determined.

Quoted 2 lines

Why not try single core instead of couple of core and add the needed ones for the user-space ?

In some instances, we have seen that further debugging is needed from firmware or hardware teams. In these instances, we wanted device to still be able to do SMP boot, but with a few cores disabled.

In the case where commercial device is using feature for thermal, device should boot multiple small cores. Booting only one core means we would not be able to use all possible cores to maximum extent possible in this thermal case.

Quoted 14 lines
Quoted 10 lines
Quoted 9 lines

Another use case is if user wishes to limit bootup only to the smaller or bigger cores. maxcpus= is not sufficient here to ensure that only those cores are booted since it limits only to the first N cores, which may not be the desired small or big cores. User may want to bring up only the smaller cores during bootup for thermal reasons. For instance, device may be later sufficiently charged such that boot up of the bigger cores is now permissible. Relying on thermal drivers to later take care of putting core into lower power idle may not occur until much later in boot (for instance, if the governor is a module).

Quoted 3 lines

I would have thought that FW/SCP would have the power to block booting up the CPUs if it deemed that to be unsafe.

Quoted 8 lines

I think it is more like *desire* to run with whatever battery life is left rather than *unsafe* to bring up the core.

Also not sure if we can put such battery life related policies in the firmware. If there is a thermal constraint, I am sure f/w will and must refuse to boot the core. I doubt if we are talking about that here. It is more a policy to extract max out of the battery life left, at-least the way I see this issue. I may not have full context here, sorry.

This is correct, FW here does not actually prevent core from starting since it is not a significant enough thermal issue.

#9 lore raw
Quoted 21 lines · Elliot Berman
Quoted 13 lines · Sudeep Holla
Quoted 12 lines
Quoted 12 lines
Quoted 12 lines
Quoted 11 lines

Hi Thomas and Peter,

Based on my understanding with maxcpus option provides, maximum no of CPUs are brough up during the device boot up. There is a different case, in which we want to restrict which CPUs to be brough up.
On a system with 8 cpus, if we set maxcpus as 3, cpu0, cpu1, and cpu2 are brough up during the bootup. For example, if we want to bring core0, core3 and core4 current maxcpu(as 3) setting would not help us.
On some platform we want the flexibility on which CPUs to bring up during the device bootup. bootcpus command line is helping to bring specific CPUs and these patches are working downstream.

Quoted 6 lines

Either offline "unwanted" CPUs from user space. If that is not possible for whatever thermal reasons, we need to check if we can disable them in the DT like ACPI does. IIUC, it is not supported for some reasons I need to recall/check, can't remember that now. If that is not possible, make those nodes disappear in the bootloader ?

Quoted 2 lines

If I disappear the cpu nodes in bootloader, then I can't later online these cpus back up when policy permits.

No I meant, to have policy in bootloader and manage device nodes based on what you need in that boot.

Quoted 4 lines

In our experience, there is a performance hit of ~100ms to modify any devicetree node in bootloader, which is significant on a commercial device wanting to disable bootup of certain cores for thermal.

I bet that performance hit is nowhere close to what you may have when you offline a bunch of big cores, so I dismiss that, sorry.

Quoted 14 lines
Quoted 14 lines
Quoted 13 lines
Quoted 13 lines
Quoted 2 lines

That's a lot of words, but exactly 0 on _WHY_ you would want to do that.

We find the ability to limit the number of cpus brought online at bootup useful, and to possibly later enable those cores. One use case is when device is undergoing initial testing is to use bootcpus to limit bootup to only a couple cores and later bring up the other cores for a controlled stress test. A core brought up during boot is also running device initialization. Besides being useful for SoC vendor bringup which typically occurs downstream, this particular use case could be exercised by developer of upstream support for a SoC when initial CPU settings are being determined.

Quoted 7 lines
Quoted 2 lines

Why not try single core instead of couple of core and add the needed ones for the user-space ?

In some instances, we have seen that further debugging is needed from firmware or hardware teams. In these instances, we wanted device to still be able to do SMP boot, but with a few cores disabled.

Still manageable with different configuration in the bootloader.

Quoted 5 lines

In the case where commercial device is using feature for thermal, device should boot multiple small cores. Booting only one core means we would not be able to use all possible cores to maximum extent possible in this thermal case.

I understood that point. But you haven't responded on my logical vs physical number argument. I am clearly NACKing this patch as is for just usage of logical CPU IDs in the command line while your intention is to control the physical CPUs. So once again, NACK for that reason.

Quoted 17 lines
Quoted 17 lines
Quoted 10 lines
Quoted 9 lines

Another use case is if user wishes to limit bootup only to the smaller or bigger cores. maxcpus= is not sufficient here to ensure that only those cores are booted since it limits only to the first N cores, which may not be the desired small or big cores. User may want to bring up only the smaller cores during bootup for thermal reasons. For instance, device may be later sufficiently charged such that boot up of the bigger cores is now permissible. Relying on thermal drivers to later take care of putting core into lower power idle may not occur until much later in boot (for instance, if the governor is a module).

Quoted 3 lines

I would have thought that FW/SCP would have the power to block booting up the CPUs if it deemed that to be unsafe.

I think it is more like *desire* to run with whatever battery life is left rather than *unsafe* to bring up the core.

Quoted 8 lines
Quoted 5 lines

Also not sure if we can put such battery life related policies in the firmware. If there is a thermal constraint, I am sure f/w will and must refuse to boot the core. I doubt if we are talking about that here. It is more a policy to extract max out of the battery life left, at-least the way I see this issue. I may not have full context here, sorry.

This is correct, FW here does not actually prevent core from starting since it is not a significant enough thermal issue.

Thanks for confirming.

--
Regards,
Sudeep

#10 lore raw
Quoted 10 lines · Sudeep Holla
Quoted 4 lines · Elliot Berman

In the case where commercial device is using feature for thermal, device should boot multiple small cores. Booting only one core means we would not be able to use all possible cores to maximum extent possible in this thermal case.

I understood that point. But you haven't responded on my logical vs physical number argument. I am clearly NACKing this patch as is for just usage of logical CPU IDs in the command line while your intention is to control the physical CPUs. So once again, NACK for that reason.

Correct. And no, we are not going to add a command line option to select physical CPU ids.

There are two ways to solve that:

1) The firmware can tell the kernel whether a CPU should be brought up or not, e.g. by failing the bootup request.

2) The kernel has a way to figure out the current thermal and/or power budget early in the boot process and sorts out which and how many CPUs fit into that limit.

Thanks,

tglx

#11 lore raw
In reply to [email protected]
Quoted 3 lines · psodagud

Based on my understanding with maxcpus option provides, maximum no of CPUs are brough up during the device boot up. There is a different case, in which we want to restrict which CPUs to be brough up.

Again: What for? Why?

Quoted 6 lines

On a system with 8 cpus, if we set maxcpus as 3, cpu0, cpu1, and cpu2 are brough up during the bootup. For example, if we want to bring core0, core3 and core4 current maxcpu(as 3) setting would not help us. On some platform we want the flexibility on which CPUs to bring up during the device bootup. bootcpus command line is helping to bring specific CPUs and these patches are working downstream.

A lot of patches work downstream by some definition of work. But that does not make an argument to bring them upstream.

Thanks,

tglx

#12 lore raw
In reply to Elliot Berman

Hi Elliot

Quoted 4 lines · Elliot Berman

In a heterogeneous multiprocessor system, specifying the 'maxcpus' parameter on kernel command line does not provide sufficient control over which CPUs are brought online at kernel boot time, since CPUs may have nonuniform performance characteristics. Thus, add bootcpus kernel

Are you seeing boot time issues on big.LITTLE systems that's why you need this extra config? If so it'll be good to elaborate on the problem. Scheduler should place the heavy tasks on bigs. It'll be good to understand what's failing in here as this might not be addressing the root cause.

Thanks

--
Qais Yousef

Quoted 3 lines

parameter to control which CPUs should be brought online during kernel boot. When both maxcpus and bootcpus is set, the more restrictive of the two are booted.

#13 lore raw
In reply to Elliot Berman
Quoted 23 lines · Elliot Berman

In a heterogeneous multiprocessor system, specifying the 'maxcpus' parameter on kernel command line does not provide sufficient control over which CPUs are brought online at kernel boot time, since CPUs may have nonuniform performance characteristics. Thus, add bootcpus kernel parameter to control which CPUs should be brought online during kernel boot. When both maxcpus and bootcpus is set, the more restrictive of the two are booted.

---
 Documentation/admin-guide/kernel-parameters.txt |  8 +++++++
 include/linux/cpu.h                             |  2 +-
 kernel/cpu.c                                    |  4 ++--
 kernel/smp.c                                    | 28 +++++++++++++++++++++++--
 4 files changed, 37 insertions(+), 5 deletions(-)
Documentation/admin-guide/kernel-parameters.txt +0 -0
index 65d047f..ea31af3 100644
@@ -449,6 +449,14 @@
 

Documentation/admin-guide/kernel-parameters.txt line 459

Quoted 10 lines
Documentation/admin-guide/kernel-parameters.txt +8 -0
                        See Documentation/admin-guide/bootconfig.rst
 
+       bootcpus=       [SMP]  List of processors that an SMP kernel
+                       will bring up during bootup. Similar to maxcpus, except
+                       as a cpu list as described above. The more restrictive
+                       of maxcpus and bootcpus applies. If bootcpus=1-3 and
+                       maxcpus=2, only processors 1 and 2 are booted. As with
+                       maxcpus, you can bring up other plugged cpu by executing
+                       "echo 1 > /sys/devices/system/cpu/cpuX/online"
+

There is a fundamental assumption here that the user of this cmdline understands how
the logical cpu numbers are allocated for the physical cpus. Based on the discussion
I understand that you want to boot specific physical cpus for whatever reasons and
here you want to specify the logical cpu numbers for them. So NACK for that concept
alone irrespective of whether this concept as a whole is acceptable or not.

Signature · 2 lines
Regards,
Sudeep