Skip to content

Commit

Permalink
Add support to pin kprobe link
Browse files Browse the repository at this point in the history
Signed-off-by: Jiri Olsa <[email protected]>
  • Loading branch information
olsajiri committed Jun 22, 2024
1 parent 1174657 commit b88f1da
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 15 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: 15 additions & 14 deletions link/perf_event.go
Original file line number Diff line number Diff line change
Expand Up @@ -99,30 +99,31 @@ 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) Pin(fileName string) error {
if err := internal.Pin(pl.pinnedPath, fileName, pl.fd); err != nil {
return err
}
pl.pinnedPath = fileName
return nil
}

func (pl *perfEventLink) Unpin() error {
return fmt.Errorf("perf event link unpin: %w", ErrNotSupported)
if err := internal.Unpin(pl.pinnedPath); err != nil {
return err
}
pl.pinnedPath = ""
return nil
}

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

if pl.pe == nil {
return nil
}

if err := pl.pe.Close(); err != nil {
return fmt.Errorf("perf event close: %w", err)
}
Expand Down

0 comments on commit b88f1da

Please sign in to comment.