root/tools/perf/util/bpf_skel/vmlinux/vmlinux.h
#ifndef __VMLINUX_H
#define __VMLINUX_H

#include <linux/stddef.h> // for define __always_inline
#include <linux/bpf.h>
#include <linux/types.h>
#include <linux/perf_event.h>
#include <stdbool.h>

// non-UAPI kernel data structures, used in the .bpf.c BPF tool component.

// Just the fields used in these tools preserving the access index so that
// libbpf can fixup offsets with the ones used in the kernel when loading the
// BPF bytecode, if they differ from what is used here.

typedef __u8 u8;
typedef __u32 u32;
typedef __s32 s32;
typedef __u64 u64;
typedef __s64 s64;

typedef int pid_t;

typedef __s64 time64_t;

struct timespec64 {
        time64_t        tv_sec;
        long int        tv_nsec;
};

enum cgroup_subsys_id {
        perf_event_cgrp_id  = 8,
};

enum {
        HI_SOFTIRQ = 0,
        TIMER_SOFTIRQ,
        NET_TX_SOFTIRQ,
        NET_RX_SOFTIRQ,
        BLOCK_SOFTIRQ,
        IRQ_POLL_SOFTIRQ,
        TASKLET_SOFTIRQ,
        SCHED_SOFTIRQ,
        HRTIMER_SOFTIRQ,
        RCU_SOFTIRQ,    /* Preferable RCU should always be the last softirq */

        NR_SOFTIRQS
};

typedef struct {
        s64     counter;
} __attribute__((preserve_access_index)) atomic64_t;

typedef atomic64_t atomic_long_t;

struct raw_spinlock {
        int rawlock;
} __attribute__((preserve_access_index));

typedef struct raw_spinlock raw_spinlock_t;

typedef struct {
        struct raw_spinlock rlock;
} __attribute__((preserve_access_index)) spinlock_t;

struct sighand_struct {
        spinlock_t siglock;
} __attribute__((preserve_access_index));

struct rw_semaphore {
        atomic_long_t owner;
} __attribute__((preserve_access_index));

struct mutex {
        atomic_long_t owner;
} __attribute__((preserve_access_index));

struct kernfs_node {
        u64 id;
} __attribute__((preserve_access_index));

struct cgroup {
        struct kernfs_node *kn;
        int                level;
}  __attribute__((preserve_access_index));

struct cgroup_subsys_state {
        struct cgroup *cgroup;
} __attribute__((preserve_access_index));

struct css_set {
        struct cgroup_subsys_state *subsys[13];
        struct cgroup *dfl_cgrp;
} __attribute__((preserve_access_index));

struct mm_struct {
        struct rw_semaphore mmap_lock;
} __attribute__((preserve_access_index));

struct task_struct {
        unsigned int          flags;
        struct mm_struct      *mm;
        pid_t                 pid;
        pid_t                 tgid;
        char                  comm[16];
        struct sighand_struct *sighand;
        struct css_set        *cgroups;
} __attribute__((preserve_access_index));

struct trace_entry {
        short unsigned int type;
        unsigned char      flags;
        unsigned char      preempt_count;
        int                pid;
} __attribute__((preserve_access_index));

struct trace_event_raw_irq_handler_entry {
        struct trace_entry ent;
        int                irq;
        u32                __data_loc_name;
        char               __data[];
} __attribute__((preserve_access_index));

struct trace_event_raw_irq_handler_exit {
        struct trace_entry ent;
        int                irq;
        int                ret;
        char               __data[];
} __attribute__((preserve_access_index));

struct trace_event_raw_softirq {
        struct trace_entry ent;
        unsigned int       vec;
        char               __data[];
} __attribute__((preserve_access_index));

struct trace_event_raw_workqueue_execute_start {
        struct trace_entry ent;
        void               *work;
        void               *function;
        char               __data[];
} __attribute__((preserve_access_index));

struct trace_event_raw_workqueue_execute_end {
        struct trace_entry ent;
        void               *work;
        void               *function;
        char              __data[];
} __attribute__((preserve_access_index));

struct trace_event_raw_workqueue_activate_work {
        struct trace_entry ent;
        void               *work;
        char               __data[];
} __attribute__((preserve_access_index));

struct perf_sample_data {
        u64                      addr;
        u64                      period;
        union perf_sample_weight weight;
        u64                      txn;
        union perf_mem_data_src  data_src;
        u64                      ip;
        struct {
                u32              pid;
                u32              tid;
        } tid_entry;
        u64                      time;
        u64                      id;
        struct {
                u32              cpu;
        } cpu_entry;
        u64                      phys_addr;
        u64                      cgroup;
        u64                      data_page_size;
        u64                      code_page_size;
} __attribute__((__aligned__(64))) __attribute__((preserve_access_index));

struct perf_event {
        struct perf_event       *parent;
        u64                     id;
} __attribute__((preserve_access_index));

struct bpf_perf_event_data_kern {
        struct perf_sample_data *data;
        struct perf_event       *event;
} __attribute__((preserve_access_index));

/*
 * If 'struct rq' isn't defined for lock_contention.bpf.c, for the sake of
 * rq___old and rq___new, then the type for the 'runqueue' variable ends up
 * being a forward declaration (BTF_KIND_FWD) while the kernel has it defined
 * (BTF_KIND_STRUCT). The definition appears in vmlinux.h rather than
 * lock_contention.bpf.c for consistency with a generated vmlinux.h.
 */
struct rq {};

struct kmem_cache {
        const char *name;
} __attribute__((preserve_access_index));

struct bpf_iter__kmem_cache {
        struct kmem_cache *s;
} __attribute__((preserve_access_index));

struct zone {
        spinlock_t lock;
} __attribute__((preserve_access_index));

struct pglist_data {
        struct zone node_zones[6]; /* value for all possible config */
        int nr_zones;
} __attribute__((preserve_access_index));

#endif // __VMLINUX_H