Skip to content

pkg: fix cilium/ebpf pin.WalkDir uses #3630

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 2 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 29 additions & 35 deletions cmd/tetra/debug/progs.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ import (
"errors"
"fmt"
"io"
"io/fs"
"log"
"os"
"path"
Expand Down Expand Up @@ -407,45 +406,40 @@ func getTetragonProgs(base string) ([]*prog, error) {
var progs []*prog

// Walk bpffs/tetragon and look for programs
err := pin.WalkDir(base,
func(path string, finfo fs.DirEntry, obj pin.Pinner, err error) error {
if err != nil {
return err
}
if finfo.IsDir() {
return nil
}
iter := pin.WalkDir(base, nil)
for pin, err := range iter {
if err != nil {
return nil, err
}

p, ok := obj.(*ebpf.Program)
if !ok {
return nil
}
defer p.Close()
p, ok := pin.Object.(*ebpf.Program)
if !ok {
continue
}

info, err := p.Info()
if err != nil {
return err
}
info, err := p.Info()
if err != nil {
return nil, err
}

id, ok := info.ID()
if !ok {
return err
}
id, ok := info.ID()
if !ok {
return nil, err
}

runTime, _ := info.Runtime()
runCnt, _ := info.RunCount()

progs = append(progs, &prog{
id: uint32(id),
name: getName(p, info),
pin: filepath.Join(base, path),
cnt: runCnt,
time: runTime,
alive: true,
})
return nil
runTime, _ := info.Runtime()
runCnt, _ := info.RunCount()

progs = append(progs, &prog{
id: uint32(id),
name: getName(p, info),
pin: filepath.Join(base, pin.Path),
cnt: runCnt,
time: runTime,
alive: true,
})
return progs, err
}
return progs, nil
}

func getName(p *ebpf.Program, info *ebpf.ProgramInfo) string {
Expand Down
2 changes: 2 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,8 @@ replace (
github.com/cilium/tetragon/pkg/k8s => ./pkg/k8s
)

replace github.com/cilium/ebpf => github.com/lmb/ebpf v0.7.1-0.20250331135743-ef68628835ae

// This replace directive has to be in sync with with github.com/cilium/cilium
// except for sigs.k8s.io/controller-tools. If the github.com/cilium/cilium
// version is bumped, the sync must be refreshed. As of now we use, see the
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,6 @@ github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UF
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/cilium/cilium v1.17.2 h1:hMahLKho06pzcAk8X+Co7jXhhwrj79rkTsy5FFehr8Q=
github.com/cilium/cilium v1.17.2/go.mod h1:BMwiENNHcSrSsx59fmzyu9V5pBKzav8bWawiA2PcA7U=
github.com/cilium/ebpf v0.18.0 h1:OsSwqS4y+gQHxaKgg2U/+Fev834kdnsQbtzRnbVC6Gs=
github.com/cilium/ebpf v0.18.0/go.mod h1:vmsAT73y4lW2b4peE+qcOqw6MxvWQdC+LiU5gd/xyo4=
github.com/cilium/hive v0.0.0-20250121145729-e67f66eb0375 h1:EhoCO0AI3qJavnhfAls4w7VpVVpAr12wIh293sNA0hQ=
github.com/cilium/hive v0.0.0-20250121145729-e67f66eb0375/go.mod h1:pI2GJ1n3SLKIQVFrKF7W6A6gb6BQkZ+3Hp4PAEo5SuI=
github.com/cilium/little-vm-helper v0.0.23 h1:d5QrHsouSo/wrjdlOtCitCV4HHuW3nPl1yxYFqG3TGU=
Expand Down Expand Up @@ -259,6 +257,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
github.com/lmb/ebpf v0.7.1-0.20250331135743-ef68628835ae h1:hUrVAKImeF61w5Mz6kB+X5+y8ABnj3/U/qxjTjb9kGQ=
github.com/lmb/ebpf v0.7.1-0.20250331135743-ef68628835ae/go.mod h1:vmsAT73y4lW2b4peE+qcOqw6MxvWQdC+LiU5gd/xyo4=
github.com/mackerelio/go-osstat v0.2.5 h1:+MqTbZUhoIt4m8qzkVoXUJg1EuifwlAJSk4Yl2GXh+o=
github.com/mackerelio/go-osstat v0.2.5/go.mod h1:atxwWF+POUZcdtR1wnsUcQxTytoHG4uhl2AKKzrOajY=
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
Expand Down
44 changes: 14 additions & 30 deletions pkg/bugtool/maps.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
import (
"errors"
"fmt"
"io/fs"
"iter"
"maps"
"os"
Expand Down Expand Up @@ -89,38 +88,31 @@
// specified as argument.
func FindPinnedMaps(path string) ([]bpf.ExtendedMapInfo, error) {
var infos []bpf.ExtendedMapInfo

err := pin.WalkDir(path, func(_ string, d fs.DirEntry, obj pin.Pinner, err error) error {
iter := pin.WalkDir(path, nil)
for pin, err := range iter {
if err != nil {

Check failure on line 93 in pkg/bugtool/maps.go

View workflow job for this annotation

GitHub Actions / build-every-commit

cannot use func(_ string, d fs.DirEntry, obj pin.Pinner, err error) error {…} (value of type func(_ string, d "io/fs".DirEntry, obj pin.Pinner, err error) error) as *ebpf.LoadPinOptions value in argument to pin.WalkDir

Check failure on line 93 in pkg/bugtool/maps.go

View workflow job for this annotation

GitHub Actions / build-every-commit

cannot use func(_ string, d fs.DirEntry, obj pin.Pinner, err error) error {…} (value of type func(_ string, d "io/fs".DirEntry, obj pin.Pinner, err error) error) as *ebpf.LoadPinOptions value in argument to pin.WalkDir
return err
}
if d.IsDir() {
return nil // skip directories
return nil, fmt.Errorf("failed walking the bpf fs %q: %w", path, err)
}

m, ok := obj.(*ebpf.Map)
m, ok := pin.Object.(*ebpf.Map)
if !ok {
return nil // skip non map
continue
}
defer m.Close()

xInfo, err := bpf.ExtendedInfoFromMap(m)
if err != nil {
return fmt.Errorf("failed to retrieve extended info from map %v: %w", m, err)
return nil, fmt.Errorf("failed to retrieve extended info from map %v: %w", m, err)
}
infos = append(infos, xInfo)
return nil
})
if err != nil {
return nil, err
}

return infos, nil
}

// mapIDsFromProgs retrieves all map IDs used inside a prog.
func mapIDsFromProgs(prog *ebpf.Program) (iter.Seq[int], error) {
if prog == nil {
return nil, errors.New("prog is nil")

Check failure on line 115 in pkg/bugtool/maps.go

View workflow job for this annotation

GitHub Actions / build-every-commit

cannot use err (variable of func type "iter".Seq2[*pin.Pin, error]) as error value in return statement: "iter".Seq2[*pin.Pin, error] does not implement error (missing method Error)

Check failure on line 115 in pkg/bugtool/maps.go

View workflow job for this annotation

GitHub Actions / build-every-commit

cannot use err (variable of func type "iter".Seq2[*pin.Pin, error]) as error value in return statement: "iter".Seq2[*pin.Pin, error] does not implement error (missing method Error)
}
progInfo, err := prog.Info()
if err != nil {
Expand All @@ -145,37 +137,29 @@
func mapIDsFromPinnedProgs(path string) (iter.Seq[int], error) {
mapSet := map[int]bool{}
progArrays := []*ebpf.Map{}
err := pin.WalkDir(path, func(_ string, d fs.DirEntry, obj pin.Pinner, err error) error {

iter := pin.WalkDir(path, nil)
for pin, err := range iter {
if err != nil {
return err
}
if d.IsDir() {
return nil // skip directories
return nil, fmt.Errorf("failed walking the bpf fs %q: %w", path, err)
}

switch typedObj := obj.(type) {
switch typedObj := pin.Object.(type) {
case *ebpf.Program:

Check failure on line 148 in pkg/bugtool/maps.go

View workflow job for this annotation

GitHub Actions / build-every-commit

cannot use func(_ string, d fs.DirEntry, obj pin.Pinner, err error) error {…} (value of type func(_ string, d "io/fs".DirEntry, obj pin.Pinner, err error) error) as *ebpf.LoadPinOptions value in argument to pin.WalkDir

Check failure on line 148 in pkg/bugtool/maps.go

View workflow job for this annotation

GitHub Actions / build-every-commit

cannot use func(_ string, d fs.DirEntry, obj pin.Pinner, err error) error {…} (value of type func(_ string, d "io/fs".DirEntry, obj pin.Pinner, err error) error) as *ebpf.LoadPinOptions value in argument to pin.WalkDir
newIDs, err := mapIDsFromProgs(typedObj)
if err != nil {
return fmt.Errorf("failed to retrieve map IDs from prog: %w", err)
return nil, fmt.Errorf("failed to retrieve map IDs from prog: %w", err)
}
typedObj.Close()
for id := range newIDs {
mapSet[id] = true
}
case *ebpf.Map:
if typedObj.Type() == ebpf.ProgramArray {
progArrays = append(progArrays, typedObj)
// don't forget to close those files when used later on
} else {
typedObj.Close()
pin.Take()
}
}

return nil
})
if err != nil {
return nil, fmt.Errorf("failed walking the path %q: %w", path, err)
}

// retrieve all the program IDs from prog array maps
Expand Down
53 changes: 23 additions & 30 deletions vendor/github.com/cilium/ebpf/.golangci.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 2 additions & 5 deletions vendor/github.com/cilium/ebpf/Makefile

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 3 additions & 3 deletions vendor/github.com/cilium/ebpf/btf/btf.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 6 additions & 6 deletions vendor/github.com/cilium/ebpf/elf_reader.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions vendor/github.com/cilium/ebpf/link/kprobe_multi.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 3 additions & 3 deletions vendor/github.com/cilium/ebpf/link/uprobe_multi.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading