Skip to content

Commit 38c1109

Browse files
committed
pkg: fix cilium/ebpf pin.WalkDIr uses
The API for walking BPF fs from cilium/ebpf slightly changed. Signed-off-by: Mahe Tardy <[email protected]>
1 parent cc3d2bd commit 38c1109

File tree

2 files changed

+43
-65
lines changed

2 files changed

+43
-65
lines changed

Diff for: cmd/tetra/debug/progs.go

+29-35
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import (
1111
"errors"
1212
"fmt"
1313
"io"
14-
"io/fs"
1514
"log"
1615
"os"
1716
"path"
@@ -407,45 +406,40 @@ func getTetragonProgs(base string) ([]*prog, error) {
407406
var progs []*prog
408407

409408
// Walk bpffs/tetragon and look for programs
410-
err := pin.WalkDir(base,
411-
func(path string, finfo fs.DirEntry, obj pin.Pinner, err error) error {
412-
if err != nil {
413-
return err
414-
}
415-
if finfo.IsDir() {
416-
return nil
417-
}
409+
iter := pin.WalkDir(base, &ebpf.LoadPinOptions{})
410+
for pin, err := range iter {
411+
if err != nil {
412+
return nil, err
413+
}
418414

419-
p, ok := obj.(*ebpf.Program)
420-
if !ok {
421-
return nil
422-
}
423-
defer p.Close()
415+
p, ok := pin.Object.(*ebpf.Program)
416+
if !ok {
417+
continue
418+
}
424419

425-
info, err := p.Info()
426-
if err != nil {
427-
return err
428-
}
420+
info, err := p.Info()
421+
if err != nil {
422+
return nil, err
423+
}
429424

430-
id, ok := info.ID()
431-
if !ok {
432-
return err
433-
}
425+
id, ok := info.ID()
426+
if !ok {
427+
return nil, err
428+
}
434429

435-
runTime, _ := info.Runtime()
436-
runCnt, _ := info.RunCount()
437-
438-
progs = append(progs, &prog{
439-
id: uint32(id),
440-
name: getName(p, info),
441-
pin: filepath.Join(base, path),
442-
cnt: runCnt,
443-
time: runTime,
444-
alive: true,
445-
})
446-
return nil
430+
runTime, _ := info.Runtime()
431+
runCnt, _ := info.RunCount()
432+
433+
progs = append(progs, &prog{
434+
id: uint32(id),
435+
name: getName(p, info),
436+
pin: filepath.Join(base, pin.Path),
437+
cnt: runCnt,
438+
time: runTime,
439+
alive: true,
447440
})
448-
return progs, err
441+
}
442+
return progs, nil
449443
}
450444

451445
func getName(p *ebpf.Program, info *ebpf.ProgramInfo) string {

Diff for: pkg/bugtool/maps.go

+14-30
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ package bugtool
66
import (
77
"errors"
88
"fmt"
9-
"io/fs"
109
"iter"
1110
"maps"
1211
"os"
@@ -89,31 +88,24 @@ func FindAllMaps() ([]bpf.ExtendedMapInfo, error) {
8988
// specified as argument.
9089
func FindPinnedMaps(path string) ([]bpf.ExtendedMapInfo, error) {
9190
var infos []bpf.ExtendedMapInfo
92-
93-
err := pin.WalkDir(path, func(_ string, d fs.DirEntry, obj pin.Pinner, err error) error {
91+
iter := pin.WalkDir(path, &ebpf.LoadPinOptions{ReadOnly: true})
92+
for pin, err := range iter {
9493
if err != nil {
95-
return err
96-
}
97-
if d.IsDir() {
98-
return nil // skip directories
94+
return nil, fmt.Errorf("failed walking the bpf fs %q: %w", path, err)
9995
}
10096

101-
m, ok := obj.(*ebpf.Map)
97+
m, ok := pin.Object.(*ebpf.Map)
10298
if !ok {
103-
return nil // skip non map
99+
continue
104100
}
105-
defer m.Close()
106101

107102
xInfo, err := bpf.ExtendedInfoFromMap(m)
108103
if err != nil {
109-
return fmt.Errorf("failed to retrieve extended info from map %v: %w", m, err)
104+
return nil, fmt.Errorf("failed to retrieve extended info from map %v: %w", m, err)
110105
}
111106
infos = append(infos, xInfo)
112-
return nil
113-
})
114-
if err != nil {
115-
return nil, err
116107
}
108+
117109
return infos, nil
118110
}
119111

@@ -145,37 +137,29 @@ func mapIDsFromProgs(prog *ebpf.Program) (iter.Seq[int], error) {
145137
func mapIDsFromPinnedProgs(path string) (iter.Seq[int], error) {
146138
mapSet := map[int]bool{}
147139
progArrays := []*ebpf.Map{}
148-
err := pin.WalkDir(path, func(_ string, d fs.DirEntry, obj pin.Pinner, err error) error {
140+
141+
iter := pin.WalkDir(path, &ebpf.LoadPinOptions{ReadOnly: true})
142+
for pin, err := range iter {
149143
if err != nil {
150-
return err
151-
}
152-
if d.IsDir() {
153-
return nil // skip directories
144+
return nil, fmt.Errorf("failed walking the bpf fs %q: %w", path, err)
154145
}
155146

156-
switch typedObj := obj.(type) {
147+
switch typedObj := pin.Object.(type) {
157148
case *ebpf.Program:
158149
newIDs, err := mapIDsFromProgs(typedObj)
159150
if err != nil {
160-
return fmt.Errorf("failed to retrieve map IDs from prog: %w", err)
151+
return nil, fmt.Errorf("failed to retrieve map IDs from prog: %w", err)
161152
}
162-
typedObj.Close()
163153
for id := range newIDs {
164154
mapSet[id] = true
165155
}
166156
case *ebpf.Map:
167157
if typedObj.Type() == ebpf.ProgramArray {
168158
progArrays = append(progArrays, typedObj)
169159
// don't forget to close those files when used later on
170-
} else {
171-
typedObj.Close()
160+
pin.Take()
172161
}
173162
}
174-
175-
return nil
176-
})
177-
if err != nil {
178-
return nil, fmt.Errorf("failed walking the path %q: %w", path, err)
179163
}
180164

181165
// retrieve all the program IDs from prog array maps

0 commit comments

Comments
 (0)