首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Linux内核中的nr_cpus引导参数

Linux内核中的nr_cpus引导参数
EN

Stack Overflow用户
提问于 2016-04-08 18:38:21
回答 3查看 4.4K关注 0票数 3

我正在浏览Linux内核代码以了解nr_cpus引导参数。根据文档,(https://www.kernel.org/doc/Documentation/kernel-parameters.txt)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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设置的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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调用之前调用的。添加日志后,我发现在nr_cpus()之后调用setup_nr_cpu_ids()nr_cpu_ids始终设置为setup_nr_cpu_ids()中的值集,而不是nr_cpus()。我甚至在smp_init()中验证了它的价值。

有没有人能澄清一下我的观察是否正确?

nr_cpu_ids的确切用法是什么

EN

回答 3

Stack Overflow用户

发布于 2016-04-09 13:19:15

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Maximum number of processors that an SMP kernel could support

实际上,这两个函数的作用是相同的。early_param()提供了在内核命令行中搜索第一个参数的功能,如果搜索成功,将调用early_param()的第二个参数中记录的函数。

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

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

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

通过提前设置可能的映射,

允许我们将irqstack等内容的分配限制到nr_cpu_ids而不是NR_CPUS。

票数 6
EN

Stack Overflow用户

发布于 2016-04-09 08:14:16

通常,arch会检测系统上可用的cpus数量。但是,可以减少您想要使用的cpus数量。因此,引入了nr_cpus参数。默认情况下,没有人使用这个参数,在这种情况下,arch代码负责检测系统上可用的cpus数量,即对于x86 arch,请查看prefill_possible_map,其中生成check以查看是否传递了nr_cpus。如果传递了nr_cpus,则使用that值。在arch检测到可能的cpus数量之后,kenrel/smp.c中的setup_nr_cpu_ids最终确定nr_cpu_ids的值。请注意,这听起来可能是多余的,但由于它是有效的,所以没有人抱怨。

因此,您的观察是部分正确的,因为您忽略了arch smpboot代码如何集成nr_cpus这一点。希望这能澄清你的理解。

票数 1
EN

Stack Overflow用户

发布于 2016-04-09 22:37:23

检出cpumask.h,特别是这个...

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
787 #define for_each_cpu_mask_nr(cpu, mask)                 \
788         for ((cpu) = -1;                                \
789                 (cpu) = __next_cpu_nr((cpu), &(mask)),  \
790                 (cpu) < nr_cpu_ids; )

nr_cpu_ids是可用cpus的最大值,您作为引导参数传递的nr_cpus用于设置它。这就是它在3.16内核中为我做的事情。

这里的评论

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 }

意思是如果你已经设置了nr_cpu_ids,那么这个调用就是多余的。原因是cpu_possible_mask已经设置为nr_cpu_id

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36506912

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文