diff --git a/pkg/sensors/tracing/generickprobe.go b/pkg/sensors/tracing/generickprobe.go index 85eefb09884..26d9a43713d 100644 --- a/pkg/sensors/tracing/generickprobe.go +++ b/pkg/sensors/tracing/generickprobe.go @@ -508,11 +508,19 @@ func createGenericKprobeSensor( kprobes := spec.KProbes lists := spec.Lists + options, err := getKprobeOptions(spec.Options) + if err != nil { + return nil, fmt.Errorf("failed to set options: %s", err) + } + // use multi kprobe only if: + // - it's not disable via spec options // - it's not disabled by user // - there's support detected - useMulti = !option.Config.DisableKprobeMulti && - bpf.HasKprobeMulti() + if !options.DisableKprobeMulti { + useMulti = !option.Config.DisableKprobeMulti && + bpf.HasKprobeMulti() + } in := addKprobeIn{ useMulti: useMulti, diff --git a/pkg/sensors/tracing/options.go b/pkg/sensors/tracing/options.go new file mode 100644 index 00000000000..d8706e4dca1 --- /dev/null +++ b/pkg/sensors/tracing/options.go @@ -0,0 +1,51 @@ +package tracing + +import ( + "fmt" + "strconv" + + "github.com/cilium/tetragon/pkg/k8s/apis/cilium.io/v1alpha1" + "github.com/cilium/tetragon/pkg/logger" + "github.com/cilium/tetragon/pkg/option" +) + +type kprobeOptions struct { + DisableKprobeMulti bool +} + +func getKprobeOptions(specs []v1alpha1.OptionSpec) (*kprobeOptions, error) { + type opt struct { + name string + set func(val string) error + } + + options := &kprobeOptions{} + + var opts = []opt{ + opt{ + // local --disable-kprobe-multi + name: option.KeyDisableKprobeMulti, + set: func(str string) (err error) { + options.DisableKprobeMulti, err = strconv.ParseBool(str) + return err + }, + }, + } + + for i := range specs { + spec := specs[i] + + for j := range opts { + opt := opts[j] + + if opt.name == spec.Name { + if err := opt.set(spec.Value); err != nil { + return nil, fmt.Errorf("failed to set option %s: %s", opt.name, err) + } + logger.GetLogger().Infof("Set option %s = %s", spec.Name, spec.Value) + } + } + } + + return options, nil +}