2
0
mirror of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git synced 2025-09-04 20:19:47 +08:00
linux/tools/perf/util/bpf_skel/vmlinux/vmlinux.h
Namhyung Kim e2c4dc54cd perf lock contention: Run BPF slab cache iterator
Recently the kernel got the kmem_cache iterator to traverse metadata of
slab objects.  This can be used to symbolize dynamic locks in a slab.

The new slab_caches hash map will have the pointer of the kmem_cache as
a key and save the name and a id.  The id will be saved in the flags
part of the lock.

Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Acked-by: Ian Rogers <irogers@google.com>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexei Starovoitov <alexei.starovoitov@gmail.com>
Cc: Andrii Nakryiko <andrii@kernel.org>
Cc: Chun-Tse Shao <ctshao@google.com>
Cc: Hyeonggon Yoo <42.hyeyoo@gmail.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: Kees Cook <kees@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Roman Gushchin <roman.gushchin@linux.dev>
Cc: Song Liu <song@kernel.org>
Cc: Stephane Eranian <eranian@google.com>
Cc: Vlastimil Babka <vbabka@suse.cz>
Link: https://lore.kernel.org/r/20241220060009.507297-3-namhyung@kernel.org
[ Added change from Namhyung addressing review from Alexei: ]
Link: https://lore.kernel.org/r/Z2dVdH3o5iF-KrWj@google.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2024-12-23 13:52:03 -03:00

207 lines
4.6 KiB
C

#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));
#endif // __VMLINUX_H