首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BPF验证器由于后端而拒绝XDP程序,即使使用了务实展开。

BPF验证器由于后端而拒绝XDP程序,即使使用了务实展开。
EN

Stack Overflow用户
提问于 2019-07-03 14:32:55
回答 1查看 898关注 0票数 2

因此,作为标题,我试图加载一个XDP程序,但令人惊讶的是,bpf验证器在我面前吐出了著名的后端错误:

代码语言:javascript
复制
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-循环:

代码语言:javascript
复制
#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没能打开循环?如果这是正确的,为什么失败了,有什么解决办法吗?手动展开循环是不可接受的,因为它会导致可怕的、不可维护的和不可读的代码。

哦,我在和:

  • 内核4.19.3
  • 勒文-clang 8

有什么想法吗?

更新

只是注意到,即使是下面的虚拟循环似乎也没有展开,bpf验证器抱怨后边:

代码语言:javascript
复制
#pragma unroll
for (i = 0; i < 8; i++)
{
    int k = i;
    mask = bpf_map_lookup_elem(&a_map, &k);
}

就我一个人没什么意义吗?

EN

回答 1

Stack Overflow用户

发布于 2019-07-29 07:23:53

我编写了下面的代码,它可以工作。

代码语言:javascript
复制
#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;
}
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56872436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档