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