[英]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.