at v5.17-rc7 1790 lines 41 kB view raw
1// SPDX-License-Identifier: GPL-2.0 2/* 3 * bpf-loader.c 4 * 5 * Copyright (C) 2015 Wang Nan <wangnan0@huawei.com> 6 * Copyright (C) 2015 Huawei Inc. 7 */ 8 9#include <linux/bpf.h> 10#include <bpf/libbpf.h> 11#include <bpf/bpf.h> 12#include <linux/err.h> 13#include <linux/kernel.h> 14#include <linux/string.h> 15#include <linux/zalloc.h> 16#include <errno.h> 17#include <stdlib.h> 18#include "debug.h" 19#include "evlist.h" 20#include "bpf-loader.h" 21#include "bpf-prologue.h" 22#include "probe-event.h" 23#include "probe-finder.h" // for MAX_PROBES 24#include "parse-events.h" 25#include "strfilter.h" 26#include "util.h" 27#include "llvm-utils.h" 28#include "c++/clang-c.h" 29 30#include <internal/xyarray.h> 31 32/* temporarily disable libbpf deprecation warnings */ 33#pragma GCC diagnostic ignored "-Wdeprecated-declarations" 34 35static int libbpf_perf_print(enum libbpf_print_level level __attribute__((unused)), 36 const char *fmt, va_list args) 37{ 38 return veprintf(1, verbose, pr_fmt(fmt), args); 39} 40 41struct bpf_prog_priv { 42 bool is_tp; 43 char *sys_name; 44 char *evt_name; 45 struct perf_probe_event pev; 46 bool need_prologue; 47 struct bpf_insn *insns_buf; 48 int nr_types; 49 int *type_mapping; 50}; 51 52static bool libbpf_initialized; 53 54struct bpf_object * 55bpf__prepare_load_buffer(void *obj_buf, size_t obj_buf_sz, const char *name) 56{ 57 struct bpf_object *obj; 58 59 if (!libbpf_initialized) { 60 libbpf_set_print(libbpf_perf_print); 61 libbpf_initialized = true; 62 } 63 64 obj = bpf_object__open_buffer(obj_buf, obj_buf_sz, name); 65 if (IS_ERR_OR_NULL(obj)) { 66 pr_debug("bpf: failed to load buffer\n"); 67 return ERR_PTR(-EINVAL); 68 } 69 70 return obj; 71} 72 73struct bpf_object *bpf__prepare_load(const char *filename, bool source) 74{ 75 struct bpf_object *obj; 76 77 if (!libbpf_initialized) { 78 libbpf_set_print(libbpf_perf_print); 79 libbpf_initialized = true; 80 } 81 82 if (source) { 83 int err; 84 void *obj_buf; 85 size_t obj_buf_sz; 86 87 perf_clang__init(); 88 err = perf_clang__compile_bpf(filename, &obj_buf, &obj_buf_sz); 89 perf_clang__cleanup(); 90 if (err) { 91 pr_debug("bpf: builtin compilation failed: %d, try external compiler\n", err); 92 err = llvm__compile_bpf(filename, &obj_buf, &obj_buf_sz); 93 if (err) 94 return ERR_PTR(-BPF_LOADER_ERRNO__COMPILE); 95 } else 96 pr_debug("bpf: successful builtin compilation\n"); 97 obj = bpf_object__open_buffer(obj_buf, obj_buf_sz, filename); 98 99 if (!IS_ERR_OR_NULL(obj) && llvm_param.dump_obj) 100 llvm__dump_obj(filename, obj_buf, obj_buf_sz); 101 102 free(obj_buf); 103 } else 104 obj = bpf_object__open(filename); 105 106 if (IS_ERR_OR_NULL(obj)) { 107 pr_debug("bpf: failed to load %s\n", filename); 108 return obj; 109 } 110 111 return obj; 112} 113 114void bpf__clear(void) 115{ 116 struct bpf_object *obj, *tmp; 117 118 bpf_object__for_each_safe(obj, tmp) { 119 bpf__unprobe(obj); 120 bpf_object__close(obj); 121 } 122} 123 124static void 125clear_prog_priv(struct bpf_program *prog __maybe_unused, 126 void *_priv) 127{ 128 struct bpf_prog_priv *priv = _priv; 129 130 cleanup_perf_probe_events(&priv->pev, 1); 131 zfree(&priv->insns_buf); 132 zfree(&priv->type_mapping); 133 zfree(&priv->sys_name); 134 zfree(&priv->evt_name); 135 free(priv); 136} 137 138static int 139prog_config__exec(const char *value, struct perf_probe_event *pev) 140{ 141 pev->uprobes = true; 142 pev->target = strdup(value); 143 if (!pev->target) 144 return -ENOMEM; 145 return 0; 146} 147 148static int 149prog_config__module(const char *value, struct perf_probe_event *pev) 150{ 151 pev->uprobes = false; 152 pev->target = strdup(value); 153 if (!pev->target) 154 return -ENOMEM; 155 return 0; 156} 157 158static int 159prog_config__bool(const char *value, bool *pbool, bool invert) 160{ 161 int err; 162 bool bool_value; 163 164 if (!pbool) 165 return -EINVAL; 166 167 err = strtobool(value, &bool_value); 168 if (err) 169 return err; 170 171 *pbool = invert ? !bool_value : bool_value; 172 return 0; 173} 174 175static int 176prog_config__inlines(const char *value, 177 struct perf_probe_event *pev __maybe_unused) 178{ 179 return prog_config__bool(value, &probe_conf.no_inlines, true); 180} 181 182static int 183prog_config__force(const char *value, 184 struct perf_probe_event *pev __maybe_unused) 185{ 186 return prog_config__bool(value, &probe_conf.force_add, false); 187} 188 189static struct { 190 const char *key; 191 const char *usage; 192 const char *desc; 193 int (*func)(const char *, struct perf_probe_event *); 194} bpf_prog_config_terms[] = { 195 { 196 .key = "exec", 197 .usage = "exec=<full path of file>", 198 .desc = "Set uprobe target", 199 .func = prog_config__exec, 200 }, 201 { 202 .key = "module", 203 .usage = "module=<module name> ", 204 .desc = "Set kprobe module", 205 .func = prog_config__module, 206 }, 207 { 208 .key = "inlines", 209 .usage = "inlines=[yes|no] ", 210 .desc = "Probe at inline symbol", 211 .func = prog_config__inlines, 212 }, 213 { 214 .key = "force", 215 .usage = "force=[yes|no] ", 216 .desc = "Forcibly add events with existing name", 217 .func = prog_config__force, 218 }, 219}; 220 221static int 222do_prog_config(const char *key, const char *value, 223 struct perf_probe_event *pev) 224{ 225 unsigned int i; 226 227 pr_debug("config bpf program: %s=%s\n", key, value); 228 for (i = 0; i < ARRAY_SIZE(bpf_prog_config_terms); i++) 229 if (strcmp(key, bpf_prog_config_terms[i].key) == 0) 230 return bpf_prog_config_terms[i].func(value, pev); 231 232 pr_debug("BPF: ERROR: invalid program config option: %s=%s\n", 233 key, value); 234 235 pr_debug("\nHint: Valid options are:\n"); 236 for (i = 0; i < ARRAY_SIZE(bpf_prog_config_terms); i++) 237 pr_debug("\t%s:\t%s\n", bpf_prog_config_terms[i].usage, 238 bpf_prog_config_terms[i].desc); 239 pr_debug("\n"); 240 241 return -BPF_LOADER_ERRNO__PROGCONF_TERM; 242} 243 244static const char * 245parse_prog_config_kvpair(const char *config_str, struct perf_probe_event *pev) 246{ 247 char *text = strdup(config_str); 248 char *sep, *line; 249 const char *main_str = NULL; 250 int err = 0; 251 252 if (!text) { 253 pr_debug("Not enough memory: dup config_str failed\n"); 254 return ERR_PTR(-ENOMEM); 255 } 256 257 line = text; 258 while ((sep = strchr(line, ';'))) { 259 char *equ; 260 261 *sep = '\0'; 262 equ = strchr(line, '='); 263 if (!equ) { 264 pr_warning("WARNING: invalid config in BPF object: %s\n", 265 line); 266 pr_warning("\tShould be 'key=value'.\n"); 267 goto nextline; 268 } 269 *equ = '\0'; 270 271 err = do_prog_config(line, equ + 1, pev); 272 if (err) 273 break; 274nextline: 275 line = sep + 1; 276 } 277 278 if (!err) 279 main_str = config_str + (line - text); 280 free(text); 281 282 return err ? ERR_PTR(err) : main_str; 283} 284 285static int 286parse_prog_config(const char *config_str, const char **p_main_str, 287 bool *is_tp, struct perf_probe_event *pev) 288{ 289 int err; 290 const char *main_str = parse_prog_config_kvpair(config_str, pev); 291 292 if (IS_ERR(main_str)) 293 return PTR_ERR(main_str); 294 295 *p_main_str = main_str; 296 if (!strchr(main_str, '=')) { 297 /* Is a tracepoint event? */ 298 const char *s = strchr(main_str, ':'); 299 300 if (!s) { 301 pr_debug("bpf: '%s' is not a valid tracepoint\n", 302 config_str); 303 return -BPF_LOADER_ERRNO__CONFIG; 304 } 305 306 *is_tp = true; 307 return 0; 308 } 309 310 *is_tp = false; 311 err = parse_perf_probe_command(main_str, pev); 312 if (err < 0) { 313 pr_debug("bpf: '%s' is not a valid config string\n", 314 config_str); 315 /* parse failed, don't need clear pev. */ 316 return -BPF_LOADER_ERRNO__CONFIG; 317 } 318 return 0; 319} 320 321static int 322config_bpf_program(struct bpf_program *prog) 323{ 324 struct perf_probe_event *pev = NULL; 325 struct bpf_prog_priv *priv = NULL; 326 const char *config_str, *main_str; 327 bool is_tp = false; 328 int err; 329 330 /* Initialize per-program probing setting */ 331 probe_conf.no_inlines = false; 332 probe_conf.force_add = false; 333 334 priv = calloc(sizeof(*priv), 1); 335 if (!priv) { 336 pr_debug("bpf: failed to alloc priv\n"); 337 return -ENOMEM; 338 } 339 pev = &priv->pev; 340 341 config_str = bpf_program__section_name(prog); 342 pr_debug("bpf: config program '%s'\n", config_str); 343 err = parse_prog_config(config_str, &main_str, &is_tp, pev); 344 if (err) 345 goto errout; 346 347 if (is_tp) { 348 char *s = strchr(main_str, ':'); 349 350 priv->is_tp = true; 351 priv->sys_name = strndup(main_str, s - main_str); 352 priv->evt_name = strdup(s + 1); 353 goto set_priv; 354 } 355 356 if (pev->group && strcmp(pev->group, PERF_BPF_PROBE_GROUP)) { 357 pr_debug("bpf: '%s': group for event is set and not '%s'.\n", 358 config_str, PERF_BPF_PROBE_GROUP); 359 err = -BPF_LOADER_ERRNO__GROUP; 360 goto errout; 361 } else if (!pev->group) 362 pev->group = strdup(PERF_BPF_PROBE_GROUP); 363 364 if (!pev->group) { 365 pr_debug("bpf: strdup failed\n"); 366 err = -ENOMEM; 367 goto errout; 368 } 369 370 if (!pev->event) { 371 pr_debug("bpf: '%s': event name is missing. Section name should be 'key=value'\n", 372 config_str); 373 err = -BPF_LOADER_ERRNO__EVENTNAME; 374 goto errout; 375 } 376 pr_debug("bpf: config '%s' is ok\n", config_str); 377 378set_priv: 379 err = bpf_program__set_priv(prog, priv, clear_prog_priv); 380 if (err) { 381 pr_debug("Failed to set priv for program '%s'\n", config_str); 382 goto errout; 383 } 384 385 return 0; 386 387errout: 388 if (pev) 389 clear_perf_probe_event(pev); 390 free(priv); 391 return err; 392} 393 394static int bpf__prepare_probe(void) 395{ 396 static int err = 0; 397 static bool initialized = false; 398 399 /* 400 * Make err static, so if init failed the first, bpf__prepare_probe() 401 * fails each time without calling init_probe_symbol_maps multiple 402 * times. 403 */ 404 if (initialized) 405 return err; 406 407 initialized = true; 408 err = init_probe_symbol_maps(false); 409 if (err < 0) 410 pr_debug("Failed to init_probe_symbol_maps\n"); 411 probe_conf.max_probes = MAX_PROBES; 412 return err; 413} 414 415static int 416preproc_gen_prologue(struct bpf_program *prog, int n, 417 struct bpf_insn *orig_insns, int orig_insns_cnt, 418 struct bpf_prog_prep_result *res) 419{ 420 struct bpf_prog_priv *priv = bpf_program__priv(prog); 421 struct probe_trace_event *tev; 422 struct perf_probe_event *pev; 423 struct bpf_insn *buf; 424 size_t prologue_cnt = 0; 425 int i, err; 426 427 if (IS_ERR_OR_NULL(priv) || priv->is_tp) 428 goto errout; 429 430 pev = &priv->pev; 431 432 if (n < 0 || n >= priv->nr_types) 433 goto errout; 434 435 /* Find a tev belongs to that type */ 436 for (i = 0; i < pev->ntevs; i++) { 437 if (priv->type_mapping[i] == n) 438 break; 439 } 440 441 if (i >= pev->ntevs) { 442 pr_debug("Internal error: prologue type %d not found\n", n); 443 return -BPF_LOADER_ERRNO__PROLOGUE; 444 } 445 446 tev = &pev->tevs[i]; 447 448 buf = priv->insns_buf; 449 err = bpf__gen_prologue(tev->args, tev->nargs, 450 buf, &prologue_cnt, 451 BPF_MAXINSNS - orig_insns_cnt); 452 if (err) { 453 const char *title; 454 455 title = bpf_program__section_name(prog); 456 pr_debug("Failed to generate prologue for program %s\n", 457 title); 458 return err; 459 } 460 461 memcpy(&buf[prologue_cnt], orig_insns, 462 sizeof(struct bpf_insn) * orig_insns_cnt); 463 464 res->new_insn_ptr = buf; 465 res->new_insn_cnt = prologue_cnt + orig_insns_cnt; 466 res->pfd = NULL; 467 return 0; 468 469errout: 470 pr_debug("Internal error in preproc_gen_prologue\n"); 471 return -BPF_LOADER_ERRNO__PROLOGUE; 472} 473 474/* 475 * compare_tev_args is reflexive, transitive and antisymmetric. 476 * I can proof it but this margin is too narrow to contain. 477 */ 478static int compare_tev_args(const void *ptev1, const void *ptev2) 479{ 480 int i, ret; 481 const struct probe_trace_event *tev1 = 482 *(const struct probe_trace_event **)ptev1; 483 const struct probe_trace_event *tev2 = 484 *(const struct probe_trace_event **)ptev2; 485 486 ret = tev2->nargs - tev1->nargs; 487 if (ret) 488 return ret; 489 490 for (i = 0; i < tev1->nargs; i++) { 491 struct probe_trace_arg *arg1, *arg2; 492 struct probe_trace_arg_ref *ref1, *ref2; 493 494 arg1 = &tev1->args[i]; 495 arg2 = &tev2->args[i]; 496 497 ret = strcmp(arg1->value, arg2->value); 498 if (ret) 499 return ret; 500 501 ref1 = arg1->ref; 502 ref2 = arg2->ref; 503 504 while (ref1 && ref2) { 505 ret = ref2->offset - ref1->offset; 506 if (ret) 507 return ret; 508 509 ref1 = ref1->next; 510 ref2 = ref2->next; 511 } 512 513 if (ref1 || ref2) 514 return ref2 ? 1 : -1; 515 } 516 517 return 0; 518} 519 520/* 521 * Assign a type number to each tevs in a pev. 522 * mapping is an array with same slots as tevs in that pev. 523 * nr_types will be set to number of types. 524 */ 525static int map_prologue(struct perf_probe_event *pev, int *mapping, 526 int *nr_types) 527{ 528 int i, type = 0; 529 struct probe_trace_event **ptevs; 530 531 size_t array_sz = sizeof(*ptevs) * pev->ntevs; 532 533 ptevs = malloc(array_sz); 534 if (!ptevs) { 535 pr_debug("Not enough memory: alloc ptevs failed\n"); 536 return -ENOMEM; 537 } 538 539 pr_debug("In map_prologue, ntevs=%d\n", pev->ntevs); 540 for (i = 0; i < pev->ntevs; i++) 541 ptevs[i] = &pev->tevs[i]; 542 543 qsort(ptevs, pev->ntevs, sizeof(*ptevs), 544 compare_tev_args); 545 546 for (i = 0; i < pev->ntevs; i++) { 547 int n; 548 549 n = ptevs[i] - pev->tevs; 550 if (i == 0) { 551 mapping[n] = type; 552 pr_debug("mapping[%d]=%d\n", n, type); 553 continue; 554 } 555 556 if (compare_tev_args(ptevs + i, ptevs + i - 1) == 0) 557 mapping[n] = type; 558 else 559 mapping[n] = ++type; 560 561 pr_debug("mapping[%d]=%d\n", n, mapping[n]); 562 } 563 free(ptevs); 564 *nr_types = type + 1; 565 566 return 0; 567} 568 569static int hook_load_preprocessor(struct bpf_program *prog) 570{ 571 struct bpf_prog_priv *priv = bpf_program__priv(prog); 572 struct perf_probe_event *pev; 573 bool need_prologue = false; 574 int err, i; 575 576 if (IS_ERR_OR_NULL(priv)) { 577 pr_debug("Internal error when hook preprocessor\n"); 578 return -BPF_LOADER_ERRNO__INTERNAL; 579 } 580 581 if (priv->is_tp) { 582 priv->need_prologue = false; 583 return 0; 584 } 585 586 pev = &priv->pev; 587 for (i = 0; i < pev->ntevs; i++) { 588 struct probe_trace_event *tev = &pev->tevs[i]; 589 590 if (tev->nargs > 0) { 591 need_prologue = true; 592 break; 593 } 594 } 595 596 /* 597 * Since all tevs don't have argument, we don't need generate 598 * prologue. 599 */ 600 if (!need_prologue) { 601 priv->need_prologue = false; 602 return 0; 603 } 604 605 priv->need_prologue = true; 606 priv->insns_buf = malloc(sizeof(struct bpf_insn) * BPF_MAXINSNS); 607 if (!priv->insns_buf) { 608 pr_debug("Not enough memory: alloc insns_buf failed\n"); 609 return -ENOMEM; 610 } 611 612 priv->type_mapping = malloc(sizeof(int) * pev->ntevs); 613 if (!priv->type_mapping) { 614 pr_debug("Not enough memory: alloc type_mapping failed\n"); 615 return -ENOMEM; 616 } 617 memset(priv->type_mapping, -1, 618 sizeof(int) * pev->ntevs); 619 620 err = map_prologue(pev, priv->type_mapping, &priv->nr_types); 621 if (err) 622 return err; 623 624 err = bpf_program__set_prep(prog, priv->nr_types, 625 preproc_gen_prologue); 626 return err; 627} 628 629int bpf__probe(struct bpf_object *obj) 630{ 631 int err = 0; 632 struct bpf_program *prog; 633 struct bpf_prog_priv *priv; 634 struct perf_probe_event *pev; 635 636 err = bpf__prepare_probe(); 637 if (err) { 638 pr_debug("bpf__prepare_probe failed\n"); 639 return err; 640 } 641 642 bpf_object__for_each_program(prog, obj) { 643 err = config_bpf_program(prog); 644 if (err) 645 goto out; 646 647 priv = bpf_program__priv(prog); 648 if (IS_ERR_OR_NULL(priv)) { 649 if (!priv) 650 err = -BPF_LOADER_ERRNO__INTERNAL; 651 else 652 err = PTR_ERR(priv); 653 goto out; 654 } 655 656 if (priv->is_tp) { 657 bpf_program__set_tracepoint(prog); 658 continue; 659 } 660 661 bpf_program__set_kprobe(prog); 662 pev = &priv->pev; 663 664 err = convert_perf_probe_events(pev, 1); 665 if (err < 0) { 666 pr_debug("bpf_probe: failed to convert perf probe events\n"); 667 goto out; 668 } 669 670 err = apply_perf_probe_events(pev, 1); 671 if (err < 0) { 672 pr_debug("bpf_probe: failed to apply perf probe events\n"); 673 goto out; 674 } 675 676 /* 677 * After probing, let's consider prologue, which 678 * adds program fetcher to BPF programs. 679 * 680 * hook_load_preprocessor() hooks pre-processor 681 * to bpf_program, let it generate prologue 682 * dynamically during loading. 683 */ 684 err = hook_load_preprocessor(prog); 685 if (err) 686 goto out; 687 } 688out: 689 return err < 0 ? err : 0; 690} 691 692#define EVENTS_WRITE_BUFSIZE 4096 693int bpf__unprobe(struct bpf_object *obj) 694{ 695 int err, ret = 0; 696 struct bpf_program *prog; 697 698 bpf_object__for_each_program(prog, obj) { 699 struct bpf_prog_priv *priv = bpf_program__priv(prog); 700 int i; 701 702 if (IS_ERR_OR_NULL(priv) || priv->is_tp) 703 continue; 704 705 for (i = 0; i < priv->pev.ntevs; i++) { 706 struct probe_trace_event *tev = &priv->pev.tevs[i]; 707 char name_buf[EVENTS_WRITE_BUFSIZE]; 708 struct strfilter *delfilter; 709 710 snprintf(name_buf, EVENTS_WRITE_BUFSIZE, 711 "%s:%s", tev->group, tev->event); 712 name_buf[EVENTS_WRITE_BUFSIZE - 1] = '\0'; 713 714 delfilter = strfilter__new(name_buf, NULL); 715 if (!delfilter) { 716 pr_debug("Failed to create filter for unprobing\n"); 717 ret = -ENOMEM; 718 continue; 719 } 720 721 err = del_perf_probe_events(delfilter); 722 strfilter__delete(delfilter); 723 if (err) { 724 pr_debug("Failed to delete %s\n", name_buf); 725 ret = err; 726 continue; 727 } 728 } 729 } 730 return ret; 731} 732 733int bpf__load(struct bpf_object *obj) 734{ 735 int err; 736 737 err = bpf_object__load(obj); 738 if (err) { 739 char bf[128]; 740 libbpf_strerror(err, bf, sizeof(bf)); 741 pr_debug("bpf: load objects failed: err=%d: (%s)\n", err, bf); 742 return err; 743 } 744 return 0; 745} 746 747int bpf__foreach_event(struct bpf_object *obj, 748 bpf_prog_iter_callback_t func, 749 void *arg) 750{ 751 struct bpf_program *prog; 752 int err; 753 754 bpf_object__for_each_program(prog, obj) { 755 struct bpf_prog_priv *priv = bpf_program__priv(prog); 756 struct probe_trace_event *tev; 757 struct perf_probe_event *pev; 758 int i, fd; 759 760 if (IS_ERR_OR_NULL(priv)) { 761 pr_debug("bpf: failed to get private field\n"); 762 return -BPF_LOADER_ERRNO__INTERNAL; 763 } 764 765 if (priv->is_tp) { 766 fd = bpf_program__fd(prog); 767 err = (*func)(priv->sys_name, priv->evt_name, fd, obj, arg); 768 if (err) { 769 pr_debug("bpf: tracepoint call back failed, stop iterate\n"); 770 return err; 771 } 772 continue; 773 } 774 775 pev = &priv->pev; 776 for (i = 0; i < pev->ntevs; i++) { 777 tev = &pev->tevs[i]; 778 779 if (priv->need_prologue) { 780 int type = priv->type_mapping[i]; 781 782 fd = bpf_program__nth_fd(prog, type); 783 } else { 784 fd = bpf_program__fd(prog); 785 } 786 787 if (fd < 0) { 788 pr_debug("bpf: failed to get file descriptor\n"); 789 return fd; 790 } 791 792 err = (*func)(tev->group, tev->event, fd, obj, arg); 793 if (err) { 794 pr_debug("bpf: call back failed, stop iterate\n"); 795 return err; 796 } 797 } 798 } 799 return 0; 800} 801 802enum bpf_map_op_type { 803 BPF_MAP_OP_SET_VALUE, 804 BPF_MAP_OP_SET_EVSEL, 805}; 806 807enum bpf_map_key_type { 808 BPF_MAP_KEY_ALL, 809 BPF_MAP_KEY_RANGES, 810}; 811 812struct bpf_map_op { 813 struct list_head list; 814 enum bpf_map_op_type op_type; 815 enum bpf_map_key_type key_type; 816 union { 817 struct parse_events_array array; 818 } k; 819 union { 820 u64 value; 821 struct evsel *evsel; 822 } v; 823}; 824 825struct bpf_map_priv { 826 struct list_head ops_list; 827}; 828 829static void 830bpf_map_op__delete(struct bpf_map_op *op) 831{ 832 if (!list_empty(&op->list)) 833 list_del_init(&op->list); 834 if (op->key_type == BPF_MAP_KEY_RANGES) 835 parse_events__clear_array(&op->k.array); 836 free(op); 837} 838 839static void 840bpf_map_priv__purge(struct bpf_map_priv *priv) 841{ 842 struct bpf_map_op *pos, *n; 843 844 list_for_each_entry_safe(pos, n, &priv->ops_list, list) { 845 list_del_init(&pos->list); 846 bpf_map_op__delete(pos); 847 } 848} 849 850static void 851bpf_map_priv__clear(struct bpf_map *map __maybe_unused, 852 void *_priv) 853{ 854 struct bpf_map_priv *priv = _priv; 855 856 bpf_map_priv__purge(priv); 857 free(priv); 858} 859 860static int 861bpf_map_op_setkey(struct bpf_map_op *op, struct parse_events_term *term) 862{ 863 op->key_type = BPF_MAP_KEY_ALL; 864 if (!term) 865 return 0; 866 867 if (term->array.nr_ranges) { 868 size_t memsz = term->array.nr_ranges * 869 sizeof(op->k.array.ranges[0]); 870 871 op->k.array.ranges = memdup(term->array.ranges, memsz); 872 if (!op->k.array.ranges) { 873 pr_debug("Not enough memory to alloc indices for map\n"); 874 return -ENOMEM; 875 } 876 op->key_type = BPF_MAP_KEY_RANGES; 877 op->k.array.nr_ranges = term->array.nr_ranges; 878 } 879 return 0; 880} 881 882static struct bpf_map_op * 883bpf_map_op__new(struct parse_events_term *term) 884{ 885 struct bpf_map_op *op; 886 int err; 887 888 op = zalloc(sizeof(*op)); 889 if (!op) { 890 pr_debug("Failed to alloc bpf_map_op\n"); 891 return ERR_PTR(-ENOMEM); 892 } 893 INIT_LIST_HEAD(&op->list); 894 895 err = bpf_map_op_setkey(op, term); 896 if (err) { 897 free(op); 898 return ERR_PTR(err); 899 } 900 return op; 901} 902 903static struct bpf_map_op * 904bpf_map_op__clone(struct bpf_map_op *op) 905{ 906 struct bpf_map_op *newop; 907 908 newop = memdup(op, sizeof(*op)); 909 if (!newop) { 910 pr_debug("Failed to alloc bpf_map_op\n"); 911 return NULL; 912 } 913 914 INIT_LIST_HEAD(&newop->list); 915 if (op->key_type == BPF_MAP_KEY_RANGES) { 916 size_t memsz = op->k.array.nr_ranges * 917 sizeof(op->k.array.ranges[0]); 918 919 newop->k.array.ranges = memdup(op->k.array.ranges, memsz); 920 if (!newop->k.array.ranges) { 921 pr_debug("Failed to alloc indices for map\n"); 922 free(newop); 923 return NULL; 924 } 925 } 926 927 return newop; 928} 929 930static struct bpf_map_priv * 931bpf_map_priv__clone(struct bpf_map_priv *priv) 932{ 933 struct bpf_map_priv *newpriv; 934 struct bpf_map_op *pos, *newop; 935 936 newpriv = zalloc(sizeof(*newpriv)); 937 if (!newpriv) { 938 pr_debug("Not enough memory to alloc map private\n"); 939 return NULL; 940 } 941 INIT_LIST_HEAD(&newpriv->ops_list); 942 943 list_for_each_entry(pos, &priv->ops_list, list) { 944 newop = bpf_map_op__clone(pos); 945 if (!newop) { 946 bpf_map_priv__purge(newpriv); 947 return NULL; 948 } 949 list_add_tail(&newop->list, &newpriv->ops_list); 950 } 951 952 return newpriv; 953} 954 955static int 956bpf_map__add_op(struct bpf_map *map, struct bpf_map_op *op) 957{ 958 const char *map_name = bpf_map__name(map); 959 struct bpf_map_priv *priv = bpf_map__priv(map); 960 961 if (IS_ERR(priv)) { 962 pr_debug("Failed to get private from map %s\n", map_name); 963 return PTR_ERR(priv); 964 } 965 966 if (!priv) { 967 priv = zalloc(sizeof(*priv)); 968 if (!priv) { 969 pr_debug("Not enough memory to alloc map private\n"); 970 return -ENOMEM; 971 } 972 INIT_LIST_HEAD(&priv->ops_list); 973 974 if (bpf_map__set_priv(map, priv, bpf_map_priv__clear)) { 975 free(priv); 976 return -BPF_LOADER_ERRNO__INTERNAL; 977 } 978 } 979 980 list_add_tail(&op->list, &priv->ops_list); 981 return 0; 982} 983 984static struct bpf_map_op * 985bpf_map__add_newop(struct bpf_map *map, struct parse_events_term *term) 986{ 987 struct bpf_map_op *op; 988 int err; 989 990 op = bpf_map_op__new(term); 991 if (IS_ERR(op)) 992 return op; 993 994 err = bpf_map__add_op(map, op); 995 if (err) { 996 bpf_map_op__delete(op); 997 return ERR_PTR(err); 998 } 999 return op; 1000} 1001 1002static int 1003__bpf_map__config_value(struct bpf_map *map, 1004 struct parse_events_term *term) 1005{ 1006 struct bpf_map_op *op; 1007 const char *map_name = bpf_map__name(map); 1008 const struct bpf_map_def *def = bpf_map__def(map); 1009 1010 if (IS_ERR(def)) { 1011 pr_debug("Unable to get map definition from '%s'\n", 1012 map_name); 1013 return -BPF_LOADER_ERRNO__INTERNAL; 1014 } 1015 1016 if (def->type != BPF_MAP_TYPE_ARRAY) { 1017 pr_debug("Map %s type is not BPF_MAP_TYPE_ARRAY\n", 1018 map_name); 1019 return -BPF_LOADER_ERRNO__OBJCONF_MAP_TYPE; 1020 } 1021 if (def->key_size < sizeof(unsigned int)) { 1022 pr_debug("Map %s has incorrect key size\n", map_name); 1023 return -BPF_LOADER_ERRNO__OBJCONF_MAP_KEYSIZE; 1024 } 1025 switch (def->value_size) { 1026 case 1: 1027 case 2: 1028 case 4: 1029 case 8: 1030 break; 1031 default: 1032 pr_debug("Map %s has incorrect value size\n", map_name); 1033 return -BPF_LOADER_ERRNO__OBJCONF_MAP_VALUESIZE; 1034 } 1035 1036 op = bpf_map__add_newop(map, term); 1037 if (IS_ERR(op)) 1038 return PTR_ERR(op); 1039 op->op_type = BPF_MAP_OP_SET_VALUE; 1040 op->v.value = term->val.num; 1041 return 0; 1042} 1043 1044static int 1045bpf_map__config_value(struct bpf_map *map, 1046 struct parse_events_term *term, 1047 struct evlist *evlist __maybe_unused) 1048{ 1049 if (!term->err_val) { 1050 pr_debug("Config value not set\n"); 1051 return -BPF_LOADER_ERRNO__OBJCONF_CONF; 1052 } 1053 1054 if (term->type_val != PARSE_EVENTS__TERM_TYPE_NUM) { 1055 pr_debug("ERROR: wrong value type for 'value'\n"); 1056 return -BPF_LOADER_ERRNO__OBJCONF_MAP_VALUE; 1057 } 1058 1059 return __bpf_map__config_value(map, term); 1060} 1061 1062static int 1063__bpf_map__config_event(struct bpf_map *map, 1064 struct parse_events_term *term, 1065 struct evlist *evlist) 1066{ 1067 const struct bpf_map_def *def; 1068 struct bpf_map_op *op; 1069 const char *map_name = bpf_map__name(map); 1070 struct evsel *evsel = evlist__find_evsel_by_str(evlist, term->val.str); 1071 1072 if (!evsel) { 1073 pr_debug("Event (for '%s') '%s' doesn't exist\n", 1074 map_name, term->val.str); 1075 return -BPF_LOADER_ERRNO__OBJCONF_MAP_NOEVT; 1076 } 1077 1078 def = bpf_map__def(map); 1079 if (IS_ERR(def)) { 1080 pr_debug("Unable to get map definition from '%s'\n", 1081 map_name); 1082 return PTR_ERR(def); 1083 } 1084 1085 /* 1086 * No need to check key_size and value_size: 1087 * kernel has already checked them. 1088 */ 1089 if (def->type != BPF_MAP_TYPE_PERF_EVENT_ARRAY) { 1090 pr_debug("Map %s type is not BPF_MAP_TYPE_PERF_EVENT_ARRAY\n", 1091 map_name); 1092 return -BPF_LOADER_ERRNO__OBJCONF_MAP_TYPE; 1093 } 1094 1095 op = bpf_map__add_newop(map, term); 1096 if (IS_ERR(op)) 1097 return PTR_ERR(op); 1098 op->op_type = BPF_MAP_OP_SET_EVSEL; 1099 op->v.evsel = evsel; 1100 return 0; 1101} 1102 1103static int 1104bpf_map__config_event(struct bpf_map *map, 1105 struct parse_events_term *term, 1106 struct evlist *evlist) 1107{ 1108 if (!term->err_val) { 1109 pr_debug("Config value not set\n"); 1110 return -BPF_LOADER_ERRNO__OBJCONF_CONF; 1111 } 1112 1113 if (term->type_val != PARSE_EVENTS__TERM_TYPE_STR) { 1114 pr_debug("ERROR: wrong value type for 'event'\n"); 1115 return -BPF_LOADER_ERRNO__OBJCONF_MAP_VALUE; 1116 } 1117 1118 return __bpf_map__config_event(map, term, evlist); 1119} 1120 1121struct bpf_obj_config__map_func { 1122 const char *config_opt; 1123 int (*config_func)(struct bpf_map *, struct parse_events_term *, 1124 struct evlist *); 1125}; 1126 1127struct bpf_obj_config__map_func bpf_obj_config__map_funcs[] = { 1128 {"value", bpf_map__config_value}, 1129 {"event", bpf_map__config_event}, 1130}; 1131 1132static int 1133config_map_indices_range_check(struct parse_events_term *term, 1134 struct bpf_map *map, 1135 const char *map_name) 1136{ 1137 struct parse_events_array *array = &term->array; 1138 const struct bpf_map_def *def; 1139 unsigned int i; 1140 1141 if (!array->nr_ranges) 1142 return 0; 1143 if (!array->ranges) { 1144 pr_debug("ERROR: map %s: array->nr_ranges is %d but range array is NULL\n", 1145 map_name, (int)array->nr_ranges); 1146 return -BPF_LOADER_ERRNO__INTERNAL; 1147 } 1148 1149 def = bpf_map__def(map); 1150 if (IS_ERR(def)) { 1151 pr_debug("ERROR: Unable to get map definition from '%s'\n", 1152 map_name); 1153 return -BPF_LOADER_ERRNO__INTERNAL; 1154 } 1155 1156 for (i = 0; i < array->nr_ranges; i++) { 1157 unsigned int start = array->ranges[i].start; 1158 size_t length = array->ranges[i].length; 1159 unsigned int idx = start + length - 1; 1160 1161 if (idx >= def->max_entries) { 1162 pr_debug("ERROR: index %d too large\n", idx); 1163 return -BPF_LOADER_ERRNO__OBJCONF_MAP_IDX2BIG; 1164 } 1165 } 1166 return 0; 1167} 1168 1169static int 1170bpf__obj_config_map(struct bpf_object *obj, 1171 struct parse_events_term *term, 1172 struct evlist *evlist, 1173 int *key_scan_pos) 1174{ 1175 /* key is "map:<mapname>.<config opt>" */ 1176 char *map_name = strdup(term->config + sizeof("map:") - 1); 1177 struct bpf_map *map; 1178 int err = -BPF_LOADER_ERRNO__OBJCONF_OPT; 1179 char *map_opt; 1180 size_t i; 1181 1182 if (!map_name) 1183 return -ENOMEM; 1184 1185 map_opt = strchr(map_name, '.'); 1186 if (!map_opt) { 1187 pr_debug("ERROR: Invalid map config: %s\n", map_name); 1188 goto out; 1189 } 1190 1191 *map_opt++ = '\0'; 1192 if (*map_opt == '\0') { 1193 pr_debug("ERROR: Invalid map option: %s\n", term->config); 1194 goto out; 1195 } 1196 1197 map = bpf_object__find_map_by_name(obj, map_name); 1198 if (!map) { 1199 pr_debug("ERROR: Map %s doesn't exist\n", map_name); 1200 err = -BPF_LOADER_ERRNO__OBJCONF_MAP_NOTEXIST; 1201 goto out; 1202 } 1203 1204 *key_scan_pos += strlen(map_opt); 1205 err = config_map_indices_range_check(term, map, map_name); 1206 if (err) 1207 goto out; 1208 *key_scan_pos -= strlen(map_opt); 1209 1210 for (i = 0; i < ARRAY_SIZE(bpf_obj_config__map_funcs); i++) { 1211 struct bpf_obj_config__map_func *func = 1212 &bpf_obj_config__map_funcs[i]; 1213 1214 if (strcmp(map_opt, func->config_opt) == 0) { 1215 err = func->config_func(map, term, evlist); 1216 goto out; 1217 } 1218 } 1219 1220 pr_debug("ERROR: Invalid map config option '%s'\n", map_opt); 1221 err = -BPF_LOADER_ERRNO__OBJCONF_MAP_OPT; 1222out: 1223 if (!err) 1224 *key_scan_pos += strlen(map_opt); 1225 1226 free(map_name); 1227 return err; 1228} 1229 1230int bpf__config_obj(struct bpf_object *obj, 1231 struct parse_events_term *term, 1232 struct evlist *evlist, 1233 int *error_pos) 1234{ 1235 int key_scan_pos = 0; 1236 int err; 1237 1238 if (!obj || !term || !term->config) 1239 return -EINVAL; 1240 1241 if (strstarts(term->config, "map:")) { 1242 key_scan_pos = sizeof("map:") - 1; 1243 err = bpf__obj_config_map(obj, term, evlist, &key_scan_pos); 1244 goto out; 1245 } 1246 err = -BPF_LOADER_ERRNO__OBJCONF_OPT; 1247out: 1248 if (error_pos) 1249 *error_pos = key_scan_pos; 1250 return err; 1251 1252} 1253 1254typedef int (*map_config_func_t)(const char *name, int map_fd, 1255 const struct bpf_map_def *pdef, 1256 struct bpf_map_op *op, 1257 void *pkey, void *arg); 1258 1259static int 1260foreach_key_array_all(map_config_func_t func, 1261 void *arg, const char *name, 1262 int map_fd, const struct bpf_map_def *pdef, 1263 struct bpf_map_op *op) 1264{ 1265 unsigned int i; 1266 int err; 1267 1268 for (i = 0; i < pdef->max_entries; i++) { 1269 err = func(name, map_fd, pdef, op, &i, arg); 1270 if (err) { 1271 pr_debug("ERROR: failed to insert value to %s[%u]\n", 1272 name, i); 1273 return err; 1274 } 1275 } 1276 return 0; 1277} 1278 1279static int 1280foreach_key_array_ranges(map_config_func_t func, void *arg, 1281 const char *name, int map_fd, 1282 const struct bpf_map_def *pdef, 1283 struct bpf_map_op *op) 1284{ 1285 unsigned int i, j; 1286 int err; 1287 1288 for (i = 0; i < op->k.array.nr_ranges; i++) { 1289 unsigned int start = op->k.array.ranges[i].start; 1290 size_t length = op->k.array.ranges[i].length; 1291 1292 for (j = 0; j < length; j++) { 1293 unsigned int idx = start + j; 1294 1295 err = func(name, map_fd, pdef, op, &idx, arg); 1296 if (err) { 1297 pr_debug("ERROR: failed to insert value to %s[%u]\n", 1298 name, idx); 1299 return err; 1300 } 1301 } 1302 } 1303 return 0; 1304} 1305 1306static int 1307bpf_map_config_foreach_key(struct bpf_map *map, 1308 map_config_func_t func, 1309 void *arg) 1310{ 1311 int err, map_fd; 1312 struct bpf_map_op *op; 1313 const struct bpf_map_def *def; 1314 const char *name = bpf_map__name(map); 1315 struct bpf_map_priv *priv = bpf_map__priv(map); 1316 1317 if (IS_ERR(priv)) { 1318 pr_debug("ERROR: failed to get private from map %s\n", name); 1319 return -BPF_LOADER_ERRNO__INTERNAL; 1320 } 1321 if (!priv || list_empty(&priv->ops_list)) { 1322 pr_debug("INFO: nothing to config for map %s\n", name); 1323 return 0; 1324 } 1325 1326 def = bpf_map__def(map); 1327 if (IS_ERR(def)) { 1328 pr_debug("ERROR: failed to get definition from map %s\n", name); 1329 return -BPF_LOADER_ERRNO__INTERNAL; 1330 } 1331 map_fd = bpf_map__fd(map); 1332 if (map_fd < 0) { 1333 pr_debug("ERROR: failed to get fd from map %s\n", name); 1334 return map_fd; 1335 } 1336 1337 list_for_each_entry(op, &priv->ops_list, list) { 1338 switch (def->type) { 1339 case BPF_MAP_TYPE_ARRAY: 1340 case BPF_MAP_TYPE_PERF_EVENT_ARRAY: 1341 switch (op->key_type) { 1342 case BPF_MAP_KEY_ALL: 1343 err = foreach_key_array_all(func, arg, name, 1344 map_fd, def, op); 1345 break; 1346 case BPF_MAP_KEY_RANGES: 1347 err = foreach_key_array_ranges(func, arg, name, 1348 map_fd, def, 1349 op); 1350 break; 1351 default: 1352 pr_debug("ERROR: keytype for map '%s' invalid\n", 1353 name); 1354 return -BPF_LOADER_ERRNO__INTERNAL; 1355 } 1356 if (err) 1357 return err; 1358 break; 1359 default: 1360 pr_debug("ERROR: type of '%s' incorrect\n", name); 1361 return -BPF_LOADER_ERRNO__OBJCONF_MAP_TYPE; 1362 } 1363 } 1364 1365 return 0; 1366} 1367 1368static int 1369apply_config_value_for_key(int map_fd, void *pkey, 1370 size_t val_size, u64 val) 1371{ 1372 int err = 0; 1373 1374 switch (val_size) { 1375 case 1: { 1376 u8 _val = (u8)(val); 1377 err = bpf_map_update_elem(map_fd, pkey, &_val, BPF_ANY); 1378 break; 1379 } 1380 case 2: { 1381 u16 _val = (u16)(val); 1382 err = bpf_map_update_elem(map_fd, pkey, &_val, BPF_ANY); 1383 break; 1384 } 1385 case 4: { 1386 u32 _val = (u32)(val); 1387 err = bpf_map_update_elem(map_fd, pkey, &_val, BPF_ANY); 1388 break; 1389 } 1390 case 8: { 1391 err = bpf_map_update_elem(map_fd, pkey, &val, BPF_ANY); 1392 break; 1393 } 1394 default: 1395 pr_debug("ERROR: invalid value size\n"); 1396 return -BPF_LOADER_ERRNO__OBJCONF_MAP_VALUESIZE; 1397 } 1398 if (err && errno) 1399 err = -errno; 1400 return err; 1401} 1402 1403static int 1404apply_config_evsel_for_key(const char *name, int map_fd, void *pkey, 1405 struct evsel *evsel) 1406{ 1407 struct xyarray *xy = evsel->core.fd; 1408 struct perf_event_attr *attr; 1409 unsigned int key, events; 1410 bool check_pass = false; 1411 int *evt_fd; 1412 int err; 1413 1414 if (!xy) { 1415 pr_debug("ERROR: evsel not ready for map %s\n", name); 1416 return -BPF_LOADER_ERRNO__INTERNAL; 1417 } 1418 1419 if (xy->row_size / xy->entry_size != 1) { 1420 pr_debug("ERROR: Dimension of target event is incorrect for map %s\n", 1421 name); 1422 return -BPF_LOADER_ERRNO__OBJCONF_MAP_EVTDIM; 1423 } 1424 1425 attr = &evsel->core.attr; 1426 if (attr->inherit) { 1427 pr_debug("ERROR: Can't put inherit event into map %s\n", name); 1428 return -BPF_LOADER_ERRNO__OBJCONF_MAP_EVTINH; 1429 } 1430 1431 if (evsel__is_bpf_output(evsel)) 1432 check_pass = true; 1433 if (attr->type == PERF_TYPE_RAW) 1434 check_pass = true; 1435 if (attr->type == PERF_TYPE_HARDWARE) 1436 check_pass = true; 1437 if (!check_pass) { 1438 pr_debug("ERROR: Event type is wrong for map %s\n", name); 1439 return -BPF_LOADER_ERRNO__OBJCONF_MAP_EVTTYPE; 1440 } 1441 1442 events = xy->entries / (xy->row_size / xy->entry_size); 1443 key = *((unsigned int *)pkey); 1444 if (key >= events) { 1445 pr_debug("ERROR: there is no event %d for map %s\n", 1446 key, name); 1447 return -BPF_LOADER_ERRNO__OBJCONF_MAP_MAPSIZE; 1448 } 1449 evt_fd = xyarray__entry(xy, key, 0); 1450 err = bpf_map_update_elem(map_fd, pkey, evt_fd, BPF_ANY); 1451 if (err && errno) 1452 err = -errno; 1453 return err; 1454} 1455 1456static int 1457apply_obj_config_map_for_key(const char *name, int map_fd, 1458 const struct bpf_map_def *pdef, 1459 struct bpf_map_op *op, 1460 void *pkey, void *arg __maybe_unused) 1461{ 1462 int err; 1463 1464 switch (op->op_type) { 1465 case BPF_MAP_OP_SET_VALUE: 1466 err = apply_config_value_for_key(map_fd, pkey, 1467 pdef->value_size, 1468 op->v.value); 1469 break; 1470 case BPF_MAP_OP_SET_EVSEL: 1471 err = apply_config_evsel_for_key(name, map_fd, pkey, 1472 op->v.evsel); 1473 break; 1474 default: 1475 pr_debug("ERROR: unknown value type for '%s'\n", name); 1476 err = -BPF_LOADER_ERRNO__INTERNAL; 1477 } 1478 return err; 1479} 1480 1481static int 1482apply_obj_config_map(struct bpf_map *map) 1483{ 1484 return bpf_map_config_foreach_key(map, 1485 apply_obj_config_map_for_key, 1486 NULL); 1487} 1488 1489static int 1490apply_obj_config_object(struct bpf_object *obj) 1491{ 1492 struct bpf_map *map; 1493 int err; 1494 1495 bpf_object__for_each_map(map, obj) { 1496 err = apply_obj_config_map(map); 1497 if (err) 1498 return err; 1499 } 1500 return 0; 1501} 1502 1503int bpf__apply_obj_config(void) 1504{ 1505 struct bpf_object *obj, *tmp; 1506 int err; 1507 1508 bpf_object__for_each_safe(obj, tmp) { 1509 err = apply_obj_config_object(obj); 1510 if (err) 1511 return err; 1512 } 1513 1514 return 0; 1515} 1516 1517#define bpf__for_each_map(pos, obj, objtmp) \ 1518 bpf_object__for_each_safe(obj, objtmp) \ 1519 bpf_object__for_each_map(pos, obj) 1520 1521#define bpf__for_each_map_named(pos, obj, objtmp, name) \ 1522 bpf__for_each_map(pos, obj, objtmp) \ 1523 if (bpf_map__name(pos) && \ 1524 (strcmp(name, \ 1525 bpf_map__name(pos)) == 0)) 1526 1527struct evsel *bpf__setup_output_event(struct evlist *evlist, const char *name) 1528{ 1529 struct bpf_map_priv *tmpl_priv = NULL; 1530 struct bpf_object *obj, *tmp; 1531 struct evsel *evsel = NULL; 1532 struct bpf_map *map; 1533 int err; 1534 bool need_init = false; 1535 1536 bpf__for_each_map_named(map, obj, tmp, name) { 1537 struct bpf_map_priv *priv = bpf_map__priv(map); 1538 1539 if (IS_ERR(priv)) 1540 return ERR_PTR(-BPF_LOADER_ERRNO__INTERNAL); 1541 1542 /* 1543 * No need to check map type: type should have been 1544 * verified by kernel. 1545 */ 1546 if (!need_init && !priv) 1547 need_init = !priv; 1548 if (!tmpl_priv && priv) 1549 tmpl_priv = priv; 1550 } 1551 1552 if (!need_init) 1553 return NULL; 1554 1555 if (!tmpl_priv) { 1556 char *event_definition = NULL; 1557 1558 if (asprintf(&event_definition, "bpf-output/no-inherit=1,name=%s/", name) < 0) 1559 return ERR_PTR(-ENOMEM); 1560 1561 err = parse_events(evlist, event_definition, NULL); 1562 free(event_definition); 1563 1564 if (err) { 1565 pr_debug("ERROR: failed to create the \"%s\" bpf-output event\n", name); 1566 return ERR_PTR(-err); 1567 } 1568 1569 evsel = evlist__last(evlist); 1570 } 1571 1572 bpf__for_each_map_named(map, obj, tmp, name) { 1573 struct bpf_map_priv *priv = bpf_map__priv(map); 1574 1575 if (IS_ERR(priv)) 1576 return ERR_PTR(-BPF_LOADER_ERRNO__INTERNAL); 1577 if (priv) 1578 continue; 1579 1580 if (tmpl_priv) { 1581 priv = bpf_map_priv__clone(tmpl_priv); 1582 if (!priv) 1583 return ERR_PTR(-ENOMEM); 1584 1585 err = bpf_map__set_priv(map, priv, bpf_map_priv__clear); 1586 if (err) { 1587 bpf_map_priv__clear(map, priv); 1588 return ERR_PTR(err); 1589 } 1590 } else if (evsel) { 1591 struct bpf_map_op *op; 1592 1593 op = bpf_map__add_newop(map, NULL); 1594 if (IS_ERR(op)) 1595 return ERR_CAST(op); 1596 op->op_type = BPF_MAP_OP_SET_EVSEL; 1597 op->v.evsel = evsel; 1598 } 1599 } 1600 1601 return evsel; 1602} 1603 1604int bpf__setup_stdout(struct evlist *evlist) 1605{ 1606 struct evsel *evsel = bpf__setup_output_event(evlist, "__bpf_stdout__"); 1607 return PTR_ERR_OR_ZERO(evsel); 1608} 1609 1610#define ERRNO_OFFSET(e) ((e) - __BPF_LOADER_ERRNO__START) 1611#define ERRCODE_OFFSET(c) ERRNO_OFFSET(BPF_LOADER_ERRNO__##c) 1612#define NR_ERRNO (__BPF_LOADER_ERRNO__END - __BPF_LOADER_ERRNO__START) 1613 1614static const char *bpf_loader_strerror_table[NR_ERRNO] = { 1615 [ERRCODE_OFFSET(CONFIG)] = "Invalid config string", 1616 [ERRCODE_OFFSET(GROUP)] = "Invalid group name", 1617 [ERRCODE_OFFSET(EVENTNAME)] = "No event name found in config string", 1618 [ERRCODE_OFFSET(INTERNAL)] = "BPF loader internal error", 1619 [ERRCODE_OFFSET(COMPILE)] = "Error when compiling BPF scriptlet", 1620 [ERRCODE_OFFSET(PROGCONF_TERM)] = "Invalid program config term in config string", 1621 [ERRCODE_OFFSET(PROLOGUE)] = "Failed to generate prologue", 1622 [ERRCODE_OFFSET(PROLOGUE2BIG)] = "Prologue too big for program", 1623 [ERRCODE_OFFSET(PROLOGUEOOB)] = "Offset out of bound for prologue", 1624 [ERRCODE_OFFSET(OBJCONF_OPT)] = "Invalid object config option", 1625 [ERRCODE_OFFSET(OBJCONF_CONF)] = "Config value not set (missing '=')", 1626 [ERRCODE_OFFSET(OBJCONF_MAP_OPT)] = "Invalid object map config option", 1627 [ERRCODE_OFFSET(OBJCONF_MAP_NOTEXIST)] = "Target map doesn't exist", 1628 [ERRCODE_OFFSET(OBJCONF_MAP_VALUE)] = "Incorrect value type for map", 1629 [ERRCODE_OFFSET(OBJCONF_MAP_TYPE)] = "Incorrect map type", 1630 [ERRCODE_OFFSET(OBJCONF_MAP_KEYSIZE)] = "Incorrect map key size", 1631 [ERRCODE_OFFSET(OBJCONF_MAP_VALUESIZE)] = "Incorrect map value size", 1632 [ERRCODE_OFFSET(OBJCONF_MAP_NOEVT)] = "Event not found for map setting", 1633 [ERRCODE_OFFSET(OBJCONF_MAP_MAPSIZE)] = "Invalid map size for event setting", 1634 [ERRCODE_OFFSET(OBJCONF_MAP_EVTDIM)] = "Event dimension too large", 1635 [ERRCODE_OFFSET(OBJCONF_MAP_EVTINH)] = "Doesn't support inherit event", 1636 [ERRCODE_OFFSET(OBJCONF_MAP_EVTTYPE)] = "Wrong event type for map", 1637 [ERRCODE_OFFSET(OBJCONF_MAP_IDX2BIG)] = "Index too large", 1638}; 1639 1640static int 1641bpf_loader_strerror(int err, char *buf, size_t size) 1642{ 1643 char sbuf[STRERR_BUFSIZE]; 1644 const char *msg; 1645 1646 if (!buf || !size) 1647 return -1; 1648 1649 err = err > 0 ? err : -err; 1650 1651 if (err >= __LIBBPF_ERRNO__START) 1652 return libbpf_strerror(err, buf, size); 1653 1654 if (err >= __BPF_LOADER_ERRNO__START && err < __BPF_LOADER_ERRNO__END) { 1655 msg = bpf_loader_strerror_table[ERRNO_OFFSET(err)]; 1656 snprintf(buf, size, "%s", msg); 1657 buf[size - 1] = '\0'; 1658 return 0; 1659 } 1660 1661 if (err >= __BPF_LOADER_ERRNO__END) 1662 snprintf(buf, size, "Unknown bpf loader error %d", err); 1663 else 1664 snprintf(buf, size, "%s", 1665 str_error_r(err, sbuf, sizeof(sbuf))); 1666 1667 buf[size - 1] = '\0'; 1668 return -1; 1669} 1670 1671#define bpf__strerror_head(err, buf, size) \ 1672 char sbuf[STRERR_BUFSIZE], *emsg;\ 1673 if (!size)\ 1674 return 0;\ 1675 if (err < 0)\ 1676 err = -err;\ 1677 bpf_loader_strerror(err, sbuf, sizeof(sbuf));\ 1678 emsg = sbuf;\ 1679 switch (err) {\ 1680 default:\ 1681 scnprintf(buf, size, "%s", emsg);\ 1682 break; 1683 1684#define bpf__strerror_entry(val, fmt...)\ 1685 case val: {\ 1686 scnprintf(buf, size, fmt);\ 1687 break;\ 1688 } 1689 1690#define bpf__strerror_end(buf, size)\ 1691 }\ 1692 buf[size - 1] = '\0'; 1693 1694int bpf__strerror_prepare_load(const char *filename, bool source, 1695 int err, char *buf, size_t size) 1696{ 1697 size_t n; 1698 int ret; 1699 1700 n = snprintf(buf, size, "Failed to load %s%s: ", 1701 filename, source ? " from source" : ""); 1702 if (n >= size) { 1703 buf[size - 1] = '\0'; 1704 return 0; 1705 } 1706 buf += n; 1707 size -= n; 1708 1709 ret = bpf_loader_strerror(err, buf, size); 1710 buf[size - 1] = '\0'; 1711 return ret; 1712} 1713 1714int bpf__strerror_probe(struct bpf_object *obj __maybe_unused, 1715 int err, char *buf, size_t size) 1716{ 1717 bpf__strerror_head(err, buf, size); 1718 case BPF_LOADER_ERRNO__PROGCONF_TERM: { 1719 scnprintf(buf, size, "%s (add -v to see detail)", emsg); 1720 break; 1721 } 1722 bpf__strerror_entry(EEXIST, "Probe point exist. Try 'perf probe -d \"*\"' and set 'force=yes'"); 1723 bpf__strerror_entry(EACCES, "You need to be root"); 1724 bpf__strerror_entry(EPERM, "You need to be root, and /proc/sys/kernel/kptr_restrict should be 0"); 1725 bpf__strerror_entry(ENOENT, "You need to check probing points in BPF file"); 1726 bpf__strerror_end(buf, size); 1727 return 0; 1728} 1729 1730int bpf__strerror_load(struct bpf_object *obj, 1731 int err, char *buf, size_t size) 1732{ 1733 bpf__strerror_head(err, buf, size); 1734 case LIBBPF_ERRNO__KVER: { 1735 unsigned int obj_kver = bpf_object__kversion(obj); 1736 unsigned int real_kver; 1737 1738 if (fetch_kernel_version(&real_kver, NULL, 0)) { 1739 scnprintf(buf, size, "Unable to fetch kernel version"); 1740 break; 1741 } 1742 1743 if (obj_kver != real_kver) { 1744 scnprintf(buf, size, 1745 "'version' ("KVER_FMT") doesn't match running kernel ("KVER_FMT")", 1746 KVER_PARAM(obj_kver), 1747 KVER_PARAM(real_kver)); 1748 break; 1749 } 1750 1751 scnprintf(buf, size, "Failed to load program for unknown reason"); 1752 break; 1753 } 1754 bpf__strerror_end(buf, size); 1755 return 0; 1756} 1757 1758int bpf__strerror_config_obj(struct bpf_object *obj __maybe_unused, 1759 struct parse_events_term *term __maybe_unused, 1760 struct evlist *evlist __maybe_unused, 1761 int *error_pos __maybe_unused, int err, 1762 char *buf, size_t size) 1763{ 1764 bpf__strerror_head(err, buf, size); 1765 bpf__strerror_entry(BPF_LOADER_ERRNO__OBJCONF_MAP_TYPE, 1766 "Can't use this config term with this map type"); 1767 bpf__strerror_end(buf, size); 1768 return 0; 1769} 1770 1771int bpf__strerror_apply_obj_config(int err, char *buf, size_t size) 1772{ 1773 bpf__strerror_head(err, buf, size); 1774 bpf__strerror_entry(BPF_LOADER_ERRNO__OBJCONF_MAP_EVTDIM, 1775 "Cannot set event to BPF map in multi-thread tracing"); 1776 bpf__strerror_entry(BPF_LOADER_ERRNO__OBJCONF_MAP_EVTINH, 1777 "%s (Hint: use -i to turn off inherit)", emsg); 1778 bpf__strerror_entry(BPF_LOADER_ERRNO__OBJCONF_MAP_EVTTYPE, 1779 "Can only put raw, hardware and BPF output event into a BPF map"); 1780 bpf__strerror_end(buf, size); 1781 return 0; 1782} 1783 1784int bpf__strerror_setup_output_event(struct evlist *evlist __maybe_unused, 1785 int err, char *buf, size_t size) 1786{ 1787 bpf__strerror_head(err, buf, size); 1788 bpf__strerror_end(buf, size); 1789 return 0; 1790}