From fc8865a18521e0ced1aa20269a1e8c5e3fdd04e1 Mon Sep 17 00:00:00 2001 From: Jiri Olsa Date: Thu, 13 Feb 2025 16:04:40 +0100 Subject: [PATCH] tetragon: Move ksyms.KernelSymbols call early in validation The ksyms.KernelSymbols call is expensive, let's do it just once. Signed-off-by: Jiri Olsa --- pkg/btf/validation.go | 10 ++-------- pkg/sensors/tracing/generickprobe.go | 9 ++++++++- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/pkg/btf/validation.go b/pkg/btf/validation.go index f9773ce7519..067c2771894 100644 --- a/pkg/btf/validation.go +++ b/pkg/btf/validation.go @@ -44,15 +44,9 @@ func (e *ValidationFailed) Error() string { // NB: turns out we need more than BTF information for the validation (see // syscalls). We still keep this code in the btf package for now, and we can // move it once we found a better home for it. -func ValidateKprobeSpec(bspec *btf.Spec, call string, kspec *v1alpha1.KProbeSpec) error { +func ValidateKprobeSpec(bspec *btf.Spec, call string, kspec *v1alpha1.KProbeSpec, ks *ksyms.Ksyms) error { var fn *btf.Func - // get kernel symbols - ks, err := ksyms.KernelSymbols() - if err != nil { - return fmt.Errorf("validateKprobeSpec: ksyms.KernelSymbols: %w", err) - } - // check if this functio name is part of a kernel module if kmod, err := ks.GetKmod(call); err == nil { // get the spec from the kernel module and continue the validation with that @@ -64,7 +58,7 @@ func ValidateKprobeSpec(bspec *btf.Spec, call string, kspec *v1alpha1.KProbeSpec } origCall := call - err = bspec.TypeByName(call, &fn) + err := bspec.TypeByName(call, &fn) if err != nil && kspec.Syscall { // Try with system call prefix call, err = arch.AddSyscallPrefix(call) diff --git a/pkg/sensors/tracing/generickprobe.go b/pkg/sensors/tracing/generickprobe.go index 1465608565c..a01c6af09d5 100644 --- a/pkg/sensors/tracing/generickprobe.go +++ b/pkg/sensors/tracing/generickprobe.go @@ -28,6 +28,7 @@ import ( "github.com/cilium/tetragon/pkg/idtable" "github.com/cilium/tetragon/pkg/k8s/apis/cilium.io/v1alpha1" "github.com/cilium/tetragon/pkg/kernels" + "github.com/cilium/tetragon/pkg/ksyms" "github.com/cilium/tetragon/pkg/logger" "github.com/cilium/tetragon/pkg/metrics/kprobemetrics" "github.com/cilium/tetragon/pkg/observer" @@ -449,6 +450,12 @@ func preValidateKprobes(name string, kprobes []v1alpha1.KProbeSpec, lists []v1al return err } + // get kernel symbols + ks, err := ksyms.KernelSymbols() + if err != nil { + return fmt.Errorf("validateKprobeSpec: ksyms.KernelSymbols: %w", err) + } + for i := range kprobes { f := &kprobes[i] @@ -508,7 +515,7 @@ func preValidateKprobes(name string, kprobes []v1alpha1.KProbeSpec, lists []v1al for idx := range calls { // Now go over BTF validation - if err := btf.ValidateKprobeSpec(btfobj, calls[idx], f); err != nil { + if err := btf.ValidateKprobeSpec(btfobj, calls[idx], f, ks); err != nil { if warn, ok := err.(*btf.ValidationWarn); ok { logger.GetLogger().WithFields(logrus.Fields{ "sensor": name,