Skip to content

Commit 61e7017

Browse files
committed
Add list function to list events
1 parent d9d26e2 commit 61e7017

File tree

1 file changed

+44
-3
lines changed

1 file changed

+44
-3
lines changed

src/LinuxPerf.jl

Lines changed: 44 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,12 @@ end
5555

5656
perf_event_attr() = perf_event_attr(ntuple(x->0, fieldcount(perf_event_attr))...)
5757

58+
const PERF_TYPE_HARDWARE = 0
59+
const PERF_TYPE_SOFTWARE = 1
60+
5861
const EVENT_TYPES =
5962
[
60-
(:hw, 0, # PERF_TYPE_HARDWARE
63+
(:hw, PERF_TYPE_HARDWARE,
6164
[(:cycles, 0), # PERF_COUNT_HW_CPU_CYCLES
6265
(:instructions, 1), # PERF_COUNT_HW_INSTRUCTIONS
6366
(:cache_access, 2), # PERF_COUNT_HW_CACHE_REFERENCES
@@ -69,7 +72,7 @@ const EVENT_TYPES =
6972
(:stalled_cycles_backend, 8), # PERF_COUNT_HW_STALLED_CYCLES_BACKEND
7073
(:scaled_cycles, 9) # PERF_COUNT_HW_REF_CPU_CYCLES
7174
]),
72-
(:sw, 1, # PERF_TYPE_SOFTWARE
75+
(:sw, PERF_TYPE_SOFTWARE,
7376
[(:cpu_clock, 0), # PERF_COUNT_SW_CPU_CLOCK
7477
(:task_clock, 1), # PEF_COUNT_SW_TASK_CLOCK
7578
(:page_faults, 2), # PERF_COUNT_SW_PAGE_FAULTS
@@ -390,9 +393,47 @@ const NAME_TO_EVENT = Dict(
390393
"iTLB-load-misses" => EventType(:cache, :TLB_insn, :read, :miss),
391394
"iTLB-loads" => EventType(:cache, :TLB_insn, :read, :access),
392395
)
393-
394396
const EVENT_TO_NAME = Dict(event => name for (name, event) in NAME_TO_EVENT)
395397

398+
function is_supported(event::EventType)
399+
attr = perf_event_attr()
400+
attr.typ = event.category
401+
attr.size = sizeof(perf_event_attr)
402+
attr.config = event.event
403+
fd = perf_event_open(attr, 0, -1, -1, 0)
404+
if fd 0
405+
ret = ccall(:close, Cint, (Cint,), fd)
406+
if ret != 0
407+
@warn "failed to close file descriptor for some reason"
408+
end
409+
return true
410+
end
411+
return false
412+
end
413+
414+
is_supported(name::AbstractString) = haskey(NAME_TO_EVENT, name) && is_supported(NAME_TO_EVENT[name])
415+
416+
function list()
417+
for t in [PERF_TYPE_HARDWARE, PERF_TYPE_SOFTWARE, PERF_TYPE_HW_CACHE]
418+
events = collect(filter(x -> x[2].category == t, NAME_TO_EVENT))
419+
sort!(events, by = x -> x[1]) # sort events by name
420+
if t == PERF_TYPE_HARDWARE
421+
println("hardware:")
422+
elseif t == PERF_TYPE_SOFTWARE
423+
println("software:")
424+
elseif t == PERF_TYPE_HW_CACHE
425+
println("cache:")
426+
else
427+
@assert false
428+
end
429+
for (name, event) in events
430+
@printf " %-25s%s" name (is_supported(event) ? "supported" : "not supported")
431+
println()
432+
end
433+
t != PERF_TYPE_HW_CACHE && println()
434+
end
435+
end
436+
396437
function parse_pstats_options(opts)
397438
# default events
398439
events = parse_groups("

0 commit comments

Comments
 (0)