gpt4 book ai didi

c - 即使使用了 pragma unroll,BPF 验证程序也会由于后沿而拒绝 XDP 程序

转载 作者:行者123 更新时间:2023-11-30 18:10:35 26 4
gpt4 key购买 nike

所以,根据标题,我正在尝试加载 XDP 程序,令人惊讶的是 bpf 验证器向我吐口水,并出现著名的后沿错误:

libbpf: load bpf program failed: Invalid argument
libbpf: -- BEGIN DUMP LOG ---
libbpf:
back-edge from insn 271 to 69

libbpf: -- END LOG --
libbpf: failed to load program 'xdp_prog'

尽管我的受限 ebpf C 代码中唯一的 for 循环(迭代次数在编译时已知)由 pragma unroll 保护。下面的代码片段显示了 __always_inlined 函数中定义的受影响的 for 循环:

#pragma unroll
for (i = 0; i < 8; i++)
{
int k = idx + i;
mask = bpf_map_lookup_elem(&a_map, &k);
if (!mask || (mask->an_idx == 0))
return -1;

*m_key = *key;
foo(m_key, mask); // an __alwais_inline func

id = bpf_map_lookup_elem(&b_map, m_key);
if (id)
{
*out_id = *id;
return 0;
}
}

也许问题是 clang 无法展开循环?如果是的话,为什么会失败,有什么解决方法吗?手动展开循环是 Not Acceptable ,因为它会导致可怕的、不可维护且不可读的代码。

哦,我正在合作:

  • 内核4.19.3
  • llvm-clang 8

有什么想法吗?

更新
只是注意到,即使下面的虚拟 for 循环似乎也没有展开,bpf 验证器提示后端:

#pragma unroll
for (i = 0; i < 8; i++)
{
int k = i;
mask = bpf_map_lookup_elem(&a_map, &k);
}

只有我觉得这没有任何意义吗?

最佳答案

我编写了以下代码,并且它有效。

#pragma clang loop unroll(full)
for (int i = 0; i < 128; i++)
{
if (bpf_map_lookup_elem(&conntrack_hash_tab, &reply_key) == NULL)
{
break;
}
reply_key.dport = reply_key.dport+1;
}

关于c - 即使使用了 pragma unroll,BPF 验证程序也会由于后沿而拒绝 XDP 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56872436/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com