1 // SPDX-License-Identifier: GPL-2.0
2 #include <vmlinux.h>
3 #include <bpf/bpf_tracing.h>
4 #include <bpf/bpf_helpers.h>
5
6 struct map_value {
7 struct task_struct __kptr_untrusted *ptr;
8 };
9
10 struct {
11 __uint(type, BPF_MAP_TYPE_LRU_HASH);
12 __uint(max_entries, 1);
13 __type(key, int);
14 __type(value, struct map_value);
15 } lru_map SEC(".maps");
16
17 int pid = 0;
18 int result = 1;
19
20 SEC("fentry/bpf_ktime_get_ns")
printk(void * ctx)21 int printk(void *ctx)
22 {
23 struct map_value v = {};
24
25 if (pid == bpf_get_current_task_btf()->pid)
26 bpf_map_update_elem(&lru_map, &(int){0}, &v, 0);
27 return 0;
28 }
29
30 SEC("fentry/do_nanosleep")
nanosleep(void * ctx)31 int nanosleep(void *ctx)
32 {
33 struct map_value val = {}, *v;
34 struct task_struct *current;
35
36 bpf_map_update_elem(&lru_map, &(int){0}, &val, 0);
37 v = bpf_map_lookup_elem(&lru_map, &(int){0});
38 if (!v)
39 return 0;
40 bpf_map_delete_elem(&lru_map, &(int){0});
41 current = bpf_get_current_task_btf();
42 v->ptr = current;
43 pid = current->pid;
44 bpf_ktime_get_ns();
45 result = !v->ptr;
46 return 0;
47 }
48
49 char _license[] SEC("license") = "GPL";
50