From e16d9160372494af1685ae797488c2d92863bb4c Mon Sep 17 00:00:00 2001 From: Jiri Olsa Date: Tue, 30 Jan 2024 21:34:37 +0000 Subject: [PATCH] tetragon: Add support to disable uprobe multi through spec options Adding support to process options passed in spec for uprobe sensor. At the moment the only supported option is to disable uprobe multi. Signed-off-by: Jiri Olsa --- pkg/option/flags.go | 1 + pkg/sensors/tracing/genericuprobe.go | 19 ++++++++++++++----- pkg/sensors/tracing/options.go | 7 +++++++ 3 files changed, 22 insertions(+), 5 deletions(-) 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)