Skip to content

Commit

Permalink
Add support to pin kprobe perf link
Browse files Browse the repository at this point in the history
As suggested by Lorenz removing perfEventLink Pin/UnPin so the
RawLink Pin/Unpi methods take over and implement pinning for
perf link kprobes.

Signed-off-by: Jiri Olsa <[email protected]>
  • Loading branch information
olsajiri committed Jun 26, 2024
1 parent 3abc993 commit c37accb
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 20 deletions.
2 changes: 1 addition & 1 deletion link/link.go
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ func wrapRawLink(raw *RawLink) (_ Link, err error) {
case UprobeMultiType:
return &uprobeMultiLink{*raw}, nil
case PerfEventType:
return nil, fmt.Errorf("recovering perf event fd: %w", ErrNotSupported)
return &perfEventLink{*raw, nil}, nil
case TCXType:
return &tcxLink{*raw}, nil
case NetfilterType:
Expand Down
29 changes: 10 additions & 19 deletions link/perf_event.go
Original file line number Diff line number Diff line change
Expand Up @@ -99,30 +99,16 @@ type perfEventLink struct {

func (pl *perfEventLink) isLink() {}

// Pinning requires the underlying perf event FD to stay open.
//
// | PerfEvent FD | BpfLink FD | Works |
// |--------------|------------|-------|
// | Open | Open | Yes |
// | Closed | Open | No |
// | Open | Closed | No (Pin() -> EINVAL) |
// | Closed | Closed | No (Pin() -> EINVAL) |
//
// There is currently no pretty way to recover the perf event FD
// when loading a pinned link, so leave as not supported for now.
func (pl *perfEventLink) Pin(string) error {
return fmt.Errorf("perf event link pin: %w", ErrNotSupported)
}

func (pl *perfEventLink) Unpin() error {
return fmt.Errorf("perf event link unpin: %w", ErrNotSupported)
}

func (pl *perfEventLink) Close() error {
if err := pl.fd.Close(); err != nil {
return fmt.Errorf("perf link close: %w", err)
}

// when created from pinned link
if pl.pe == nil {
return nil
}

if err := pl.pe.Close(); err != nil {
return fmt.Errorf("perf event close: %w", err)
}
Expand All @@ -136,6 +122,11 @@ func (pl *perfEventLink) Update(prog *ebpf.Program) error {
var _ PerfEvent = (*perfEventLink)(nil)

func (pl *perfEventLink) PerfEvent() (*os.File, error) {
// when created from pinned link
if pl.pe == nil {
return nil, ErrNotSupported
}

fd, err := pl.pe.fd.Dup()
if err != nil {
return nil, err
Expand Down

0 comments on commit c37accb

Please sign in to comment.