1// SPDX-License-Identifier: GPL-2.0
2#include <vmlinux.h>
3#include <bpf/bpf_tracing.h>
4#include <bpf/bpf_helpers.h>
5
6struct map_value {
7 struct task_struct __kptr_untrusted *ptr;
8};
9
10struct {
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
17int pid = 0;
18int result = 1;
19
20SEC("fentry/bpf_ktime_get_ns")
21int 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
30SEC("fentry/do_nanosleep")
31int 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
49char _license[] SEC("license") = "GPL";
50

source code of linux/tools/testing/selftests/bpf/progs/lru_bug.c