【发布时间】:2016-07-30 03:34:19
【问题描述】:
我正在浏览 Linux 内核代码以了解 nr_cpus 引导参数。
根据文档,
(https://www.kernel.org/doc/Documentation/kernel-parameters.txt)
[SMP] Maximum number of processors that an SMP kernel
could support. nr_cpus=n : n >= 1 limits the kernel to
supporting 'n' processors. Later in runtime you can not
use hotplug cpu feature to put more cpu back to online.
just like you compile the kernel NR_CPUS=n
在smp.c 代码中,该值设置为nr_cpu_ids,然后在内核中的任何地方使用。
http://lxr.free-electrons.com/source/kernel/smp.c
527 static int __init nrcpus(char *str)
528 {
529 int nr_cpus;
530
531 get_option(&str, &nr_cpus);
532 if (nr_cpus > 0 && nr_cpus < nr_cpu_ids)
533 nr_cpu_ids = nr_cpus;
534
535 return 0;
536 }
537
538 early_param("nr_cpus", nrcpus);
我不明白的 nr_cpu_ids 也是由 setup_nr_cpu_ids 设置的。
555 /* An arch may set nr_cpu_ids earlier if needed, so this would be redundant */
556 void __init setup_nr_cpu_ids(void)
557 {
558 nr_cpu_ids = find_last_bit(cpumask_bits(cpu_possible_mask),NR_CPUS) + 1;
559 }
最初,我认为这是在early_param调用之前调用的。添加日志后,我发现setup_nr_cpu_ids()在nr_cpus()之后调用。 nr_cpu_ids 始终设置为setup_nr_cpu_ids() 中设置的值,而不是nr_cpus()。我什至在smp_init() 中验证了它的价值。
如果我的观察是正确的或没有?nr_cpu_ids的具体用法是什么?
【问题讨论】:
-
这听起来有点奇怪,因为 setup_nr_cpu_ids 在此处lxr.free-electrons.com/source/init/main.c#L531 的第 531 行被调用,而 early_param 函数在第 539 行运行
-
发生这种情况是因为每个架构都实现了一个 setup_arch() 函数,该函数调用 parse_early_param()。 lxr.free-electrons.com/source/arch/x86/kernel/setup.c#L983 setup_arch() 在第 528 行调用
标签: linux linux-kernel smp