Skip to content

Commit 62a8d1d

Browse files
krisztianfeketechenhengqi
authored andcommitted
add bpf_ringbuf support to oomkill example
1 parent 05ea841 commit 62a8d1d

File tree

2 files changed

+33
-26
lines changed

2 files changed

+33
-26
lines changed

libbpf-tools/oomkill.bpf.c

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,28 @@
11
// SPDX-License-Identifier: GPL-2.0
22
// Copyright (c) 2022 Jingxiang Zeng
3+
// Copyright (c) 2022 Krisztian Fekete
34
#include <vmlinux.h>
45
#include <bpf/bpf_helpers.h>
56
#include <bpf/bpf_core_read.h>
67
#include <bpf/bpf_tracing.h>
7-
8+
#include "compat.bpf.h"
89
#include "oomkill.h"
910

10-
struct {
11-
__uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY);
12-
__uint(key_size, sizeof(u32));
13-
__uint(value_size, sizeof(u32));
14-
} events SEC(".maps");
15-
1611
SEC("kprobe/oom_kill_process")
1712
int BPF_KPROBE(oom_kill_process, struct oom_control *oc, const char *message)
1813
{
19-
struct data_t data;
14+
struct data_t *data;
15+
16+
data = reserve_buf(sizeof(*data));
17+
if (!data)
18+
return 0;
2019

21-
data.fpid = bpf_get_current_pid_tgid() >> 32;
22-
data.tpid = BPF_CORE_READ(oc, chosen, tgid);
23-
data.pages = BPF_CORE_READ(oc, totalpages);
24-
bpf_get_current_comm(&data.fcomm, sizeof(data.fcomm));
25-
bpf_probe_read_kernel(&data.tcomm, sizeof(data.tcomm), BPF_CORE_READ(oc, chosen, comm));
26-
bpf_perf_event_output(ctx, &events, BPF_F_CURRENT_CPU, &data, sizeof(data));
20+
data->fpid = bpf_get_current_pid_tgid() >> 32;
21+
data->tpid = BPF_CORE_READ(oc, chosen, tgid);
22+
data->pages = BPF_CORE_READ(oc, totalpages);
23+
bpf_get_current_comm(&data->fcomm, sizeof(data->fcomm));
24+
bpf_probe_read_kernel(&data->tcomm, sizeof(data->tcomm), BPF_CORE_READ(oc, chosen, comm));
25+
submit_buf(ctx, data, sizeof(*data));
2726
return 0;
2827
}
2928

libbpf-tools/oomkill.c

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)
22
// Copyright (c) 2022 Jingxiang Zeng
3+
// Copyright (c) 2022 Krisztian Fekete
34
//
45
// Based on oomkill(8) from BCC by Brendan Gregg.
56
// 13-Jan-2022 Jingxiang Zeng Created this.
7+
// 17-Oct-2022 Krisztian Fekete Edited this.
68
#include <argp.h>
79
#include <errno.h>
810
#include <signal.h>
@@ -15,12 +17,11 @@
1517
#include <bpf/bpf.h>
1618
#include <bpf/libbpf.h>
1719
#include "oomkill.skel.h"
20+
#include "compat.h"
1821
#include "oomkill.h"
1922
#include "btf_helpers.h"
2023
#include "trace_helpers.h"
2124

22-
#define PERF_POLL_TIMEOUT_MS 100
23-
2425
static volatile sig_atomic_t exiting = 0;
2526

2627
static bool verbose = false;
@@ -57,7 +58,7 @@ static error_t parse_arg(int key, char *arg, struct argp_state *state)
5758
return 0;
5859
}
5960

60-
static void handle_event(void *ctx, int cpu, void *data, __u32 data_sz)
61+
static int handle_event(void *ctx, void *data, size_t len)
6162
{
6263
FILE *f;
6364
char buf[256];
@@ -83,6 +84,8 @@ static void handle_event(void *ctx, int cpu, void *data, __u32 data_sz)
8384
else
8485
printf("%s Triggered by PID %d (\"%s\"), OOM kill of PID %d (\"%s\"), %lld pages\n",
8586
ts, e->fpid, e->fcomm, e->tpid, e->tcomm, e->pages);
87+
88+
return 0;
8689
}
8790

8891
static void handle_lost_events(void *ctx, int cpu, __u64 lost_cnt)
@@ -110,7 +113,7 @@ int main(int argc, char **argv)
110113
.parser = parse_arg,
111114
.doc = argp_program_doc,
112115
};
113-
struct perf_buffer *pb = NULL;
116+
struct bpf_buffer *buf = NULL;
114117
struct oomkill_bpf *obj;
115118
int err;
116119

@@ -133,6 +136,13 @@ int main(int argc, char **argv)
133136
return 1;
134137
}
135138

139+
buf = bpf_buffer__new(obj->maps.events, obj->maps.heap);
140+
if (!buf) {
141+
err = -errno;
142+
warn("failed to create ring/perf buffer: %d\n", err);
143+
goto cleanup;
144+
}
145+
136146
err = oomkill_bpf__load(obj);
137147
if (err) {
138148
fprintf(stderr, "failed to load BPF object: %d\n", err);
@@ -145,11 +155,9 @@ int main(int argc, char **argv)
145155
goto cleanup;
146156
}
147157

148-
pb = perf_buffer__new(bpf_map__fd(obj->maps.events), 64,
149-
handle_event, handle_lost_events, NULL, NULL);
150-
if (!pb) {
151-
err = -errno;
152-
fprintf(stderr, "failed to open perf buffer: %d\n", err);
158+
err = bpf_buffer__open(buf, handle_event, handle_lost_events, NULL);
159+
if (err) {
160+
fprintf(stderr, "failed to open ring/perf buffer: %d\n", err);
153161
goto cleanup;
154162
}
155163

@@ -162,17 +170,17 @@ int main(int argc, char **argv)
162170
printf("Tracing OOM kills... Ctrl-C to stop.\n");
163171

164172
while (!exiting) {
165-
err = perf_buffer__poll(pb, PERF_POLL_TIMEOUT_MS);
173+
err = bpf_buffer__poll(buf, POLL_TIMEOUT_MS);
166174
if (err < 0 && err != -EINTR) {
167-
fprintf(stderr, "error polling perf buffer: %d\n", err);
175+
fprintf(stderr, "error polling ring/perf buffer: %d\n", err);
168176
goto cleanup;
169177
}
170178
/* reset err to return 0 if exiting */
171179
err = 0;
172180
}
173181

174182
cleanup:
175-
perf_buffer__free(pb);
183+
bpf_buffer__free(buf);
176184
oomkill_bpf__destroy(obj);
177185
cleanup_core_btf(&open_opts);
178186

0 commit comments

Comments
 (0)