From 3044eb4ec945b2dd1b1816a19a29db4623785e86 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 d933194a113..be14626449d 100644 --- a/pkg/option/flags.go +++ b/pkg/option/flags.go @@ -69,6 +69,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 d159b7d9a53..20e927f6af1 100644 --- a/pkg/sensors/tracing/genericuprobe.go +++ b/pkg/sensors/tracing/genericuprobe.go @@ -251,7 +251,7 @@ type addUprobeIn struct { func createGenericUprobeSensor( name string, - uprobes []v1alpha1.UProbeSpec, + spec *v1alpha1.TracingPolicySpec, policyName string, ) (*sensors.Sensor, error) { var progs []*program.Program @@ -259,14 +259,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 } @@ -489,5 +498,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)