Skip to content

Commit e064545

Browse files
Asphalttbrb
authored andcommitted
Refactor code of attaching kprobe
Hide attaching kprobes progress from `main.go`. Signed-off-by: Leon Hwang <hffilwlqm@gmail.com>
1 parent 059997a commit e064545

File tree

2 files changed

+63
-55
lines changed

2 files changed

+63
-55
lines changed

internal/pwru/kprobe.go

Lines changed: 57 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,13 @@ import (
1818
"golang.org/x/sync/errgroup"
1919
)
2020

21+
type kprober struct {
22+
links []link.Link
23+
24+
kprobeMulti bool
25+
kprobeBatch uint
26+
}
27+
2128
type Kprobe struct {
2229
hookFunc string // internal use
2330
HookFuncs []string
@@ -115,13 +122,15 @@ func AttachKprobes(ctx context.Context, bar *pb.ProgressBar, kps []Kprobe, batch
115122
}
116123

117124
// DetachKprobes detaches kprobes concurrently.
118-
func DetachKprobes(links []link.Link, batch uint) {
125+
func (k *kprober) DetachKprobes() {
119126
log.Println("Detaching kprobes...")
120127

128+
links := k.links
121129
bar := pb.StartNew(len(links))
122130
defer bar.Finish()
123131

124-
if batch == 0 || batch >= uint(len(links)) {
132+
batch := k.kprobeBatch
133+
if k.kprobeMulti || batch >= uint(len(links)) {
125134
for _, l := range links {
126135
_ = l.Close()
127136
bar.Increment()
@@ -188,3 +197,49 @@ func AttachKprobeMulti(ctx context.Context, bar *pb.ProgressBar, kprobes []Kprob
188197

189198
return
190199
}
200+
201+
func KprobeFuncs(ctx context.Context, funcs Funcs, coll *ebpf.Collection, a2n Addr2Name, useKprobeMulti bool, batch uint) *kprober {
202+
msg := "kprobe"
203+
if useKprobeMulti {
204+
msg = "kprobe-multi"
205+
}
206+
log.Printf("Attaching kprobes (via %s)...\n", msg)
207+
208+
ignored := 0
209+
bar := pb.StartNew(len(funcs))
210+
211+
pwruKprobes := make([]Kprobe, 0, len(funcs))
212+
funcsByPos := GetFuncsByPos(funcs)
213+
for pos, fns := range funcsByPos {
214+
fn, ok := coll.Programs[fmt.Sprintf("kprobe_skb_%d", pos)]
215+
if ok {
216+
pwruKprobes = append(pwruKprobes, Kprobe{HookFuncs: fns, Prog: fn})
217+
} else {
218+
ignored += len(fns)
219+
bar.Add(len(fns))
220+
}
221+
}
222+
223+
var k kprober
224+
k.kprobeMulti = useKprobeMulti
225+
k.kprobeBatch = batch
226+
227+
if !useKprobeMulti {
228+
l, i := AttachKprobes(ctx, bar, pwruKprobes, batch)
229+
k.links = l
230+
ignored += i
231+
} else {
232+
l, i := AttachKprobeMulti(ctx, bar, pwruKprobes, a2n)
233+
k.links = l
234+
ignored += i
235+
}
236+
bar.Finish()
237+
select {
238+
case <-ctx.Done():
239+
return nil
240+
default:
241+
}
242+
log.Printf("Attached (ignored %d)\n", ignored)
243+
244+
return &k
245+
}

main.go

Lines changed: 6 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ import (
1414
"syscall"
1515
"time"
1616

17-
pb "github.com/cheggaaa/pb/v3"
1817
"github.com/cilium/ebpf"
1918
"github.com/cilium/ebpf/btf"
2019
"github.com/cilium/ebpf/link"
@@ -198,35 +197,16 @@ func main() {
198197
defer close()
199198
}
200199

201-
var kprobes []link.Link
202-
defer func() {
203-
batch := uint(0)
204-
if !useKprobeMulti {
205-
batch = flags.FilterKprobeBatch
206-
}
207-
pwru.DetachKprobes(kprobes, batch)
208-
}()
209-
210-
msg := "kprobe"
211-
if useKprobeMulti {
212-
msg = "kprobe-multi"
213-
}
214-
log.Printf("Attaching kprobes (via %s)...\n", msg)
215-
ignored := 0
216-
bar := pb.StartNew(len(funcs))
217-
218200
if flags.FilterTrackSkb || flags.FilterTrackSkbByStackid {
219201
kp, err := link.Kprobe("kfree_skbmem", coll.Programs["kprobe_skb_lifetime_termination"], nil)
220-
bar.Increment()
221202
if err != nil {
222203
if !errors.Is(err, os.ErrNotExist) {
223204
log.Fatalf("Opening kprobe kfree_skbmem: %s\n", err)
224205
} else {
225-
ignored += 1
226206
log.Printf("Warn: kfree_skbmem not found, pwru is likely to mismatch skb due to lack of skb lifetime management\n")
227207
}
228208
} else {
229-
kprobes = append(kprobes, kp)
209+
defer kp.Close()
230210
}
231211
}
232212

@@ -239,15 +219,12 @@ func main() {
239219
fexit, err := link.AttachTracing(link.TracingOptions{
240220
Program: prog,
241221
})
242-
bar.Increment()
243222
if err != nil {
244223
if !errors.Is(err, os.ErrNotExist) {
245224
log.Fatalf("Opening tracing(%s): %s\n", prog, err)
246-
} else {
247-
ignored += 1
248225
}
249226
} else {
250-
kprobes = append(kprobes, fexit)
227+
defer fexit.Close()
251228
}
252229
}
253230
}
@@ -258,41 +235,17 @@ func main() {
258235
continue
259236
}
260237
kp, err := link.Kprobe(fn, coll.Programs["kprobe_skb_by_stackid"], nil)
261-
bar.Increment()
262238
if err != nil {
263239
log.Fatalf("Opening kprobe %s: %s\n", fn, err)
264240
}
265-
kprobes = append(kprobes, kp)
241+
defer kp.Close()
266242
}
267243
}
268244

269-
pwruKprobes := make([]pwru.Kprobe, 0, len(funcs))
270-
funcsByPos := pwru.GetFuncsByPos(funcs)
271-
for pos, fns := range funcsByPos {
272-
fn, ok := coll.Programs[fmt.Sprintf("kprobe_skb_%d", pos)]
273-
if ok {
274-
pwruKprobes = append(pwruKprobes, pwru.Kprobe{HookFuncs: fns, Prog: fn})
275-
} else {
276-
ignored += len(fns)
277-
bar.Add(len(fns))
278-
}
279-
}
280-
if !useKprobeMulti {
281-
l, i := pwru.AttachKprobes(ctx, bar, pwruKprobes, flags.FilterKprobeBatch)
282-
kprobes = append(kprobes, l...)
283-
ignored += i
284-
} else {
285-
l, i := pwru.AttachKprobeMulti(ctx, bar, pwruKprobes, addr2name)
286-
kprobes = append(kprobes, l...)
287-
ignored += i
288-
}
289-
bar.Finish()
290-
select {
291-
case <-ctx.Done():
292-
return
293-
default:
245+
if len(funcs) != 0 {
246+
k := pwru.KprobeFuncs(ctx, funcs, coll, addr2name, useKprobeMulti, flags.FilterKprobeBatch)
247+
defer k.DetachKprobes()
294248
}
295-
log.Printf("Attached (ignored %d)\n", ignored)
296249

297250
log.Println("Listening for events..")
298251

0 commit comments

Comments
 (0)