1
1
// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)
2
2
// Copyright (c) 2022 Jingxiang Zeng
3
+ // Copyright (c) 2022 Krisztian Fekete
3
4
//
4
5
// Based on oomkill(8) from BCC by Brendan Gregg.
5
6
// 13-Jan-2022 Jingxiang Zeng Created this.
7
+ // 17-Oct-2022 Krisztian Fekete Edited this.
6
8
#include <argp.h>
7
9
#include <errno.h>
8
10
#include <signal.h>
15
17
#include <bpf/bpf.h>
16
18
#include <bpf/libbpf.h>
17
19
#include "oomkill.skel.h"
20
+ #include "compat.h"
18
21
#include "oomkill.h"
19
22
#include "btf_helpers.h"
20
23
#include "trace_helpers.h"
21
24
22
- #define PERF_POLL_TIMEOUT_MS 100
23
-
24
25
static volatile sig_atomic_t exiting = 0 ;
25
26
26
27
static bool verbose = false;
@@ -57,7 +58,7 @@ static error_t parse_arg(int key, char *arg, struct argp_state *state)
57
58
return 0 ;
58
59
}
59
60
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 )
61
62
{
62
63
FILE * f ;
63
64
char buf [256 ];
@@ -83,6 +84,8 @@ static void handle_event(void *ctx, int cpu, void *data, __u32 data_sz)
83
84
else
84
85
printf ("%s Triggered by PID %d (\"%s\"), OOM kill of PID %d (\"%s\"), %lld pages\n" ,
85
86
ts , e -> fpid , e -> fcomm , e -> tpid , e -> tcomm , e -> pages );
87
+
88
+ return 0 ;
86
89
}
87
90
88
91
static void handle_lost_events (void * ctx , int cpu , __u64 lost_cnt )
@@ -110,7 +113,7 @@ int main(int argc, char **argv)
110
113
.parser = parse_arg ,
111
114
.doc = argp_program_doc ,
112
115
};
113
- struct perf_buffer * pb = NULL ;
116
+ struct bpf_buffer * buf = NULL ;
114
117
struct oomkill_bpf * obj ;
115
118
int err ;
116
119
@@ -133,6 +136,13 @@ int main(int argc, char **argv)
133
136
return 1 ;
134
137
}
135
138
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
+
136
146
err = oomkill_bpf__load (obj );
137
147
if (err ) {
138
148
fprintf (stderr , "failed to load BPF object: %d\n" , err );
@@ -145,11 +155,9 @@ int main(int argc, char **argv)
145
155
goto cleanup ;
146
156
}
147
157
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 );
153
161
goto cleanup ;
154
162
}
155
163
@@ -162,17 +170,17 @@ int main(int argc, char **argv)
162
170
printf ("Tracing OOM kills... Ctrl-C to stop.\n" );
163
171
164
172
while (!exiting ) {
165
- err = perf_buffer__poll ( pb , PERF_POLL_TIMEOUT_MS );
173
+ err = bpf_buffer__poll ( buf , POLL_TIMEOUT_MS );
166
174
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 );
168
176
goto cleanup ;
169
177
}
170
178
/* reset err to return 0 if exiting */
171
179
err = 0 ;
172
180
}
173
181
174
182
cleanup :
175
- perf_buffer__free ( pb );
183
+ bpf_buffer__free ( buf );
176
184
oomkill_bpf__destroy (obj );
177
185
cleanup_core_btf (& open_opts );
178
186
0 commit comments