簡體   English   中英

即使成功加載了 bpf 代碼,ebpf 尾調用也不起作用

[英]ebpf tail call didn't work even bpf code is loaded successfully

#include "bpf/bpf_helpers.h"
#include <linux/bpf.h>
char _license[] SEC("license") = "GPL";
struct bpf_map_def SEC("maps") jump_table = {
    .type = BPF_MAP_TYPE_PROG_ARRAY,
    .key_size = sizeof(__u32),
    .value_size = sizeof(__u32),
    .max_entries = 100,
};

SEC("xdp_1")
int test_func(struct xdp_md *ctx) {
  bpf_printk("tail call\n");
  return XDP_PASS;
}

SEC("xdp")
int xdp_pass_func(struct xdp_md *ctx) {
  __u32 zero = 0;
  bpf_tail_call(ctx, &jump_table, zero);
  bpf_printk("tail call failed\n");
  return XDP_PASS;
}

當我查看cat /sys/kernel/debug/tracing/trace_pipe時,它​​顯示tail call failed ,但我不知道出了什么問題,這是我的加載代碼

func main() {
    if err := rlimit.RemoveMemlock(); err != nil {
        log.Fatal(err)
        return
    }
    var obj aclObjects
    err := loadAclObjects(&obj, nil)
    if err != nil {
        log.Fatal(err)
        return
    }
    err = obj.JumpTable.Put(uint32(0), uint32(obj.TestFunc.FD()))
    if err != nil {
        log.Fatal(err)
        return
    }
    link, err := netlink.LinkByName("ens33")
    if err != nil {
        log.Fatal(err)
        return
    }
    err = netlink.LinkSetXdpFd(link, obj.XdpPassFunc.FD())
    if err != nil {
        log.Fatal(err)
        return
    }
}

bpf代碼可以加載,但是tail_call好像有問題,我是按照linux源碼寫的,有人能幫幫我嗎?

正如您在回答中意識到並提到的那樣,當加載程序退出時,引用程序的文件描述符確實會關閉。

如果沒有其他內容引用該程序,則將其卸載。 有什么可以持有這樣的參考?

您想要的是在加載程序退出之前固定您的程序(您似乎使用 goebpf?顯然該庫有一個Pin()函數,這可能會有所幫助)。

我發現加載程序退出時prog fd會關閉的問題,所以我保持程序阻塞並且尾調用工作正常,我不知道為什么fd關閉是一個問題,希望有人能回答

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM