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 <ast@plumgrid.com>
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 <uapi/linux/ptrace.h>
+#include <linux/sched.h>
+
+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;
+}
+