124 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2#include <time.h>3#include <linux/bpf.h>4#include <bpf/bpf_helpers.h>5 6struct timer {7 struct bpf_timer t;8};9 10struct lock {11 struct bpf_spin_lock l;12};13 14struct {15 __uint(type, BPF_MAP_TYPE_ARRAY);16 __uint(max_entries, 1);17 __type(key, __u32);18 __type(value, struct timer);19} timers SEC(".maps");20 21struct {22 __uint(type, BPF_MAP_TYPE_ARRAY);23 __uint(max_entries, 1);24 __type(key, __u32);25 __type(value, struct lock);26} locks SEC(".maps");27 28static int timer_cb(void *map, int *key, struct timer *timer)29{30 return 0;31}32 33static void timer_work(void)34{35 struct timer *timer;36 const int key = 0;37 38 timer = bpf_map_lookup_elem(&timers, &key);39 if (timer) {40 bpf_timer_init(&timer->t, &timers, CLOCK_MONOTONIC);41 bpf_timer_set_callback(&timer->t, timer_cb);42 bpf_timer_start(&timer->t, 10E9, 0);43 bpf_timer_cancel(&timer->t);44 }45}46 47static void spin_lock_work(void)48{49 const int key = 0;50 struct lock *lock;51 52 lock = bpf_map_lookup_elem(&locks, &key);53 if (lock) {54 bpf_spin_lock(&lock->l);55 bpf_spin_unlock(&lock->l);56 }57}58 59SEC("?raw_tp/sys_enter")60int raw_tp_timer(void *ctx)61{62 timer_work();63 64 return 0;65}66 67SEC("?tp/syscalls/sys_enter_nanosleep")68int tp_timer(void *ctx)69{70 timer_work();71 72 return 0;73}74 75SEC("?kprobe")76int kprobe_timer(void *ctx)77{78 timer_work();79 80 return 0;81}82 83SEC("?perf_event")84int perf_event_timer(void *ctx)85{86 timer_work();87 88 return 0;89}90 91SEC("?raw_tp/sys_enter")92int raw_tp_spin_lock(void *ctx)93{94 spin_lock_work();95 96 return 0;97}98 99SEC("?tp/syscalls/sys_enter_nanosleep")100int tp_spin_lock(void *ctx)101{102 spin_lock_work();103 104 return 0;105}106 107SEC("?kprobe")108int kprobe_spin_lock(void *ctx)109{110 spin_lock_work();111 112 return 0;113}114 115SEC("?perf_event")116int perf_event_spin_lock(void *ctx)117{118 spin_lock_work();119 120 return 0;121}122 123const char LICENSE[] SEC("license") = "GPL";124