@@ -361,8 +361,8 @@ func newMapFromFD(fd *sys.FD) (*Map, error) {
361361// NewMap creates a new Map.
362362//
363363// It's equivalent to calling NewMapWithOptions with default options.
364- func NewMap (spec * MapSpec ) (* Map , error ) {
365- return NewMapWithOptions (spec , MapOptions {})
364+ func NewMap (spec * MapSpec , token * sys. FD ) (* Map , error ) {
365+ return NewMapWithOptions (spec , MapOptions {}, token )
366366}
367367
368368// NewMapWithOptions creates a new Map.
@@ -375,8 +375,8 @@ func NewMap(spec *MapSpec) (*Map, error) {
375375// by calling rlimit.RemoveMemlock() prior to calling NewMapWithOptions.
376376//
377377// May return an error wrapping ErrMapIncompatible.
378- func NewMapWithOptions (spec * MapSpec , opts MapOptions ) (* Map , error ) {
379- m , err := newMapWithOptions (spec , opts , btf .NewCache ())
378+ func NewMapWithOptions (spec * MapSpec , opts MapOptions , token * sys. FD ) (* Map , error ) {
379+ m , err := newMapWithOptions (spec , opts , btf .NewCache (), token )
380380 if err != nil {
381381 return nil , fmt .Errorf ("creating map: %w" , err )
382382 }
@@ -389,7 +389,7 @@ func NewMapWithOptions(spec *MapSpec, opts MapOptions) (*Map, error) {
389389 return m , nil
390390}
391391
392- func newMapWithOptions (spec * MapSpec , opts MapOptions , c * btf.Cache ) (_ * Map , err error ) {
392+ func newMapWithOptions (spec * MapSpec , opts MapOptions , c * btf.Cache , token * sys. FD ) (_ * Map , err error ) {
393393 closeOnError := func (c io.Closer ) {
394394 if err != nil {
395395 c .Close ()
@@ -439,7 +439,7 @@ func newMapWithOptions(spec *MapSpec, opts MapOptions, c *btf.Cache) (_ *Map, er
439439 return nil , errors .New ("inner maps cannot be pinned" )
440440 }
441441
442- template , err := spec .InnerMap .createMap (nil , c )
442+ template , err := spec .InnerMap .createMap (nil , c , token )
443443 if err != nil {
444444 return nil , fmt .Errorf ("inner map: %w" , err )
445445 }
@@ -451,7 +451,7 @@ func newMapWithOptions(spec *MapSpec, opts MapOptions, c *btf.Cache) (_ *Map, er
451451 innerFd = template .fd
452452 }
453453
454- m , err := spec .createMap (innerFd , c )
454+ m , err := spec .createMap (innerFd , c , token )
455455 if err != nil {
456456 return nil , err
457457 }
@@ -546,7 +546,7 @@ func (m *Map) memorySize() (int, error) {
546546
547547// createMap validates the spec's properties and creates the map in the kernel
548548// using the given opts. It does not populate or freeze the map.
549- func (spec * MapSpec ) createMap (inner * sys.FD , c * btf.Cache ) (_ * Map , err error ) {
549+ func (spec * MapSpec ) createMap (inner * sys.FD , c * btf.Cache , token * sys. FD ) (_ * Map , err error ) {
550550 closeOnError := func (closer io.Closer ) {
551551 if err != nil {
552552 closer .Close ()
@@ -584,6 +584,11 @@ func (spec *MapSpec) createMap(inner *sys.FD, c *btf.Cache) (_ *Map, err error)
584584 MapExtra : spec .MapExtra ,
585585 }
586586
587+ if token != nil {
588+ attr .MapTokenFd = int32 (token .Int ())
589+ attr .MapFlags |= sys .BPF_F_TOKEN_FD
590+ }
591+
587592 if inner != nil {
588593 attr .InnerMapFd = inner .Uint ()
589594 }
@@ -640,7 +645,7 @@ func (spec *MapSpec) createMap(inner *sys.FD, c *btf.Cache) (_ *Map, err error)
640645 }
641646 }
642647
643- fd , err := sys .MapCreateWithToken (& attr )
648+ fd , err := sys .MapCreate (& attr )
644649
645650 // Some map types don't support BTF k/v in earlier kernel versions.
646651 // Remove BTF metadata and retry map creation.
0 commit comments