40 lines
984 B
Plaintext
40 lines
984 B
Plaintext
//go:build ignore
|
|
|
|
#include "common.h"
|
|
|
|
char __license[] SEC("license") = "Dual MIT/GPL";
|
|
|
|
struct {
|
|
__uint(type, BPF_MAP_TYPE_ARRAY);
|
|
__type(key, u32);
|
|
__type(value, u64);
|
|
__uint(max_entries, 1);
|
|
} counting_map SEC(".maps");
|
|
|
|
// This struct is defined according to the following format file:
|
|
// /sys/kernel/tracing/events/kmem/mm_page_alloc/format
|
|
struct alloc_info {
|
|
/* The first 8 bytes is not allowed to read */
|
|
unsigned long pad;
|
|
|
|
unsigned long pfn;
|
|
unsigned int order;
|
|
unsigned int gfp_flags;
|
|
int migratetype;
|
|
};
|
|
|
|
// This tracepoint is defined in mm/page_alloc.c:__alloc_pages_nodemask()
|
|
// Userspace pathname: /sys/kernel/tracing/events/kmem/mm_page_alloc
|
|
SEC("tracepoint/kmem/mm_page_alloc")
|
|
int mm_page_alloc(struct alloc_info *info) {
|
|
u32 key = 0;
|
|
u64 initval = 1, *valp;
|
|
|
|
valp = bpf_map_lookup_elem(&counting_map, &key);
|
|
if (!valp) {
|
|
bpf_map_update_elem(&counting_map, &key, &initval, BPF_ANY);
|
|
return 0;
|
|
}
|
|
__sync_fetch_and_add(valp, 1);
|
|
return 0;
|
|
} |