mirror of https://github.com/rust-bpf/rust-bcc
51 lines
1.3 KiB
C
51 lines
1.3 KiB
C
// Copyright 2019-2020 Twitter, Inc.
|
|
// Licensed under the Apache License, Version 2.0
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
#include <linux/ptrace.h>
|
|
#include <uapi/linux/bpf_perf_event.h>
|
|
|
|
// Must provide the number of CPUs on the machine
|
|
BPF_PERF_ARRAY(cycle_perf, NUM_CPU);
|
|
BPF_PERF_ARRAY(instr_perf, NUM_CPU);
|
|
|
|
// Previously seen values
|
|
BPF_ARRAY(cycle_prev, u64, NUM_CPU);
|
|
BPF_ARRAY(instr_prev, u64, NUM_CPU);
|
|
|
|
// Tables which are read in user space
|
|
BPF_ARRAY(cycle, u64, NUM_CPU);
|
|
BPF_ARRAY(instr, u64, NUM_CPU);
|
|
|
|
int do_count(struct bpf_perf_event_data *ctx) {
|
|
u32 cpu = bpf_get_smp_processor_id();
|
|
|
|
u64 cycle_cnt = cycle_perf.perf_read(CUR_CPU_IDENTIFIER);
|
|
if (((s64)cycle_cnt < 0) && ((s64)cycle_cnt > -256))
|
|
return 0;
|
|
u64 instr_cnt = instr_perf.perf_read(CUR_CPU_IDENTIFIER);
|
|
if (((s64)instr_cnt < 0) && ((s64)instr_cnt > -256))
|
|
return 0;
|
|
|
|
u64* cyc_prev = cycle_prev.lookup(&cpu);
|
|
u64* ins_prev = instr_prev.lookup(&cpu);
|
|
|
|
u64 vCyc = 0;
|
|
if (cyc_prev) {
|
|
vCyc = cycle_cnt - *cyc_prev;
|
|
}
|
|
|
|
u64 vIns = 0;
|
|
if (ins_prev) {
|
|
vIns = instr_cnt - *ins_prev;
|
|
}
|
|
|
|
cycle_prev.update(&cpu, &cycle_cnt);
|
|
instr_prev.update(&cpu, &instr_cnt);
|
|
|
|
cycle.increment(cpu, vCyc);
|
|
instr.increment(cpu, vIns);
|
|
|
|
return 0;
|
|
}
|