1*73b97bc7SHou Tao // SPDX-License-Identifier: GPL-2.0
2*73b97bc7SHou Tao /* Copyright (C) 2022. Huawei Technologies Co., Ltd */
3*73b97bc7SHou Tao #include "vmlinux.h"
4*73b97bc7SHou Tao #include <bpf/bpf_helpers.h>
5*73b97bc7SHou Tao #include <bpf/bpf_tracing.h>
6*73b97bc7SHou Tao 
7*73b97bc7SHou Tao extern bool CONFIG_PREEMPT __kconfig __weak;
8*73b97bc7SHou Tao extern const int bpf_task_storage_busy __ksym;
9*73b97bc7SHou Tao 
10*73b97bc7SHou Tao char _license[] SEC("license") = "GPL";
11*73b97bc7SHou Tao 
12*73b97bc7SHou Tao int pid = 0;
13*73b97bc7SHou Tao int busy = 0;
14*73b97bc7SHou Tao 
15*73b97bc7SHou Tao struct {
16*73b97bc7SHou Tao 	__uint(type, BPF_MAP_TYPE_TASK_STORAGE);
17*73b97bc7SHou Tao 	__uint(map_flags, BPF_F_NO_PREALLOC);
18*73b97bc7SHou Tao 	__type(key, int);
19*73b97bc7SHou Tao 	__type(value, long);
20*73b97bc7SHou Tao } task SEC(".maps");
21*73b97bc7SHou Tao 
22*73b97bc7SHou Tao SEC("raw_tp/sys_enter")
BPF_PROG(read_bpf_task_storage_busy)23*73b97bc7SHou Tao int BPF_PROG(read_bpf_task_storage_busy)
24*73b97bc7SHou Tao {
25*73b97bc7SHou Tao 	int *value;
26*73b97bc7SHou Tao 
27*73b97bc7SHou Tao 	if (!CONFIG_PREEMPT)
28*73b97bc7SHou Tao 		return 0;
29*73b97bc7SHou Tao 
30*73b97bc7SHou Tao 	if (bpf_get_current_pid_tgid() >> 32 != pid)
31*73b97bc7SHou Tao 		return 0;
32*73b97bc7SHou Tao 
33*73b97bc7SHou Tao 	value = bpf_this_cpu_ptr(&bpf_task_storage_busy);
34*73b97bc7SHou Tao 	if (value)
35*73b97bc7SHou Tao 		busy = *value;
36*73b97bc7SHou Tao 
37*73b97bc7SHou Tao 	return 0;
38*73b97bc7SHou Tao }
39