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>
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-
2425static volatile sig_atomic_t exiting = 0 ;
2526
2627static 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
8891static 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
174182cleanup :
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