build(deps): bump github.com/containerd/cgroups/v3 from 3.0.2 to 3.0.3
Bumps [github.com/containerd/cgroups/v3](https://github.com/containerd/cgroups) from 3.0.2 to 3.0.3. - [Release notes](https://github.com/containerd/cgroups/releases) - [Commits](https://github.com/containerd/cgroups/compare/v3.0.2...v3.0.3) --- updated-dependencies: - dependency-name: github.com/containerd/cgroups/v3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com>
This commit is contained in:
		
							
								
								
									
										199
									
								
								vendor/github.com/cilium/ebpf/collection.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										199
									
								
								vendor/github.com/cilium/ebpf/collection.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -9,6 +9,8 @@ import (
 | 
			
		||||
 | 
			
		||||
	"github.com/cilium/ebpf/asm"
 | 
			
		||||
	"github.com/cilium/ebpf/btf"
 | 
			
		||||
	"github.com/cilium/ebpf/internal"
 | 
			
		||||
	"github.com/cilium/ebpf/internal/kconfig"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// CollectionOptions control loading a collection into the kernel.
 | 
			
		||||
@@ -107,12 +109,22 @@ func (cs *CollectionSpec) RewriteMaps(maps map[string]*Map) error {
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MissingConstantsError is returned by [CollectionSpec.RewriteConstants].
 | 
			
		||||
type MissingConstantsError struct {
 | 
			
		||||
	// The constants missing from .rodata.
 | 
			
		||||
	Constants []string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *MissingConstantsError) Error() string {
 | 
			
		||||
	return fmt.Sprintf("some constants are missing from .rodata: %s", strings.Join(m.Constants, ", "))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RewriteConstants replaces the value of multiple constants.
 | 
			
		||||
//
 | 
			
		||||
// The constant must be defined like so in the C program:
 | 
			
		||||
//
 | 
			
		||||
//    volatile const type foobar;
 | 
			
		||||
//    volatile const type foobar = default;
 | 
			
		||||
//	volatile const type foobar;
 | 
			
		||||
//	volatile const type foobar = default;
 | 
			
		||||
//
 | 
			
		||||
// Replacement values must be of the same length as the C sizeof(type).
 | 
			
		||||
// If necessary, they are marshalled according to the same rules as
 | 
			
		||||
@@ -120,7 +132,7 @@ func (cs *CollectionSpec) RewriteMaps(maps map[string]*Map) error {
 | 
			
		||||
//
 | 
			
		||||
// From Linux 5.5 the verifier will use constants to eliminate dead code.
 | 
			
		||||
//
 | 
			
		||||
// Returns an error if a constant doesn't exist.
 | 
			
		||||
// Returns an error wrapping [MissingConstantsError] if a constant doesn't exist.
 | 
			
		||||
func (cs *CollectionSpec) RewriteConstants(consts map[string]interface{}) error {
 | 
			
		||||
	replaced := make(map[string]bool)
 | 
			
		||||
 | 
			
		||||
@@ -151,6 +163,10 @@ func (cs *CollectionSpec) RewriteConstants(consts map[string]interface{}) error
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if _, ok := v.Type.(*btf.Var); !ok {
 | 
			
		||||
				return fmt.Errorf("section %s: unexpected type %T for variable %s", name, v.Type, vname)
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if replaced[vname] {
 | 
			
		||||
				return fmt.Errorf("section %s: duplicate variable %s", name, vname)
 | 
			
		||||
			}
 | 
			
		||||
@@ -180,7 +196,7 @@ func (cs *CollectionSpec) RewriteConstants(consts map[string]interface{}) error
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if len(missing) != 0 {
 | 
			
		||||
		return fmt.Errorf("spec is missing one or more constants: %s", strings.Join(missing, ","))
 | 
			
		||||
		return fmt.Errorf("rewrite constants: %w", &MissingConstantsError{Constants: missing})
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
@@ -198,11 +214,11 @@ func (cs *CollectionSpec) RewriteConstants(consts map[string]interface{}) error
 | 
			
		||||
// The tag's value specifies the name of the program or map as
 | 
			
		||||
// found in the CollectionSpec.
 | 
			
		||||
//
 | 
			
		||||
//    struct {
 | 
			
		||||
//        Foo     *ebpf.ProgramSpec `ebpf:"xdp_foo"`
 | 
			
		||||
//        Bar     *ebpf.MapSpec     `ebpf:"bar_map"`
 | 
			
		||||
//        Ignored int
 | 
			
		||||
//    }
 | 
			
		||||
//	struct {
 | 
			
		||||
//	    Foo     *ebpf.ProgramSpec `ebpf:"xdp_foo"`
 | 
			
		||||
//	    Bar     *ebpf.MapSpec     `ebpf:"bar_map"`
 | 
			
		||||
//	    Ignored int
 | 
			
		||||
//	}
 | 
			
		||||
//
 | 
			
		||||
// Returns an error if any of the eBPF objects can't be found, or
 | 
			
		||||
// if the same MapSpec or ProgramSpec is assigned multiple times.
 | 
			
		||||
@@ -249,11 +265,11 @@ func (cs *CollectionSpec) Assign(to interface{}) error {
 | 
			
		||||
// dependent resources are loaded into the kernel and populated with values if
 | 
			
		||||
// specified.
 | 
			
		||||
//
 | 
			
		||||
//    struct {
 | 
			
		||||
//        Foo     *ebpf.Program `ebpf:"xdp_foo"`
 | 
			
		||||
//        Bar     *ebpf.Map     `ebpf:"bar_map"`
 | 
			
		||||
//        Ignored int
 | 
			
		||||
//    }
 | 
			
		||||
//	struct {
 | 
			
		||||
//	    Foo     *ebpf.Program `ebpf:"xdp_foo"`
 | 
			
		||||
//	    Bar     *ebpf.Map     `ebpf:"bar_map"`
 | 
			
		||||
//	    Ignored int
 | 
			
		||||
//	}
 | 
			
		||||
//
 | 
			
		||||
// opts may be nil.
 | 
			
		||||
//
 | 
			
		||||
@@ -386,42 +402,11 @@ func NewCollectionWithOptions(spec *CollectionSpec, opts CollectionOptions) (*Co
 | 
			
		||||
	}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type handleCache struct {
 | 
			
		||||
	btfHandles map[*btf.Spec]*btf.Handle
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func newHandleCache() *handleCache {
 | 
			
		||||
	return &handleCache{
 | 
			
		||||
		btfHandles: make(map[*btf.Spec]*btf.Handle),
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (hc handleCache) btfHandle(spec *btf.Spec) (*btf.Handle, error) {
 | 
			
		||||
	if hc.btfHandles[spec] != nil {
 | 
			
		||||
		return hc.btfHandles[spec], nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	handle, err := btf.NewHandle(spec)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	hc.btfHandles[spec] = handle
 | 
			
		||||
	return handle, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (hc handleCache) close() {
 | 
			
		||||
	for _, handle := range hc.btfHandles {
 | 
			
		||||
		handle.Close()
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type collectionLoader struct {
 | 
			
		||||
	coll     *CollectionSpec
 | 
			
		||||
	opts     *CollectionOptions
 | 
			
		||||
	maps     map[string]*Map
 | 
			
		||||
	programs map[string]*Program
 | 
			
		||||
	handles  *handleCache
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func newCollectionLoader(coll *CollectionSpec, opts *CollectionOptions) (*collectionLoader, error) {
 | 
			
		||||
@@ -436,7 +421,7 @@ func newCollectionLoader(coll *CollectionSpec, opts *CollectionOptions) (*collec
 | 
			
		||||
			return nil, fmt.Errorf("replacement map %s not found in CollectionSpec", name)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if err := spec.checkCompatibility(m); err != nil {
 | 
			
		||||
		if err := spec.Compatible(m); err != nil {
 | 
			
		||||
			return nil, fmt.Errorf("using replacement map %s: %w", spec.Name, err)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
@@ -446,13 +431,11 @@ func newCollectionLoader(coll *CollectionSpec, opts *CollectionOptions) (*collec
 | 
			
		||||
		opts,
 | 
			
		||||
		make(map[string]*Map),
 | 
			
		||||
		make(map[string]*Program),
 | 
			
		||||
		newHandleCache(),
 | 
			
		||||
	}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// close all resources left over in the collectionLoader.
 | 
			
		||||
func (cl *collectionLoader) close() {
 | 
			
		||||
	cl.handles.close()
 | 
			
		||||
	for _, m := range cl.maps {
 | 
			
		||||
		m.Close()
 | 
			
		||||
	}
 | 
			
		||||
@@ -471,10 +454,6 @@ func (cl *collectionLoader) loadMap(mapName string) (*Map, error) {
 | 
			
		||||
		return nil, fmt.Errorf("missing map %s", mapName)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if mapSpec.BTF != nil && cl.coll.Types != mapSpec.BTF {
 | 
			
		||||
		return nil, fmt.Errorf("map %s: BTF doesn't match collection", mapName)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if replaceMap, ok := cl.opts.MapReplacements[mapName]; ok {
 | 
			
		||||
		// Clone the map to avoid closing user's map later on.
 | 
			
		||||
		m, err := replaceMap.Clone()
 | 
			
		||||
@@ -486,7 +465,7 @@ func (cl *collectionLoader) loadMap(mapName string) (*Map, error) {
 | 
			
		||||
		return m, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	m, err := newMapWithOptions(mapSpec, cl.opts.Maps, cl.handles)
 | 
			
		||||
	m, err := newMapWithOptions(mapSpec, cl.opts.Maps)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, fmt.Errorf("map %s: %w", mapName, err)
 | 
			
		||||
	}
 | 
			
		||||
@@ -511,10 +490,6 @@ func (cl *collectionLoader) loadProgram(progName string) (*Program, error) {
 | 
			
		||||
		return nil, fmt.Errorf("cannot load program %s: program type is unspecified", progName)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if progSpec.BTF != nil && cl.coll.Types != progSpec.BTF {
 | 
			
		||||
		return nil, fmt.Errorf("program %s: BTF doesn't match collection", progName)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	progSpec = progSpec.Copy()
 | 
			
		||||
 | 
			
		||||
	// Rewrite any reference to a valid map in the program's instructions,
 | 
			
		||||
@@ -543,7 +518,7 @@ func (cl *collectionLoader) loadProgram(progName string) (*Program, error) {
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	prog, err := newProgramWithOptions(progSpec, cl.opts.Programs, cl.handles)
 | 
			
		||||
	prog, err := newProgramWithOptions(progSpec, cl.opts.Programs)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, fmt.Errorf("program %s: %w", progName, err)
 | 
			
		||||
	}
 | 
			
		||||
@@ -559,17 +534,22 @@ func (cl *collectionLoader) populateMaps() error {
 | 
			
		||||
			return fmt.Errorf("missing map spec %s", mapName)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		mapSpec = mapSpec.Copy()
 | 
			
		||||
 | 
			
		||||
		// MapSpecs that refer to inner maps or programs within the same
 | 
			
		||||
		// CollectionSpec do so using strings. These strings are used as the key
 | 
			
		||||
		// to look up the respective object in the Maps or Programs fields.
 | 
			
		||||
		// Resolve those references to actual Map or Program resources that
 | 
			
		||||
		// have been loaded into the kernel.
 | 
			
		||||
		for i, kv := range mapSpec.Contents {
 | 
			
		||||
			if objName, ok := kv.Value.(string); ok {
 | 
			
		||||
				switch mapSpec.Type {
 | 
			
		||||
				case ProgramArray:
 | 
			
		||||
		if mapSpec.Type.canStoreMap() || mapSpec.Type.canStoreProgram() {
 | 
			
		||||
			mapSpec = mapSpec.Copy()
 | 
			
		||||
 | 
			
		||||
			for i, kv := range mapSpec.Contents {
 | 
			
		||||
				objName, ok := kv.Value.(string)
 | 
			
		||||
				if !ok {
 | 
			
		||||
					continue
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				switch t := mapSpec.Type; {
 | 
			
		||||
				case t.canStoreProgram():
 | 
			
		||||
					// loadProgram is idempotent and could return an existing Program.
 | 
			
		||||
					prog, err := cl.loadProgram(objName)
 | 
			
		||||
					if err != nil {
 | 
			
		||||
@@ -577,7 +557,7 @@ func (cl *collectionLoader) populateMaps() error {
 | 
			
		||||
					}
 | 
			
		||||
					mapSpec.Contents[i] = MapKV{kv.Key, prog}
 | 
			
		||||
 | 
			
		||||
				case ArrayOfMaps, HashOfMaps:
 | 
			
		||||
				case t.canStoreMap():
 | 
			
		||||
					// loadMap is idempotent and could return an existing Map.
 | 
			
		||||
					innerMap, err := cl.loadMap(objName)
 | 
			
		||||
					if err != nil {
 | 
			
		||||
@@ -597,6 +577,95 @@ func (cl *collectionLoader) populateMaps() error {
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// resolveKconfig resolves all variables declared in .kconfig and populates
 | 
			
		||||
// m.Contents. Does nothing if the given m.Contents is non-empty.
 | 
			
		||||
func resolveKconfig(m *MapSpec) error {
 | 
			
		||||
	ds, ok := m.Value.(*btf.Datasec)
 | 
			
		||||
	if !ok {
 | 
			
		||||
		return errors.New("map value is not a Datasec")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	type configInfo struct {
 | 
			
		||||
		offset uint32
 | 
			
		||||
		typ    btf.Type
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	configs := make(map[string]configInfo)
 | 
			
		||||
 | 
			
		||||
	data := make([]byte, ds.Size)
 | 
			
		||||
	for _, vsi := range ds.Vars {
 | 
			
		||||
		v := vsi.Type.(*btf.Var)
 | 
			
		||||
		n := v.TypeName()
 | 
			
		||||
 | 
			
		||||
		switch n {
 | 
			
		||||
		case "LINUX_KERNEL_VERSION":
 | 
			
		||||
			if integer, ok := v.Type.(*btf.Int); !ok || integer.Size != 4 {
 | 
			
		||||
				return fmt.Errorf("variable %s must be a 32 bits integer, got %s", n, v.Type)
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			kv, err := internal.KernelVersion()
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return fmt.Errorf("getting kernel version: %w", err)
 | 
			
		||||
			}
 | 
			
		||||
			internal.NativeEndian.PutUint32(data[vsi.Offset:], kv.Kernel())
 | 
			
		||||
 | 
			
		||||
		case "LINUX_HAS_SYSCALL_WRAPPER":
 | 
			
		||||
			if integer, ok := v.Type.(*btf.Int); !ok || integer.Size != 4 {
 | 
			
		||||
				return fmt.Errorf("variable %s must be a 32 bits integer, got %s", n, v.Type)
 | 
			
		||||
			}
 | 
			
		||||
			var value uint32 = 1
 | 
			
		||||
			if err := haveSyscallWrapper(); errors.Is(err, ErrNotSupported) {
 | 
			
		||||
				value = 0
 | 
			
		||||
			} else if err != nil {
 | 
			
		||||
				return fmt.Errorf("unable to derive a value for LINUX_HAS_SYSCALL_WRAPPER: %w", err)
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			internal.NativeEndian.PutUint32(data[vsi.Offset:], value)
 | 
			
		||||
 | 
			
		||||
		default: // Catch CONFIG_*.
 | 
			
		||||
			configs[n] = configInfo{
 | 
			
		||||
				offset: vsi.Offset,
 | 
			
		||||
				typ:    v.Type,
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// We only parse kconfig file if a CONFIG_* variable was found.
 | 
			
		||||
	if len(configs) > 0 {
 | 
			
		||||
		f, err := kconfig.Find()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return fmt.Errorf("cannot find a kconfig file: %w", err)
 | 
			
		||||
		}
 | 
			
		||||
		defer f.Close()
 | 
			
		||||
 | 
			
		||||
		filter := make(map[string]struct{}, len(configs))
 | 
			
		||||
		for config := range configs {
 | 
			
		||||
			filter[config] = struct{}{}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		kernelConfig, err := kconfig.Parse(f, filter)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return fmt.Errorf("cannot parse kconfig file: %w", err)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		for n, info := range configs {
 | 
			
		||||
			value, ok := kernelConfig[n]
 | 
			
		||||
			if !ok {
 | 
			
		||||
				return fmt.Errorf("config option %q does not exists for this kernel", n)
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			err := kconfig.PutValue(data[info.offset:], info.typ, value)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return fmt.Errorf("problem adding value for %s: %w", n, err)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	m.Contents = []MapKV{{uint32(0), data}}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// LoadCollection reads an object file and creates and loads its declared
 | 
			
		||||
// resources into the kernel.
 | 
			
		||||
//
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user