因此,作为标题,我试图加载一个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代码中唯一的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没能打开循环?如果这是正确的,为什么失败了,有什么解决办法吗?手动展开循环是不可接受的,因为它会导致可怕的、不可维护的和不可读的代码。
哦,我在和:
有什么想法吗?
更新
只是注意到,即使是下面的虚拟循环似乎也没有展开,bpf验证器抱怨后边:
#pragma unroll
for (i = 0; i < 8; i++)
{
int k = i;
mask = bpf_map_lookup_elem(&a_map, &k);
}就我一个人没什么意义吗?
发布于 2019-07-29 07:23:53
我编写了下面的代码,它可以工作。
#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;
}https://stackoverflow.com/questions/56872436
复制相似问题