Skip to content

Commit 6fc53d4

Browse files
committed
Add list function to list events
1 parent fb4e206 commit 6fc53d4

File tree

1 file changed

+40
-2
lines changed

1 file changed

+40
-2
lines changed

src/LinuxPerf.jl

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ const EVENT_TYPES =
7676
(:stalled_cycles_backend, 8), # PERF_COUNT_HW_STALLED_CYCLES_BACKEND
7777
(:scaled_cycles, 9) # PERF_COUNT_HW_REF_CPU_CYCLES
7878
]),
79-
(:sw, 1, # PERF_TYPE_SOFTWARE
79+
(:sw, PERF_TYPE_SOFTWARE,
8080
[(:cpu_clock, 0), # PERF_COUNT_SW_CPU_CLOCK
8181
(:task_clock, 1), # PEF_COUNT_SW_TASK_CLOCK
8282
(:page_faults, 2), # PERF_COUNT_SW_PAGE_FAULTS
@@ -414,9 +414,47 @@ const NAME_TO_EVENT = Dict(
414414
"iTLB-load-misses" => EventType(:cache, :TLB_insn, :read, :miss),
415415
"iTLB-loads" => EventType(:cache, :TLB_insn, :read, :access),
416416
)
417-
418417
const EVENT_TO_NAME = Dict(event => name for (name, event) in NAME_TO_EVENT)
419418

419+
function is_supported(event::EventType)
420+
attr = perf_event_attr()
421+
attr.typ = event.category
422+
attr.size = sizeof(perf_event_attr)
423+
attr.config = event.event
424+
fd = perf_event_open(attr, 0, -1, -1, 0)
425+
if fd 0
426+
ret = ccall(:close, Cint, (Cint,), fd)
427+
if ret != 0
428+
@warn "failed to close file descriptor for some reason"
429+
end
430+
return true
431+
end
432+
return false
433+
end
434+
435+
is_supported(name::AbstractString) = haskey(NAME_TO_EVENT, name) && is_supported(NAME_TO_EVENT[name])
436+
437+
function list()
438+
for t in [PERF_TYPE_HARDWARE, PERF_TYPE_SOFTWARE, PERF_TYPE_HW_CACHE]
439+
events = collect(filter(x -> x[2].category == t, NAME_TO_EVENT))
440+
sort!(events, by = x -> x[1]) # sort events by name
441+
if t == PERF_TYPE_HARDWARE
442+
println("hardware:")
443+
elseif t == PERF_TYPE_SOFTWARE
444+
println("software:")
445+
elseif t == PERF_TYPE_HW_CACHE
446+
println("cache:")
447+
else
448+
@assert false
449+
end
450+
for (name, event) in events
451+
@printf " %-25s%s" name (is_supported(event) ? "supported" : "not supported")
452+
println()
453+
end
454+
t != PERF_TYPE_HW_CACHE && println()
455+
end
456+
end
457+
420458
function parse_pstats_options(opts)
421459
# default events
422460
events = parse_groups("

0 commit comments

Comments
 (0)