mirror of
https://github.com/raspberrypi/linux.git
synced 2026-01-02 07:43:34 +00:00
So far it used tgid as a key to get the filter expressions in the pinned filters map for regular users but it won't work well if the has more than one filters at the same time. Let's add the event id to the key of the filter hash map so that it can identify the right filter expression in the BPF program. As the event can be inherited to child tasks, it should use the primary id which belongs to the parent (original) event. Since evsel opens the event for multiple CPUs and tasks, it needs to maintain a separate hash map for the event id. In the user space, it keeps a list for the multiple evsel and release the entries in the both hash map when it closes the event. Signed-off-by: Namhyung Kim <namhyung@kernel.org> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Ian Rogers <irogers@google.com> Cc: Ingo Molnar <mingo@kernel.org> Cc: Jiri Olsa <jolsa@kernel.org> Cc: KP Singh <kpsingh@kernel.org> Cc: Kan Liang <kan.liang@linux.intel.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Song Liu <song@kernel.org> Link: https://lore.kernel.org/r/20240820154504.128923-1-namhyung@kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
198 lines
4.4 KiB
C
198 lines
4.4 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 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 {};
|
|
|
|
#endif // __VMLINUX_H
|