是:BPF 如何计算 PERCPU_ARRAY 的 CPU 的数量?

Was: How does BPF calculate number of CPU for PERCPU_ARRAY?

我遇到了一个有趣的问题,在一个有 2 个处理器的系统上创建的 PERCPU_ARRAY 创建了一个包含 2 个 per-CPU 元素的数组,而在另一个有 2 个处理器的系统上,一个包含 128 个元素的数组每 CPU 个元素。后者出乎我的意料!

我发现这种行为的方式是,一个程序为 CPU 的数量分配了一个数组(使用 get_nprocs_conf(3)),然后将 PERCPU_ARRAY 读入其中(使用 bpf_map_lookup_elem()) 最终写入数组末尾并崩溃。

我想找出在读取 BPF 的程序中确定系统中使用的 PERCPU_ARRAY 中元素数量的正确方法是什么。

否则,我认为第二好的方法是选择一个“足够大”的缓冲区进行读取。在这里,问题是相似的:那个数字是多少,有没有办法在运行时学习它?

问题来自于阅读 bpftool 的源代码,它解决了这个问题:

unsigned int get_possible_cpus(void)
{
        int cpus = libbpf_num_possible_cpus();
        
        if (cpus < 0) {
                p_err("Can't get # of possible cpus: %s", strerror(-cpus));
                exit(-1);
        }
        return cpus;
}

int libbpf_num_possible_cpus(void)
{       
        static const char *fcpu = "/sys/devices/system/cpu/possible";
        static int cpus;
        int err, n, i, tmp_cpus;
        bool *mask;

/* ---8<--- snip */

}

所以他们就是这样的!