verifier 支持有限循环后,我们不再需要 #pragma unrollfor 循环展开了,留给 clang 编译器决定即可。

也就是,eBPF Talk: binary search 里的 __should_delay_sip() 函数里不再需要 #pragma clang loop unroll(full) 了。

对于 for 循环套 for 循环的情况,去掉 #pragma unroll 后,编译得到的 .o 文件大小缩小了:从 75KB 缩小到 36KB。

更通用的循环

在 6.4 kernel 里,实现了更加通用的循环:

例子如下:

1
2
3
4
5
6
7
8
    struct bpf_iter_num it;
    int cnt = 0, *v;

    bpf_iter_num_new(&it, 0, 10);
    while ((v = bpf_iter_num_next(&it))) {
        cnt++;
    }
    bpf_iter_num_destroy(&it);

使用宏封装一下:

1
2
3
4
// https://github.com/torvalds/linux/blob/master/tools/lib/bpf/bpf_helpers.h#L357

    int i;
    bpf_for(i, 0, 10) cnt++;