@@ -334,7 +334,7 @@ func NewMap(spec *MapSpec) (*Map, error) {
334
334
//
335
335
// May return an error wrapping ErrMapIncompatible.
336
336
func NewMapWithOptions (spec * MapSpec , opts MapOptions ) (* Map , error ) {
337
- m , err := newMapWithOptions (spec , opts )
337
+ m , err := newMapWithOptions (spec , opts , btf . NewCache () )
338
338
if err != nil {
339
339
return nil , fmt .Errorf ("creating map: %w" , err )
340
340
}
@@ -347,7 +347,7 @@ func NewMapWithOptions(spec *MapSpec, opts MapOptions) (*Map, error) {
347
347
return m , nil
348
348
}
349
349
350
- func newMapWithOptions (spec * MapSpec , opts MapOptions ) (_ * Map , err error ) {
350
+ func newMapWithOptions (spec * MapSpec , opts MapOptions , c * btf. Cache ) (_ * Map , err error ) {
351
351
closeOnError := func (c io.Closer ) {
352
352
if err != nil {
353
353
c .Close ()
@@ -397,7 +397,7 @@ func newMapWithOptions(spec *MapSpec, opts MapOptions) (_ *Map, err error) {
397
397
return nil , errors .New ("inner maps cannot be pinned" )
398
398
}
399
399
400
- template , err := spec .InnerMap .createMap (nil )
400
+ template , err := spec .InnerMap .createMap (nil , c )
401
401
if err != nil {
402
402
return nil , fmt .Errorf ("inner map: %w" , err )
403
403
}
@@ -409,7 +409,7 @@ func newMapWithOptions(spec *MapSpec, opts MapOptions) (_ *Map, err error) {
409
409
innerFd = template .fd
410
410
}
411
411
412
- m , err := spec .createMap (innerFd )
412
+ m , err := spec .createMap (innerFd , c )
413
413
if err != nil {
414
414
return nil , err
415
415
}
@@ -504,7 +504,7 @@ func (m *Map) memorySize() (int, error) {
504
504
505
505
// createMap validates the spec's properties and creates the map in the kernel
506
506
// 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 ) {
508
508
closeOnError := func (closer io.Closer ) {
509
509
if err != nil {
510
510
closer .Close ()
@@ -555,11 +555,6 @@ func (spec *MapSpec) createMap(inner *sys.FD) (_ *Map, err error) {
555
555
}
556
556
defer h .Close ()
557
557
558
- s , err := btf .LoadKernelSpec ()
559
- if err != nil {
560
- return nil , fmt .Errorf ("open vmlinux BTF: %w" , err )
561
- }
562
-
563
558
if spec .Value == nil {
564
559
return nil , fmt .Errorf ("struct type is not specified as Value" )
565
560
}
@@ -572,7 +567,7 @@ func (spec *MapSpec) createMap(inner *sys.FD) (_ *Map, err error) {
572
567
// struct_ops: resolve value type ("bpf_struct_ops_<name>") and
573
568
// record kernel-specific BTF IDs / FDs needed for map creation.
574
569
target := btf .Type ((* btf .Struct )(nil ))
575
- s , module , err := findTargetInKernel (s , valueType .Name , & target )
570
+ s , module , err := findTargetInKernel (valueType .Name , & target , c )
576
571
if err != nil {
577
572
return nil , fmt .Errorf ("lookup value type %q: %w" , valueType .Name , err )
578
573
}
0 commit comments