diff options
| author | Paul Buetow <paul@buetow.org> | 2026-03-18 09:21:25 +0200 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-03-18 09:21:25 +0200 |
| commit | 630ea0ff27b8e9ff9287eaaf67660845406a19a6 (patch) | |
| tree | 84a6d4cec5780fd0f677d9b1f22238f775aa21f1 /internal/ior_bpfsetup.go | |
| parent | 3f85aa438bffaad287a450898c44942634944c22 (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.go | 89 |
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 +} |
