Linux内核中的nr_cpus引导参数

ale*_*lex 3 linux smp linux-kernel

我正在浏览 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
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

我不明白的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 }
Run Code Online (Sandbox Code Playgroud)

最初,我认为这是在early_param调用之前调用的。添加日志后,我发现它setup_nr_cpu_ids()是在nr_cpus(). nr_cpu_ids始终设置为 中设置的值setup_nr_cpu_ids()而不是nr_cpus()。我什至在smp_init().

有人可以澄清我的观察是否正确吗?
的确切用法是nr_cpu_ids什么?

0xA*_*xAX 6

作为文档的一部分,您的问题描述了:

Maximum number of processors that an SMP kernel could support
Run Code Online (Sandbox Code Playgroud)

实际上这两个函数的作用是一样的。所述early_param()提供来搜索所述第一参数在内核命令行能力和如果搜索是成功的,这是在的所述第二参数中提到的功能early_param()将被调用。

所有标记为 的函数都early_paramdo_early_param()init/main.c中调用,该setup_arch函数将从该函数中调用。该setup_arch功能是特定于体系结构的,每个体系结构都提供了自己的setup_arch(). 因此,在调用该nrcpus()函数之后,nr_cpu_ids将包含内核可以支持的处理器数量。

如果您查看 Linux 内核源代码,您会注意到该setup_nr_cpu_ids()函数将在init/main.c中被标记为 的函数之后调用early_param。所以在这种情况下它是多余的。但有时提前获取处理器数量可能会很有用。

例如,您可以在powerpc架构中看到它。如调用的函数的注释中所述:smp_setup_cpu_maps()setup_nr_cpu_ids()

尽早设置可能的映射允许我们将诸如 irqstacks 之类的东西的分配限制为 nr_cpu_ids 而不是 NR_CPUS。