From cdb7e95bf47d82a5f95595e302f3486901b64fa3 Mon Sep 17 00:00:00 2001 From: Ian Chen Date: Thu, 13 Feb 2025 23:17:13 +0800 Subject: [PATCH] fix: ci failed & update API based on reviewer's comments --- link.go | 4 ++++ map.go | 24 +++++++++++++++++------- selftest/struct-ops/go.mod | 2 +- selftest/struct-ops/main.go | 16 ++++++++++++---- 4 files changed, 34 insertions(+), 12 deletions(-) diff --git a/link.go b/link.go index a5990872..bfd8f9ba 100644 --- a/link.go +++ b/link.go @@ -33,6 +33,7 @@ const ( CgroupLegacy Netns Iter + StructOps ) // @@ -47,6 +48,7 @@ type bpfLinkLegacy struct { type BPFLink struct { link *C.struct_bpf_link prog *BPFProg + m *BPFMap linkType LinkType eventName string legacy *bpfLinkLegacy // if set, this is a fake BPFLink @@ -59,6 +61,8 @@ func (l *BPFLink) DestroyLegacy(linkType LinkType) error { l.legacy.cgroupDir, l.legacy.attachType, ) + // case StructOps: + // return l.m.DetachStructOps(l.link) } return fmt.Errorf("unable to destroy legacy link") diff --git a/map.go b/map.go index 5aa634be..ed4cad64 100644 --- a/map.go +++ b/map.go @@ -7,7 +7,6 @@ package libbpfgo import "C" import ( - "errors" "fmt" "syscall" "unsafe" @@ -74,17 +73,28 @@ func (m *BPFMap) ReuseFD(fd int) error { return nil } -func (m *BPFMap) AttachStructOps() error { - if m.Type().String() != MapTypeStructOps.String() { - return errors.New("Map type should be BPF_MAP_TYPE_STRUCT_OPS") - } +func (m *BPFMap) AttachStructOps() (*BPFLink, error) { linkC, errno := C.bpf_map__attach_struct_ops(m.bpfMap) if linkC == nil { - return fmt.Errorf("Map attach failed: %v", &errno) + return nil, fmt.Errorf("failed to attach struct_ops: %w", errno) } - return nil + return &BPFLink{ + link: linkC, + m: m, + linkType: StructOps, + eventName: fmt.Sprintf("structOps-%s", m.Name()), + }, nil } +// func (m *BPFMap) DetachStructOps(l *C.struct_bpf_link) error { +// retC := C.bpf_link__detach_struct_ops(l) +// if retC < 0 { +// return fmt.Errorf("failed to detach struct_ops: %w", syscall.Errno(-retC)) +// } + +// return nil +// } + func (m *BPFMap) Name() string { return C.GoString(C.bpf_map__name(m.bpfMap)) } diff --git a/selftest/struct-ops/go.mod b/selftest/struct-ops/go.mod index 72a57bd7..d24b6b41 100644 --- a/selftest/struct-ops/go.mod +++ b/selftest/struct-ops/go.mod @@ -1,4 +1,4 @@ -module github.com/aquasecurity/libbpfgo/selftest/perfbuffers +module github.com/aquasecurity/libbpfgo/selftest/struct-ops go 1.21 diff --git a/selftest/struct-ops/main.go b/selftest/struct-ops/main.go index d1ddecd3..97b9151a 100644 --- a/selftest/struct-ops/main.go +++ b/selftest/struct-ops/main.go @@ -43,6 +43,8 @@ func main() { m := bpfModule + var afterFunc func() + iters := m.Iterator() for { m := iters.NextMap() @@ -50,9 +52,16 @@ func main() { break } if m.Type().String() == "BPF_MAP_TYPE_STRUCT_OPS" { - if err := m.AttachStructOps(); err != nil { + if link, err := m.AttachStructOps(); err != nil { log.Printf("error: %v", err) os.Exit(-1) + } else { + afterFunc = func() { + if err := link.Destroy(); err != nil { + log.Printf("error: %v", err) + os.Exit(-1) + } + } } } } @@ -82,6 +91,7 @@ func main() { time.Sleep(3 * time.Second) cancel() wg.Wait() + afterFunc() log.Println("scheduler exit") os.Exit(0) } @@ -91,9 +101,8 @@ func getStat(m *bpf.BPFMap) []uint64 { cpuNum, err := bpf.NumPossibleCPUs() if err != nil { log.Fatal(err) - os.Exit(-1) } - var cnts [][]uint64 = make([][]uint64, 2) + cnts := make([][]uint64, 2) cnts[0] = make([]uint64, cpuNum) cnts[1] = make([]uint64, cpuNum) stats := []uint64{0, 0} @@ -101,7 +110,6 @@ func getStat(m *bpf.BPFMap) []uint64 { v, err := m.GetValue(unsafe.Pointer(&i)) if err != nil { log.Fatal(err) - os.Exit(-1) } for cpu := 0; cpu < cpuNum; cpu++ { n := v[cpu*8 : cpu*8+8]