3

我需要遍历每个 CPU,以便per_cpu从它们中获取值,但 Linux 内核 2.6.26.5 版本中似乎没有for_each_cpu(i)宏。

我怎样才能实现以下目标?

for_each_cpu(i)
    per_cpu(vm_event_states, i)
4

1 回答 1

10

回到 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()就是你想要的。

于 2012-11-19T03:03:23.587 回答