Skip to content

Commit

Permalink
link: Add Info interface support for perf event link
Browse files Browse the repository at this point in the history
kprobe so far

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
  • Loading branch information
olsajiri committed Mar 11, 2024
1 parent a505794 commit f7b09cf
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 2 deletions.
4 changes: 4 additions & 0 deletions internal/sys/syscall.go
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,10 @@ func (i *KprobeMultiLinkInfo) info() (unsafe.Pointer, uint32) {
return unsafe.Pointer(i), uint32(unsafe.Sizeof(*i))
}

func (i *KprobeLinkInfo) info() (unsafe.Pointer, uint32) {
return unsafe.Pointer(i), uint32(unsafe.Sizeof(*i))
}

var _ Info = (*BtfInfo)(nil)

func (i *BtfInfo) info() (unsafe.Pointer, uint32) {
Expand Down
42 changes: 40 additions & 2 deletions link/link.go
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,15 @@ type KprobeMultiInfo struct {
Missed uint64
}

type PerfEventInfo struct {
PerfEventType sys.PerfEventType
extra interface{}
}

type KprobeInfo struct {
Missed uint64
}

// Tracing returns tracing type-specific link info.
//
// Returns nil if the type-specific link info isn't available.
Expand Down Expand Up @@ -227,6 +236,19 @@ func (r Info) KprobeMulti() *KprobeMultiInfo {
return e
}

// PerfEvent returns perf-event type-specific link info.
//
// Returns nil if the type-specific link info isn't available.
func (r Info) PerfEvent() *PerfEventInfo {
e, _ := r.extra.(*PerfEventInfo)
return e
}

func (r *PerfEventInfo) Kprobe() *KprobeInfo {
e, _ := r.extra.(*KprobeInfo)
return e
}

// RawLink is the low-level API to bpf_link.
//
// You should consider using the higher level interfaces in this
Expand Down Expand Up @@ -402,8 +424,7 @@ func (l *RawLink) Info() (*Info, error) {
extra = &XDPInfo{
Ifindex: xdpInfo.Ifindex,
}
case RawTracepointType, IterType,
PerfEventType, UprobeMultiType:
case RawTracepointType, IterType, UprobeMultiType:
// Extra metadata not supported.
case TCXType:
var tcxInfo sys.TcxLinkInfo
Expand Down Expand Up @@ -435,6 +456,23 @@ func (l *RawLink) Info() (*Info, error) {
Flags: kprobeMultiInfo.Flags,
Missed: kprobeMultiInfo.Missed,
}
case PerfEventType:
var kprobeInfo sys.KprobeLinkInfo
if err := sys.ObjInfo(l.fd, &kprobeInfo); err != nil {
return nil, fmt.Errorf("kprobe multi link info: %s", err)
}
var extra2 interface{}

switch kprobeInfo.PerfEventType {
case KprobePEIType, KretprobePEIType:
extra2 = &KprobeInfo{
Missed: kprobeInfo.Missed,
}
}
extra = &PerfEventInfo{
PerfEventType: kprobeInfo.PerfEventType,
extra: extra2,
}
default:
return nil, fmt.Errorf("unknown link info type: %d", info.Type)
}
Expand Down
10 changes: 10 additions & 0 deletions link/link_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -220,6 +220,16 @@ func testLink(t *testing.T, link Link, prog *ebpf.Program) {
if kmulti.Count == 0 {
t.Fatalf("Failed to get link KprobeMulti extra info")
}
case sys.BPF_LINK_TYPE_PERF_EVENT:
// test default Info data
pevent := info.PerfEvent()
switch pevent.PerfEventType {
case KprobePEIType, KretprobePEIType:
kp := pevent.Kprobe()
if kp.Missed != 0 {
t.Fatalf("Failed to get link Kprobe extra info")
}
}
}
})

Expand Down

0 comments on commit f7b09cf

Please sign in to comment.