#!/usr/bin/env -S bpftrace --unsafe -q
/*
* Asserts that the `llc` layer config works properly by failing if the pid
* passed to the script runs on any other LLC besides LLC id 0. The layered
* config should restrict the pid passed to the script to run on a layer
* that only runs on LLC 0.
*/
BEGIN
{
@bpftrace_pid = pid;
@sig = 0;
if ($1 == 0) {
// exit 137
@sig = 9;
}
// Credit to Alastair Robertson for this mapping of CPU to LLC
$num_cpus = *(uint32*)kaddr("__num_online_cpus");
$per_cpu_offsets = (uint64*)kaddr("__per_cpu_offset");
$cpu_to_node_map = kaddr("x86_cpu_to_node_map");
$ci_cpu_cacheinfo = kaddr("ci_cpu_cacheinfo");
$cpuid = 0;
while ($cpuid < $num_cpus && $cpuid < 500) {
$numa_id = *($cpu_to_node_map + *($per_cpu_offsets + $cpuid));
@cpu_to_node[$cpuid] = $numa_id;
$cpu_cacheinfo = (struct cpu_cacheinfo*)($ci_cpu_cacheinfo + *($per_cpu_offsets + $cpuid));
$l3_cacheinfo = $cpu_cacheinfo->info_list[3];
$l3_cacheid = $l3_cacheinfo.id;
@cpu_to_l3[$cpuid] = $l3_cacheid;
$cpuid++;
}
}
profile:hz:1
{
@counts[cpu] = @counts[cpu] + 1;
if (@counts[cpu] == 15) {
// exit 0
@sig = 15;
}
}
rawtracepoint:sched_switch
{
$task = (struct task_struct *)arg1;
if (($task->parent->pid == $1 && @cpu_to_l3[cpu] != 0) ||
($task->real_parent->pid == $1 && @cpu_to_l3[cpu] != 0)) {
// exit 137
@sig = 9;
}
}
kprobe:__x64_sys_* / @bpftrace_pid == pid / {
if (@sig > 0) {
signal(@sig);
}
}
interval:s:1 {
print(("bpftrace monitoring pid", $1, "signal", @sig));
}