summaryrefslogtreecommitdiff
path: root/internal/ior_bpfsetup.go
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-03-18 09:21:25 +0200
committerPaul Buetow <paul@buetow.org>2026-03-18 09:21:25 +0200
commit630ea0ff27b8e9ff9287eaaf67660845406a19a6 (patch)
tree84a6d4cec5780fd0f677d9b1f22238f775aa21f1 /internal/ior_bpfsetup.go
parent3f85aa438bffaad287a450898c44942634944c22 (diff)
refactor: split ior.go mega-file into focused files (task 427)
ior.go had 763 lines covering 9+ concerns. Follow the eventloop_*.go pattern and extract into three focused files: - ior_bpfsetup.go: libbpfTracepoint{Program,Module} adapter types, setupBPFModule, setupBPFModuleError, setupEventChannel - ior_profiling.go: profilingControl type, setupProfiling, profilingFilesForMode, stop() - ior_parquet_sink.go: headlessParquetSink type, runHeadlessParquet, isHeadlessParquetMode, hasHeadlessParquetContentFilters, headlessParquetTraceConfig; inline parquetMetadata one-liner ior.go shrinks from 763 → 453 lines, retaining entry, dispatch, TUI wiring, and core trace execution. Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
Diffstat (limited to 'internal/ior_bpfsetup.go')
-rw-r--r--internal/ior_bpfsetup.go89
1 files changed, 89 insertions, 0 deletions
diff --git a/internal/ior_bpfsetup.go b/internal/ior_bpfsetup.go
new file mode 100644
index 0000000..cf0b112
--- /dev/null
+++ b/internal/ior_bpfsetup.go
@@ -0,0 +1,89 @@
+package internal
+
+import (
+ "context"
+ "fmt"
+
+ appconfig "ior/internal/config"
+ "ior/internal/flags"
+ "ior/internal/probemanager"
+ "ior/internal/tracepoints"
+ "ior/internal/tui"
+
+ bpf "github.com/aquasecurity/libbpfgo"
+)
+
+// libbpfTracepointProgram wraps a libbpf BPF program as a probemanager.Program.
+type libbpfTracepointProgram struct {
+ prog *bpf.BPFProg
+}
+
+func (p libbpfTracepointProgram) AttachTracepoint(category, name string) (probemanager.Link, error) {
+ return p.prog.AttachTracepoint(category, name)
+}
+
+// libbpfTracepointModule wraps a libbpf BPF module as a probemanager.Module.
+type libbpfTracepointModule struct {
+ module *bpf.Module
+}
+
+func (m libbpfTracepointModule) GetProgram(progName string) (probemanager.Program, error) {
+ prog, err := m.module.GetProgram(progName)
+ if err != nil {
+ return nil, err
+ }
+ return libbpfTracepointProgram{prog: prog}, nil
+}
+
+func setupBPFModuleError(stage string, err error) error {
+ if err == nil {
+ return nil
+ }
+ return fmt.Errorf("setup BPF module: %s: %w", stage, err)
+}
+
+// setupBPFModule loads and attaches the BPF module, attaching tracepoints
+// and registering the probe manager with any TUI runtime bindings.
+func setupBPFModule(parentCtx context.Context, cfg flags.Config) (*bpf.Module, *probemanager.Manager, func(), error) {
+ releaseBindings := func() {}
+
+ bpfModule, stage, err := loadBPFModule()
+ if err != nil {
+ return nil, nil, releaseBindings, setupBPFModuleError(stage, err)
+ }
+ if err := resizeBPFMaps(cfg, bpfModule); err != nil {
+ bpfModule.Close()
+ return nil, nil, releaseBindings, setupBPFModuleError("resize maps", err)
+ }
+ if err := setBPFGlobals(cfg, bpfModule); err != nil {
+ bpfModule.Close()
+ return nil, nil, releaseBindings, setupBPFModuleError("set globals", err)
+ }
+ if err := bpfModule.BPFLoadObject(); err != nil {
+ bpfModule.Close()
+ return nil, nil, releaseBindings, setupBPFModuleError("load object", err)
+ }
+
+ mgr := probemanager.NewManager(libbpfTracepointModule{module: bpfModule})
+ if err := mgr.AttachAll(cfg.ShouldIAttachTracepoint, tracepoints.List); err != nil {
+ mgr.Close()
+ bpfModule.Close()
+ return nil, nil, releaseBindings, setupBPFModuleError("attach probes", err)
+ }
+ if bindings, ok := tui.RuntimeBindingsFromContext(parentCtx); ok {
+ bindings.SetProbeManager(mgr)
+ releaseBindings = func() { bindings.SetProbeManager(nil) }
+ }
+ return bpfModule, mgr, releaseBindings, nil
+}
+
+// setupEventChannel initialises the BPF ring-buffer and returns the event channel.
+func setupEventChannel(bpfModule *bpf.Module) (chan []byte, error) {
+ ch := make(chan []byte, appconfig.DefaultChannelBufferSize)
+ rb, err := bpfModule.InitRingBuf("event_map", ch)
+ if err != nil {
+ return nil, err
+ }
+ rb.Poll(300)
+ return ch, nil
+}