diff --git a/link/cgroup.go b/link/cgroup.go index 79f3d2b7f..61432d23f 100644 --- a/link/cgroup.go +++ b/link/cgroup.go @@ -168,6 +168,10 @@ func (cg *progAttachCgroup) Info() (*Info, error) { return nil, fmt.Errorf("can't get cgroup info: %w", ErrNotSupported) } +func (cg *progAttachCgroup) PerfFd() (int, error) { + return -1, fmt.Errorf("perf event fd: %w", ErrNotSupported) +} + type linkCgroup struct { RawLink } diff --git a/link/link.go b/link/link.go index 03368a201..423641ee4 100644 --- a/link/link.go +++ b/link/link.go @@ -44,6 +44,11 @@ type Link interface { // Prevent external users from implementing this interface. isLink() + + // PerfFd returns perf event file descriptor for perf event based links. + // + // May return an error wrapping ErrNotSupported + PerfFd() (int, error) } // NewLinkFromFD creates a link from a raw fd. @@ -362,3 +367,7 @@ func (l *RawLink) Info() (*Info, error) { extra, }, nil } + +func (l *RawLink) PerfFd() (int, error) { + return -1, fmt.Errorf("perf event fd: %w", ErrNotSupported) +} diff --git a/link/perf_event.go b/link/perf_event.go index b21e1701b..31026f8ed 100644 --- a/link/perf_event.go +++ b/link/perf_event.go @@ -156,6 +156,14 @@ func (pi *perfEventIoctl) Info() (*Info, error) { return nil, fmt.Errorf("perf event ioctl info: %w", ErrNotSupported) } +func (pi *perfEventIoctl) PerfFd() (int, error) { + dup, err := pi.fd.Dup() + if err != nil { + return -1, fmt.Errorf("can't clone fd: %w", err) + } + return dup.Int(), nil +} + type PerfEventInfo struct { Type PerfEventInfoType extra interface{} @@ -244,6 +252,14 @@ func (pl *perfEventLink) Info() (*Info, error) { }, nil } +func (pl *perfEventLink) PerfFd() (int, error) { + dup, err := pl.fd.Dup() + if err != nil { + return -1, fmt.Errorf("can't clone fd: %w", err) + } + return dup.Int(), nil +} + // attach the given eBPF prog to the perf event stored in pe. // pe must contain a valid perf event fd. // prog's type must match the program type stored in pe. diff --git a/link/raw_tracepoint.go b/link/raw_tracepoint.go index 925e621cb..81e34a283 100644 --- a/link/raw_tracepoint.go +++ b/link/raw_tracepoint.go @@ -76,6 +76,10 @@ func (frt *simpleRawTracepoint) Info() (*Info, error) { return nil, fmt.Errorf("can't get raw_tracepoint info: %w", ErrNotSupported) } +func (frt *simpleRawTracepoint) PerfFd() (int, error) { + return -1, fmt.Errorf("perf event fd: %w", ErrNotSupported) +} + type rawTracepoint struct { RawLink }