4 * Copyright (C) 2015 Wang Nan <wangnan0@huawei.com>
5 * Copyright (C) 2015 Huawei Inc.
8 #include <bpf/libbpf.h>
12 #include "bpf-loader.h"
13 #include "probe-event.h"
14 #include "probe-finder.h" // for MAX_PROBES
15 #include "llvm-utils.h"
17 #define DEFINE_PRINT_FN(name, level) \
18 static int libbpf_##name(const char *fmt, ...) \
23 va_start(args, fmt); \
24 ret = veprintf(level, verbose, pr_fmt(fmt), args);\
29 DEFINE_PRINT_FN(warning
, 1)
30 DEFINE_PRINT_FN(info
, 1)
31 DEFINE_PRINT_FN(debug
, 1)
33 struct bpf_prog_priv
{
34 struct perf_probe_event pev
;
37 static bool libbpf_initialized
;
40 bpf__prepare_load_buffer(void *obj_buf
, size_t obj_buf_sz
, const char *name
)
42 struct bpf_object
*obj
;
44 if (!libbpf_initialized
) {
45 libbpf_set_print(libbpf_warning
,
48 libbpf_initialized
= true;
51 obj
= bpf_object__open_buffer(obj_buf
, obj_buf_sz
, name
);
53 pr_debug("bpf: failed to load buffer\n");
54 return ERR_PTR(-EINVAL
);
60 struct bpf_object
*bpf__prepare_load(const char *filename
, bool source
)
62 struct bpf_object
*obj
;
64 if (!libbpf_initialized
) {
65 libbpf_set_print(libbpf_warning
,
68 libbpf_initialized
= true;
76 err
= llvm__compile_bpf(filename
, &obj_buf
, &obj_buf_sz
);
78 return ERR_PTR(-BPF_LOADER_ERRNO__COMPILE
);
79 obj
= bpf_object__open_buffer(obj_buf
, obj_buf_sz
, filename
);
82 obj
= bpf_object__open(filename
);
85 pr_debug("bpf: failed to load %s\n", filename
);
94 struct bpf_object
*obj
, *tmp
;
96 bpf_object__for_each_safe(obj
, tmp
) {
98 bpf_object__close(obj
);
103 bpf_prog_priv__clear(struct bpf_program
*prog __maybe_unused
,
106 struct bpf_prog_priv
*priv
= _priv
;
108 cleanup_perf_probe_events(&priv
->pev
, 1);
113 config__exec(const char *value
, struct perf_probe_event
*pev
)
116 pev
->target
= strdup(value
);
123 config__module(const char *value
, struct perf_probe_event
*pev
)
125 pev
->uprobes
= false;
126 pev
->target
= strdup(value
);
136 int (*func
)(const char *, struct perf_probe_event
*);
137 } bpf_config_terms
[] = {
140 .usage
= "exec=<full path of file>",
141 .desc
= "Set uprobe target",
142 .func
= config__exec
,
146 .usage
= "module=<module name> ",
147 .desc
= "Set kprobe module",
148 .func
= config__module
,
153 do_config(const char *key
, const char *value
,
154 struct perf_probe_event
*pev
)
158 pr_debug("config bpf program: %s=%s\n", key
, value
);
159 for (i
= 0; i
< ARRAY_SIZE(bpf_config_terms
); i
++)
160 if (strcmp(key
, bpf_config_terms
[i
].key
) == 0)
161 return bpf_config_terms
[i
].func(value
, pev
);
163 pr_debug("BPF: ERROR: invalid config option in object: %s=%s\n",
166 pr_debug("\nHint: Currently valid options are:\n");
167 for (i
= 0; i
< ARRAY_SIZE(bpf_config_terms
); i
++)
168 pr_debug("\t%s:\t%s\n", bpf_config_terms
[i
].usage
,
169 bpf_config_terms
[i
].desc
);
172 return -BPF_LOADER_ERRNO__CONFIG_TERM
;
176 parse_config_kvpair(const char *config_str
, struct perf_probe_event
*pev
)
178 char *text
= strdup(config_str
);
180 const char *main_str
= NULL
;
184 pr_debug("No enough memory: dup config_str failed\n");
185 return ERR_PTR(-ENOMEM
);
189 while ((sep
= strchr(line
, ';'))) {
193 equ
= strchr(line
, '=');
195 pr_warning("WARNING: invalid config in BPF object: %s\n",
197 pr_warning("\tShould be 'key=value'.\n");
202 err
= do_config(line
, equ
+ 1, pev
);
210 main_str
= config_str
+ (line
- text
);
213 return err
? ERR_PTR(err
) : main_str
;
217 parse_config(const char *config_str
, struct perf_probe_event
*pev
)
220 const char *main_str
= parse_config_kvpair(config_str
, pev
);
222 if (IS_ERR(main_str
))
223 return PTR_ERR(main_str
);
225 err
= parse_perf_probe_command(main_str
, pev
);
227 pr_debug("bpf: '%s' is not a valid config string\n",
229 /* parse failed, don't need clear pev. */
230 return -BPF_LOADER_ERRNO__CONFIG
;
236 config_bpf_program(struct bpf_program
*prog
)
238 struct perf_probe_event
*pev
= NULL
;
239 struct bpf_prog_priv
*priv
= NULL
;
240 const char *config_str
;
243 config_str
= bpf_program__title(prog
, false);
244 if (IS_ERR(config_str
)) {
245 pr_debug("bpf: unable to get title for program\n");
246 return PTR_ERR(config_str
);
249 priv
= calloc(sizeof(*priv
), 1);
251 pr_debug("bpf: failed to alloc priv\n");
256 pr_debug("bpf: config program '%s'\n", config_str
);
257 err
= parse_config(config_str
, pev
);
261 if (pev
->group
&& strcmp(pev
->group
, PERF_BPF_PROBE_GROUP
)) {
262 pr_debug("bpf: '%s': group for event is set and not '%s'.\n",
263 config_str
, PERF_BPF_PROBE_GROUP
);
264 err
= -BPF_LOADER_ERRNO__GROUP
;
266 } else if (!pev
->group
)
267 pev
->group
= strdup(PERF_BPF_PROBE_GROUP
);
270 pr_debug("bpf: strdup failed\n");
276 pr_debug("bpf: '%s': event name is missing. Section name should be 'key=value'\n",
278 err
= -BPF_LOADER_ERRNO__EVENTNAME
;
281 pr_debug("bpf: config '%s' is ok\n", config_str
);
283 err
= bpf_program__set_private(prog
, priv
, bpf_prog_priv__clear
);
285 pr_debug("Failed to set priv for program '%s'\n", config_str
);
293 clear_perf_probe_event(pev
);
298 static int bpf__prepare_probe(void)
301 static bool initialized
= false;
304 * Make err static, so if init failed the first, bpf__prepare_probe()
305 * fails each time without calling init_probe_symbol_maps multiple
312 err
= init_probe_symbol_maps(false);
314 pr_debug("Failed to init_probe_symbol_maps\n");
315 probe_conf
.max_probes
= MAX_PROBES
;
319 int bpf__probe(struct bpf_object
*obj
)
322 struct bpf_program
*prog
;
323 struct bpf_prog_priv
*priv
;
324 struct perf_probe_event
*pev
;
326 err
= bpf__prepare_probe();
328 pr_debug("bpf__prepare_probe failed\n");
332 bpf_object__for_each_program(prog
, obj
) {
333 err
= config_bpf_program(prog
);
337 err
= bpf_program__get_private(prog
, (void **)&priv
);
342 err
= convert_perf_probe_events(pev
, 1);
344 pr_debug("bpf_probe: failed to convert perf probe events");
348 err
= apply_perf_probe_events(pev
, 1);
350 pr_debug("bpf_probe: failed to apply perf probe events");
355 return err
< 0 ? err
: 0;
358 #define EVENTS_WRITE_BUFSIZE 4096
359 int bpf__unprobe(struct bpf_object
*obj
)
362 struct bpf_program
*prog
;
363 struct bpf_prog_priv
*priv
;
365 bpf_object__for_each_program(prog
, obj
) {
368 err
= bpf_program__get_private(prog
, (void **)&priv
);
372 for (i
= 0; i
< priv
->pev
.ntevs
; i
++) {
373 struct probe_trace_event
*tev
= &priv
->pev
.tevs
[i
];
374 char name_buf
[EVENTS_WRITE_BUFSIZE
];
375 struct strfilter
*delfilter
;
377 snprintf(name_buf
, EVENTS_WRITE_BUFSIZE
,
378 "%s:%s", tev
->group
, tev
->event
);
379 name_buf
[EVENTS_WRITE_BUFSIZE
- 1] = '\0';
381 delfilter
= strfilter__new(name_buf
, NULL
);
383 pr_debug("Failed to create filter for unprobing\n");
388 err
= del_perf_probe_events(delfilter
);
389 strfilter__delete(delfilter
);
391 pr_debug("Failed to delete %s\n", name_buf
);
400 int bpf__load(struct bpf_object
*obj
)
404 err
= bpf_object__load(obj
);
406 pr_debug("bpf: load objects failed\n");
412 int bpf__foreach_tev(struct bpf_object
*obj
,
413 bpf_prog_iter_callback_t func
,
416 struct bpf_program
*prog
;
419 bpf_object__for_each_program(prog
, obj
) {
420 struct probe_trace_event
*tev
;
421 struct perf_probe_event
*pev
;
422 struct bpf_prog_priv
*priv
;
425 err
= bpf_program__get_private(prog
,
428 pr_debug("bpf: failed to get private field\n");
429 return -BPF_LOADER_ERRNO__INTERNAL
;
433 for (i
= 0; i
< pev
->ntevs
; i
++) {
436 fd
= bpf_program__fd(prog
);
438 pr_debug("bpf: failed to get file descriptor\n");
442 err
= (*func
)(tev
, fd
, arg
);
444 pr_debug("bpf: call back failed, stop iterate\n");
452 #define ERRNO_OFFSET(e) ((e) - __BPF_LOADER_ERRNO__START)
453 #define ERRCODE_OFFSET(c) ERRNO_OFFSET(BPF_LOADER_ERRNO__##c)
454 #define NR_ERRNO (__BPF_LOADER_ERRNO__END - __BPF_LOADER_ERRNO__START)
456 static const char *bpf_loader_strerror_table
[NR_ERRNO
] = {
457 [ERRCODE_OFFSET(CONFIG
)] = "Invalid config string",
458 [ERRCODE_OFFSET(GROUP
)] = "Invalid group name",
459 [ERRCODE_OFFSET(EVENTNAME
)] = "No event name found in config string",
460 [ERRCODE_OFFSET(INTERNAL
)] = "BPF loader internal error",
461 [ERRCODE_OFFSET(COMPILE
)] = "Error when compiling BPF scriptlet",
462 [ERRCODE_OFFSET(CONFIG_TERM
)] = "Invalid config term in config string",
466 bpf_loader_strerror(int err
, char *buf
, size_t size
)
468 char sbuf
[STRERR_BUFSIZE
];
474 err
= err
> 0 ? err
: -err
;
476 if (err
>= __LIBBPF_ERRNO__START
)
477 return libbpf_strerror(err
, buf
, size
);
479 if (err
>= __BPF_LOADER_ERRNO__START
&& err
< __BPF_LOADER_ERRNO__END
) {
480 msg
= bpf_loader_strerror_table
[ERRNO_OFFSET(err
)];
481 snprintf(buf
, size
, "%s", msg
);
482 buf
[size
- 1] = '\0';
486 if (err
>= __BPF_LOADER_ERRNO__END
)
487 snprintf(buf
, size
, "Unknown bpf loader error %d", err
);
489 snprintf(buf
, size
, "%s",
490 strerror_r(err
, sbuf
, sizeof(sbuf
)));
492 buf
[size
- 1] = '\0';
496 #define bpf__strerror_head(err, buf, size) \
497 char sbuf[STRERR_BUFSIZE], *emsg;\
502 bpf_loader_strerror(err, sbuf, sizeof(sbuf));\
506 scnprintf(buf, size, "%s", emsg);\
509 #define bpf__strerror_entry(val, fmt...)\
511 scnprintf(buf, size, fmt);\
515 #define bpf__strerror_end(buf, size)\
517 buf[size - 1] = '\0';
519 int bpf__strerror_prepare_load(const char *filename
, bool source
,
520 int err
, char *buf
, size_t size
)
525 n
= snprintf(buf
, size
, "Failed to load %s%s: ",
526 filename
, source
? " from source" : "");
528 buf
[size
- 1] = '\0';
534 ret
= bpf_loader_strerror(err
, buf
, size
);
535 buf
[size
- 1] = '\0';
539 int bpf__strerror_probe(struct bpf_object
*obj __maybe_unused
,
540 int err
, char *buf
, size_t size
)
542 bpf__strerror_head(err
, buf
, size
);
543 case BPF_LOADER_ERRNO__CONFIG_TERM
: {
544 scnprintf(buf
, size
, "%s (add -v to see detail)", emsg
);
547 bpf__strerror_entry(EEXIST
, "Probe point exist. Try use 'perf probe -d \"*\"'");
548 bpf__strerror_entry(EACCES
, "You need to be root");
549 bpf__strerror_entry(EPERM
, "You need to be root, and /proc/sys/kernel/kptr_restrict should be 0");
550 bpf__strerror_entry(ENOENT
, "You need to check probing points in BPF file");
551 bpf__strerror_end(buf
, size
);
555 int bpf__strerror_load(struct bpf_object
*obj
,
556 int err
, char *buf
, size_t size
)
558 bpf__strerror_head(err
, buf
, size
);
559 case LIBBPF_ERRNO__KVER
: {
560 unsigned int obj_kver
= bpf_object__get_kversion(obj
);
561 unsigned int real_kver
;
563 if (fetch_kernel_version(&real_kver
, NULL
, 0)) {
564 scnprintf(buf
, size
, "Unable to fetch kernel version");
568 if (obj_kver
!= real_kver
) {
570 "'version' ("KVER_FMT
") doesn't match running kernel ("KVER_FMT
")",
571 KVER_PARAM(obj_kver
),
572 KVER_PARAM(real_kver
));
576 scnprintf(buf
, size
, "Failed to load program for unknown reason");
579 bpf__strerror_end(buf
, size
);