summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--internal/ior.go30
-rw-r--r--internal/ior_test.go11
2 files changed, 33 insertions, 8 deletions
diff --git a/internal/ior.go b/internal/ior.go
index 7a1b378..d78c351 100644
--- a/internal/ior.go
+++ b/internal/ior.go
@@ -14,6 +14,7 @@ import (
"ior/internal/event"
"ior/internal/flags"
"ior/internal/flamegraph"
+ "ior/internal/probemanager"
"ior/internal/statsengine"
"ior/internal/tracepoints"
"ior/internal/tui"
@@ -23,7 +24,11 @@ import (
)
type tracepointProgram interface {
- attachTracepoint(category, name string) error
+ attachTracepoint(category, name string) (tracepointLink, error)
+}
+
+type tracepointLink interface {
+ Destroy() error
}
var (
@@ -40,9 +45,12 @@ type libbpfTracepointProgram struct {
prog *bpf.BPFProg
}
-func (p libbpfTracepointProgram) attachTracepoint(category, name string) error {
- _, err := p.prog.AttachTracepoint(category, name)
- return err
+func (p libbpfTracepointProgram) AttachTracepoint(category, name string) (probemanager.Link, error) {
+ return p.prog.AttachTracepoint(category, name)
+}
+
+func (p libbpfTracepointProgram) attachTracepoint(category, name string) (tracepointLink, error) {
+ return p.AttachTracepoint(category, name)
}
type libbpfTracepointModule struct {
@@ -57,6 +65,14 @@ func (m libbpfTracepointModule) getProgram(progName string) (tracepointProgram,
return libbpfTracepointProgram{prog: prog}, nil
}
+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 attachTracepoints(bpfModule *bpf.Module) error {
return attachTracepointsWith(libbpfTracepointModule{module: bpfModule}, flags.Get().ShouldIAttachTracepoint, tracepoints.List, true)
}
@@ -81,7 +97,7 @@ func attachTracepointsWith(module tracepointModule, shouldAttach func(string) bo
}
logln("Attached prog handle_", name)
- if err = prog.attachTracepoint("syscalls", name); err != nil {
+ if _, err = prog.attachTracepoint("syscalls", name); err != nil {
// OK, older Kernel versions may not have this tracepoint!
logf("Failed to attach to %s tracepoint: %v, kernel version may be too old, skipping", name, err)
continue
@@ -210,7 +226,9 @@ func runTraceWithContext(parentCtx context.Context, started chan<- struct{}, con
return err
}
- if err := attachTracepointsWith(libbpfTracepointModule{module: bpfModule}, flags.Get().ShouldIAttachTracepoint, tracepoints.List, verbose); err != nil {
+ mgr := probemanager.NewManager(libbpfTracepointModule{module: bpfModule})
+ defer mgr.Close()
+ if err := mgr.AttachAll(flags.Get().ShouldIAttachTracepoint, tracepoints.List); err != nil {
return err
}
diff --git a/internal/ior_test.go b/internal/ior_test.go
index 7f7eb20..43e8091 100644
--- a/internal/ior_test.go
+++ b/internal/ior_test.go
@@ -11,9 +11,16 @@ type fakeTracepointProgram struct {
attachErr error
}
-func (p *fakeTracepointProgram) attachTracepoint(_, _ string) error {
+type fakeTracepointLink struct{}
+
+func (fakeTracepointLink) Destroy() error { return nil }
+
+func (p *fakeTracepointProgram) attachTracepoint(_, _ string) (tracepointLink, error) {
p.attachCalls++
- return p.attachErr
+ if p.attachErr != nil {
+ return nil, p.attachErr
+ }
+ return fakeTracepointLink{}, nil
}
type fakeTracepointModule struct {