2016-04-08 11 views
1

Linuxカーネルコードを参照して、nr_cpusブートパラメータを理解していました。 smp.cコードでドキュメントを1として 、 (https://www.kernel.org/doc/Documentation/kernel-parameters.txtLinuxカーネルのnr_cpusブートパラメータ

[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 

、値は、カーネル内でどこでも使用されている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の呼び出しの前に呼び出されたと考えました。ログを追加した後、nr_cpus()の後にsetup_nr_cpu_ids()が呼び出されました。 nr_cpu_idsは、nr_cpus()ではなく、常にsetup_nr_cpu_ids()の値セットに設定されています。私はsmp_init()でその価値を確認しました。

私の観察が正しいかどうか誰でも明確にしてください。
nr_cpu_idsの正確な使用法は何ですか?

+0

setup_nr_cpu_idsが531行目でhttp://lxr.free-electrons.com/source/init/main.c#L531で呼び出されているのに対して、early_param関数が539行で実行されている間は少し奇妙に聞こえます – nos

+0

すべてのアーキテクチャには、parse_early_param()を呼び出すsetup_arch()関数が実装されているためです。 http://lxr.free-electrons.com/source/arch/x86/kernel/setup.c#L983 setup_arch()は528行で呼び出されます – alex

答えて

1

通常、アーチはシステム上で使用可能なCPUの数を検出します。しかし、あなたが使用したいCPUの数を減らすことが可能です。そして、その理由でnr_cpusパラメータが導入されました。デフォルトでは誰もこのパラメータを使用しません。その場合、アーチコードはシステム上で使用可能なCPUの数を検出する責任があります。つまり、x86アーチの場合prefill_possible_mapです。checknr_cpusが渡されたかどうかを調べます。 nr_cpusが渡された場合、thatの値が使用されます。アーチが利用可能なCPUの数を検出した後、setup_nr_cpu_idskenrel/smp.cnr_cpu_idsの値を確定します。重複しているように聞こえるかもしれませんが、動作するので誰も苦情を言わないので注意してください。

したがって、あなたの所見は部分的に正しいです。つまり、アーチsmpbootコードがnr_cpusをどのように統合しているかという点です。これがあなたの理解を明確にすることを願っています。

+0

ありがとうございます。私は、cpu_possible_maxをnr_cpus値に変更するprefill_possible_map関数を見逃しました。 – alex

3

文書の一部として、あなたの質問から説明します

Maximum number of processors that an SMP kernel could support 

実際にこれらの両方の機能のは、同じことを行います。 early_param()は、カーネルコマンドラインの最初のパラメータを検索する機能を提供し、検索が成功した場合、early_param()の2番目のパラメータに記載されている関数が呼び出されます。

early_paramとマークされたすべての機能は、setup_arch関数から呼び出されるinit/main.cからdo_early_param()で呼び出されます。 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で説明したように:

可能マップは早く設定したというよりもNR_CPUS nr_cpu_idsに割り当てにirqstacksのようなものの を制限することを可能にします。この特に

0

チェックアウトcpumask.h、...

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はブートparamはそれを設定するために使用されるパスの最大使用可能なCPUとnr_cpusです。これはカーネル3.16で私にとっては何をしているのですか?

ここ

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に既に設定されています。