1 #ifndef __VMLINUX_H
2 #define __VMLINUX_H
3 
4 #include <linux/stddef.h> // for define __always_inline
5 #include <linux/bpf.h>
6 #include <linux/types.h>
7 #include <linux/perf_event.h>
8 #include <stdbool.h>
9 
10 // non-UAPI kernel data structures, used in the .bpf.c BPF tool component.
11 
12 // Just the fields used in these tools preserving the access index so that
13 // libbpf can fixup offsets with the ones used in the kernel when loading the
14 // BPF bytecode, if they differ from what is used here.
15 
16 typedef __u8 u8;
17 typedef __u32 u32;
18 typedef __u64 u64;
19 typedef __s64 s64;
20 
21 typedef int pid_t;
22 
23 enum cgroup_subsys_id {
24 	perf_event_cgrp_id  = 8,
25 };
26 
27 enum {
28 	HI_SOFTIRQ = 0,
29 	TIMER_SOFTIRQ,
30 	NET_TX_SOFTIRQ,
31 	NET_RX_SOFTIRQ,
32 	BLOCK_SOFTIRQ,
33 	IRQ_POLL_SOFTIRQ,
34 	TASKLET_SOFTIRQ,
35 	SCHED_SOFTIRQ,
36 	HRTIMER_SOFTIRQ,
37 	RCU_SOFTIRQ,    /* Preferable RCU should always be the last softirq */
38 
39 	NR_SOFTIRQS
40 };
41 
42 typedef struct {
43 	s64	counter;
44 } __attribute__((preserve_access_index)) atomic64_t;
45 
46 typedef atomic64_t atomic_long_t;
47 
48 struct raw_spinlock {
49 	int rawlock;
50 } __attribute__((preserve_access_index));
51 
52 typedef struct raw_spinlock raw_spinlock_t;
53 
54 typedef struct {
55 	struct raw_spinlock rlock;
56 } __attribute__((preserve_access_index)) spinlock_t;
57 
58 struct sighand_struct {
59 	spinlock_t siglock;
60 } __attribute__((preserve_access_index));
61 
62 struct rw_semaphore {
63 	atomic_long_t owner;
64 } __attribute__((preserve_access_index));
65 
66 struct mutex {
67 	atomic_long_t owner;
68 } __attribute__((preserve_access_index));
69 
70 struct kernfs_node {
71 	u64 id;
72 } __attribute__((preserve_access_index));
73 
74 struct cgroup {
75 	struct kernfs_node *kn;
76 	int                level;
77 }  __attribute__((preserve_access_index));
78 
79 struct cgroup_subsys_state {
80 	struct cgroup *cgroup;
81 } __attribute__((preserve_access_index));
82 
83 struct css_set {
84 	struct cgroup_subsys_state *subsys[13];
85 	struct cgroup *dfl_cgrp;
86 } __attribute__((preserve_access_index));
87 
88 struct mm_struct {
89 	struct rw_semaphore mmap_lock;
90 } __attribute__((preserve_access_index));
91 
92 struct task_struct {
93 	unsigned int	      flags;
94 	struct mm_struct      *mm;
95 	pid_t		      pid;
96 	pid_t		      tgid;
97 	char		      comm[16];
98 	struct sighand_struct *sighand;
99 	struct css_set	      *cgroups;
100 } __attribute__((preserve_access_index));
101 
102 struct trace_entry {
103 	short unsigned int type;
104 	unsigned char	   flags;
105 	unsigned char	   preempt_count;
106 	int		   pid;
107 } __attribute__((preserve_access_index));
108 
109 struct trace_event_raw_irq_handler_entry {
110 	struct trace_entry ent;
111 	int		   irq;
112 	u32		   __data_loc_name;
113 	char		   __data[];
114 } __attribute__((preserve_access_index));
115 
116 struct trace_event_raw_irq_handler_exit {
117 	struct trace_entry ent;
118 	int		   irq;
119 	int		   ret;
120 	char		   __data[];
121 } __attribute__((preserve_access_index));
122 
123 struct trace_event_raw_softirq {
124 	struct trace_entry ent;
125 	unsigned int	   vec;
126 	char		   __data[];
127 } __attribute__((preserve_access_index));
128 
129 struct trace_event_raw_workqueue_execute_start {
130 	struct trace_entry ent;
131 	void		   *work;
132 	void		   *function;
133 	char		   __data[];
134 } __attribute__((preserve_access_index));
135 
136 struct trace_event_raw_workqueue_execute_end {
137 	struct trace_entry ent;
138 	void		   *work;
139 	void		   *function;
140 	char		  __data[];
141 } __attribute__((preserve_access_index));
142 
143 struct trace_event_raw_workqueue_activate_work {
144 	struct trace_entry ent;
145 	void		   *work;
146 	char		   __data[];
147 } __attribute__((preserve_access_index));
148 
149 struct perf_sample_data {
150 	u64			 addr;
151 	u64			 period;
152 	union perf_sample_weight weight;
153 	u64			 txn;
154 	union perf_mem_data_src	 data_src;
155 	u64			 ip;
156 	struct {
157 		u32		 pid;
158 		u32		 tid;
159 	} tid_entry;
160 	u64			 time;
161 	u64			 id;
162 	struct {
163 		u32		 cpu;
164 	} cpu_entry;
165 	u64			 phys_addr;
166 	u64			 data_page_size;
167 	u64			 code_page_size;
168 } __attribute__((__aligned__(64))) __attribute__((preserve_access_index));
169 
170 struct bpf_perf_event_data_kern {
171 	struct perf_sample_data *data;
172 	struct perf_event	*event;
173 } __attribute__((preserve_access_index));
174 
175 /*
176  * If 'struct rq' isn't defined for lock_contention.bpf.c, for the sake of
177  * rq___old and rq___new, then the type for the 'runqueue' variable ends up
178  * being a forward declaration (BTF_KIND_FWD) while the kernel has it defined
179  * (BTF_KIND_STRUCT). The definition appears in vmlinux.h rather than
180  * lock_contention.bpf.c for consistency with a generated vmlinux.h.
181  */
182 struct rq {};
183 
184 #endif // __VMLINUX_H
185