Skip to content

Commit f5f64b2

Browse files
committed
struct_ops: fix to use cached BTF for find struct_ops struct
Signed-off-by: shun159 <[email protected]>
1 parent c1aca89 commit f5f64b2

File tree

5 files changed

+12
-43
lines changed

5 files changed

+12
-43
lines changed

collection.go

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -517,7 +517,7 @@ func (cl *collectionLoader) loadMap(mapName string) (*Map, error) {
517517
return m, nil
518518
}
519519

520-
m, err := newMapWithOptions(mapSpec, cl.opts.Maps)
520+
m, err := newMapWithOptions(mapSpec, cl.opts.Maps, cl.types)
521521
if err != nil {
522522
return nil, fmt.Errorf("map %s: %w", mapName, err)
523523
}
@@ -705,13 +705,8 @@ func (cl *collectionLoader) populateDeferredMaps() error {
705705
return fmt.Errorf("value should be an array of byte")
706706
}
707707

708-
s, err := btf.LoadKernelSpec()
709-
if err != nil {
710-
return fmt.Errorf("load vmlinux BTF: %w", err)
711-
}
712-
713708
target := btf.Type((*btf.Struct)(nil))
714-
_, module, err := findTargetInKernel(s, valueType.Name, &target)
709+
_, module, err := findTargetInKernel(valueType.Name, &target, cl.types)
715710
if err != nil {
716711
return fmt.Errorf("lookup value type %q: %w", valueType.Name, err)
717712
}
@@ -841,11 +836,6 @@ func populateFuncPtr(vType *btf.Struct, data []byte, programs map[string]*Progra
841836
// initKernStructOps indexes struct_ops maps: resolve kernel types, allocate per-map state,
842837
// and stage copy/attach metadata. No kernel objects are created here.
843838
func (cl *collectionLoader) initKernStructOps() error {
844-
s, err := btf.LoadKernelSpec()
845-
if err != nil {
846-
return fmt.Errorf("load vmlinux BTF: %w", err)
847-
}
848-
849839
for _, ms := range cl.coll.Maps {
850840
if ms.Type != StructOpsMap {
851841
continue
@@ -864,7 +854,7 @@ func (cl *collectionLoader) initKernStructOps() error {
864854
kTypeName := strings.TrimPrefix(vType.Name, structOpsValuePrefix)
865855

866856
target := btf.Type((*btf.Struct)(nil))
867-
_, module, err := findTargetInKernel(s, kTypeName, &target)
857+
_, module, err := findTargetInKernel(kTypeName, &target, cl.types)
868858
if err != nil {
869859
return fmt.Errorf("lookup kern type %q: %w", kTypeName, err)
870860
}

collection_test.go

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -804,13 +804,8 @@ func TestStructOpsMapSpecSimpleLoadAndAssign(t *testing.T) {
804804
},
805805
}
806806

807-
s, err := btf.LoadKernelSpec()
808-
if err != nil {
809-
t.Fatal(err)
810-
}
811-
812807
target := btf.Type((*btf.Struct)(nil))
813-
_, module, err := findTargetInKernel(s, "bpf_struct_ops_bpf_testmod_ops", &target)
808+
_, module, err := findTargetInKernel("bpf_struct_ops_bpf_testmod_ops", &target, btf.NewCache())
814809
if errors.Is(err, btf.ErrNotFound) {
815810
t.Skip("bpf_testmod_ops not loaded")
816811
}

map.go

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,7 @@ func NewMap(spec *MapSpec) (*Map, error) {
334334
//
335335
// May return an error wrapping ErrMapIncompatible.
336336
func NewMapWithOptions(spec *MapSpec, opts MapOptions) (*Map, error) {
337-
m, err := newMapWithOptions(spec, opts)
337+
m, err := newMapWithOptions(spec, opts, btf.NewCache())
338338
if err != nil {
339339
return nil, fmt.Errorf("creating map: %w", err)
340340
}
@@ -347,7 +347,7 @@ func NewMapWithOptions(spec *MapSpec, opts MapOptions) (*Map, error) {
347347
return m, nil
348348
}
349349

350-
func newMapWithOptions(spec *MapSpec, opts MapOptions) (_ *Map, err error) {
350+
func newMapWithOptions(spec *MapSpec, opts MapOptions, c *btf.Cache) (_ *Map, err error) {
351351
closeOnError := func(c io.Closer) {
352352
if err != nil {
353353
c.Close()
@@ -397,7 +397,7 @@ func newMapWithOptions(spec *MapSpec, opts MapOptions) (_ *Map, err error) {
397397
return nil, errors.New("inner maps cannot be pinned")
398398
}
399399

400-
template, err := spec.InnerMap.createMap(nil)
400+
template, err := spec.InnerMap.createMap(nil, c)
401401
if err != nil {
402402
return nil, fmt.Errorf("inner map: %w", err)
403403
}
@@ -409,7 +409,7 @@ func newMapWithOptions(spec *MapSpec, opts MapOptions) (_ *Map, err error) {
409409
innerFd = template.fd
410410
}
411411

412-
m, err := spec.createMap(innerFd)
412+
m, err := spec.createMap(innerFd, c)
413413
if err != nil {
414414
return nil, err
415415
}
@@ -504,7 +504,7 @@ func (m *Map) memorySize() (int, error) {
504504

505505
// createMap validates the spec's properties and creates the map in the kernel
506506
// using the given opts. It does not populate or freeze the map.
507-
func (spec *MapSpec) createMap(inner *sys.FD) (_ *Map, err error) {
507+
func (spec *MapSpec) createMap(inner *sys.FD, c *btf.Cache) (_ *Map, err error) {
508508
closeOnError := func(closer io.Closer) {
509509
if err != nil {
510510
closer.Close()
@@ -555,11 +555,6 @@ func (spec *MapSpec) createMap(inner *sys.FD) (_ *Map, err error) {
555555
}
556556
defer h.Close()
557557

558-
s, err := btf.LoadKernelSpec()
559-
if err != nil {
560-
return nil, fmt.Errorf("open vmlinux BTF: %w", err)
561-
}
562-
563558
if spec.Value == nil {
564559
return nil, fmt.Errorf("struct type is not specified as Value")
565560
}
@@ -572,7 +567,7 @@ func (spec *MapSpec) createMap(inner *sys.FD) (_ *Map, err error) {
572567
// struct_ops: resolve value type ("bpf_struct_ops_<name>") and
573568
// record kernel-specific BTF IDs / FDs needed for map creation.
574569
target := btf.Type((*btf.Struct)(nil))
575-
s, module, err := findTargetInKernel(s, valueType.Name, &target)
570+
s, module, err := findTargetInKernel(valueType.Name, &target, c)
576571
if err != nil {
577572
return nil, fmt.Errorf("lookup value type %q: %w", valueType.Name, err)
578573
}

prog.go

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -402,14 +402,8 @@ func newProgramWithOptions(spec *ProgramSpec, opts ProgramOptions, c *btf.Cache)
402402

403403
attr.AttachBtfId = targetID
404404
if spec.Type == StructOps {
405-
// we need to resolve `target` here, load the kernel spec
406-
s, err := btf.LoadKernelSpec()
407-
if err != nil {
408-
return nil, fmt.Errorf("load vmlinux BTF: %w", err)
409-
}
410-
411405
target := btf.Type((*btf.Struct)(nil))
412-
s, module, err := findTargetInKernel(s, attachTo, &target)
406+
s, module, err := findTargetInKernel(attachTo, &target, c)
413407
if err != nil {
414408
return nil, fmt.Errorf("lookup struct_ops kern type %q: %w", attachTo, err)
415409
}

struct_ops_test.go

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,8 @@ func TestCreateStructOpsMapSpecSimple(t *testing.T) {
2828
},
2929
}
3030

31-
s, err := btf.LoadKernelSpec()
32-
if err != nil {
33-
t.Fatal(err)
34-
}
35-
3631
target := btf.Type((*btf.Struct)(nil))
37-
_, module, err := findTargetInKernel(s, "bpf_struct_ops_bpf_testmod_ops", &target)
32+
_, module, err := findTargetInKernel("bpf_struct_ops_bpf_testmod_ops", &target, btf.NewCache())
3833
if errors.Is(err, btf.ErrNotFound) {
3934
t.Skip("bpf_testmod_ops not loaded")
4035
}

0 commit comments

Comments
 (0)