From b6e43a269ac0cc03da9d1193d6cf09ee181e2837 Mon Sep 17 00:00:00 2001 From: Alexei Starovoitov Date: Thu, 18 Jun 2015 14:41:17 -0700 Subject: [PATCH] example that shows usages of maps, probe_read, get_current_pid helpers $ ./task_switch.py task_switch[ 2379-> 0]=4 task_switch[ 3914-> 0]=2 task_switch[ 3133-> 0]=5 task_switch[10903-> 0]=100 <-- 100 times python process switched into idle task_switch[ 116-> 0]=1 task_switch[ 0-> 14]=1 task_switch[10803-> 0]=1 task_switch[22292-> 0]=1 task_switch[ 0->22292]=1 task_switch[ 0->10803]=1 task_switch[ 30-> 0]=1 task_switch[ 0->10903]=100 <-- 100 times back into python Signed-off-by: Alexei Starovoitov --- examples/task_switch.c | 22 ++++++++++++++++++++++ examples/task_switch.py | 17 +++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 examples/task_switch.c create mode 100755 examples/task_switch.py diff --git a/examples/task_switch.c b/examples/task_switch.c new file mode 100644 index 0000000..e6e66ed --- /dev/null +++ b/examples/task_switch.c @@ -0,0 +1,22 @@ +#include +#include + +struct key_t { + u32 prev_pid; + u32 curr_pid; +}; +// map_type, key_type, leaf_type, table_name, num_entry +BPF_TABLE("hash", struct key_t, u64, stats, 1024); +int count_sched(struct pt_regs *ctx) { + struct key_t key = {}; + u64 zero = 0, *val; + + key.curr_pid = bpf_get_current_pid_tgid(); + bpf_probe_read(&key.prev_pid, 4, + (void *)ctx->di + offsetof(struct task_struct, pid)); + + val = stats.lookup_or_init(&key, &zero); + (*val)++; + return 0; +} + diff --git a/examples/task_switch.py b/examples/task_switch.py new file mode 100755 index 0000000..f25913f --- /dev/null +++ b/examples/task_switch.py @@ -0,0 +1,17 @@ +#!/usr/bin/python +# Copyright (c) PLUMgrid, Inc. +# Licensed under the Apache License, Version 2.0 (the "License") + +from bpf import BPF +from time import sleep + +b = BPF(src_file="task_switch.c") +fn = b.load_func("count_sched", BPF.KPROBE) +stats = b.get_table("stats") +BPF.attach_kprobe(fn, "finish_task_switch") + +# generate many schedule events +for i in range(0, 100): sleep(0.01) + +for k, v in stats.items(): + print("task_switch[%5d->%5d]=%u" % (k.prev_pid, k.curr_pid, v.value)) -- 2.7.4