Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

allow to pin kprobe and kprobe_multi links #1496

Merged
merged 1 commit into from
Jul 1, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 0 additions & 8 deletions link/kprobe_multi.go
Original file line number Diff line number Diff line change
Expand Up @@ -130,14 +130,6 @@ func (kml *kprobeMultiLink) Update(prog *ebpf.Program) error {
return fmt.Errorf("update kprobe_multi: %w", ErrNotSupported)
}

func (kml *kprobeMultiLink) Pin(string) error {
return fmt.Errorf("pin kprobe_multi: %w", ErrNotSupported)
}

func (kml *kprobeMultiLink) Unpin() error {
return fmt.Errorf("unpin kprobe_multi: %w", ErrNotSupported)
}

func (kml *kprobeMultiLink) Info() (*Info, error) {
var info sys.KprobeMultiLinkInfo
if err := sys.ObjInfo(kml.fd, &info); err != nil {
Expand Down
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
Loading