diff --git a/pkg/option/flags.go b/pkg/option/flags.go index 56b2d4a9fcb..2dd3311f669 100644 --- a/pkg/option/flags.go +++ b/pkg/option/flags.go @@ -68,6 +68,7 @@ const ( KeyNetnsDir = "netns-dir" KeyDisableKprobeMulti = "disable-kprobe-multi" + KeyDisableUprobeMulti = "disable-uprobe-multi" KeyRBSize = "rb-size" KeyRBSizeTotal = "rb-size-total" diff --git a/pkg/sensors/tracing/genericuprobe.go b/pkg/sensors/tracing/genericuprobe.go index 2872bb930eb..9238eebb907 100644 --- a/pkg/sensors/tracing/genericuprobe.go +++ b/pkg/sensors/tracing/genericuprobe.go @@ -248,7 +248,7 @@ type addUprobeIn struct { func createGenericUprobeSensor( name string, - uprobes []v1alpha1.UProbeSpec, + spec *v1alpha1.TracingPolicySpec, policyName string, ) (*sensors.Sensor, error) { var progs []*program.Program @@ -256,14 +256,23 @@ func createGenericUprobeSensor( var ids []idtable.EntryID var err error + options, err := getSpecOptions(spec.Options) + if err != nil { + return nil, fmt.Errorf("failed to set options: %s", err) + } + in := addUprobeIn{ sensorPath: name, policyName: policyName, - useMulti: bpf.HasUprobeMulti(), + + // use multi kprobe only if: + // - it's not disabled by spec option + // - there's support detected + useMulti: !options.DisableUprobeMulti && bpf.HasUprobeMulti(), } - for _, spec := range uprobes { - ids, err = addUprobe(&spec, ids, &in) + for _, uprobe := range spec.UProbes { + ids, err = addUprobe(&uprobe, ids, &in) if err != nil { return nil, err } @@ -480,5 +489,5 @@ func (k *observerUprobeSensor) PolicyHandler( name := fmt.Sprintf("gup-sensor-%d", atomic.AddUint64(&sensorCounter, 1)) policyName := p.TpName() - return createGenericUprobeSensor(name, spec.UProbes, policyName) + return createGenericUprobeSensor(name, spec, policyName) } diff --git a/pkg/sensors/tracing/options.go b/pkg/sensors/tracing/options.go index ac34b853ed9..e618c41d5d5 100644 --- a/pkg/sensors/tracing/options.go +++ b/pkg/sensors/tracing/options.go @@ -40,6 +40,7 @@ func overrideMethodParse(s string) OverrideMethod { type specOptions struct { DisableKprobeMulti bool + DisableUprobeMulti bool OverrideMethod OverrideMethod } @@ -62,6 +63,12 @@ var opts = map[string]opt{ return err }, }, + option.KeyDisableUprobeMulti: opt{ + set: func(str string, options *specOptions) (err error) { + options.DisableUprobeMulti, err = strconv.ParseBool(str) + return err + }, + }, keyOverrideMethod: opt{ set: func(str string, options *specOptions) (err error) { m := overrideMethodParse(str)