linux内核,如何循环遍历所有cpu?

时间:2012-11-18 01:52:20

标签: c linux-kernel kernel

我需要循环遍历每个cpu,以便从中获取per_cpu值,但似乎没有for_each_cpu(i)宏。 linux内核版本是2.6.26.5

我想做类似的事情:

for_each_cpu(i)
    per_cpu(vm_event_states, i)

1 个答案:

答案 0 :(得分:7)

回到2.6.26内核,for_each_cpu()被称为for_each_cpu_mask()。它在cpumask.h中定义,并带有两个参数 - 迭代器和掩码。掩码是cpumask_t左值,它定义了要迭代的CPU集。

有三个辅助宏只需要一个迭代器 - 你可能想要使用其中一个:

for_each_possible_cpu(cpu)
for_each_present_cpu(cpu)
for_each_online_cpu(cpu)

for_each_possible_cpu()遍历内核启动时可能存在的所有CPU; for_each_present_cpu()遍历当前存在的所有CPU(在不支持CPU热插拔的系统上,这两个是相同的);并且for_each_online_cpu()遍历当前已启用且可供调度程序使用的所有CPU。

请注意,for_each_online_cpu()应在get_online_cpus() / put_online_cpus()部分中使用,以防止在迭代时更改在线CPU地图。

for_each_possible_cpu()很可能就是你想要的。