Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v5.17-rc2 1789 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 free(map_name); 1224 if (!err) 1225 *key_scan_pos += strlen(map_opt); 1226 return err; 1227} 1228 1229int bpf__config_obj(struct bpf_object *obj, 1230 struct parse_events_term *term, 1231 struct evlist *evlist, 1232 int *error_pos) 1233{ 1234 int key_scan_pos = 0; 1235 int err; 1236 1237 if (!obj || !term || !term->config) 1238 return -EINVAL; 1239 1240 if (strstarts(term->config, "map:")) { 1241 key_scan_pos = sizeof("map:") - 1; 1242 err = bpf__obj_config_map(obj, term, evlist, &key_scan_pos); 1243 goto out; 1244 } 1245 err = -BPF_LOADER_ERRNO__OBJCONF_OPT; 1246out: 1247 if (error_pos) 1248 *error_pos = key_scan_pos; 1249 return err; 1250 1251} 1252 1253typedef int (*map_config_func_t)(const char *name, int map_fd, 1254 const struct bpf_map_def *pdef, 1255 struct bpf_map_op *op, 1256 void *pkey, void *arg); 1257 1258static int 1259foreach_key_array_all(map_config_func_t func, 1260 void *arg, const char *name, 1261 int map_fd, const struct bpf_map_def *pdef, 1262 struct bpf_map_op *op) 1263{ 1264 unsigned int i; 1265 int err; 1266 1267 for (i = 0; i < pdef->max_entries; i++) { 1268 err = func(name, map_fd, pdef, op, &i, arg); 1269 if (err) { 1270 pr_debug("ERROR: failed to insert value to %s[%u]\n", 1271 name, i); 1272 return err; 1273 } 1274 } 1275 return 0; 1276} 1277 1278static int 1279foreach_key_array_ranges(map_config_func_t func, void *arg, 1280 const char *name, int map_fd, 1281 const struct bpf_map_def *pdef, 1282 struct bpf_map_op *op) 1283{ 1284 unsigned int i, j; 1285 int err; 1286 1287 for (i = 0; i < op->k.array.nr_ranges; i++) { 1288 unsigned int start = op->k.array.ranges[i].start; 1289 size_t length = op->k.array.ranges[i].length; 1290 1291 for (j = 0; j < length; j++) { 1292 unsigned int idx = start + j; 1293 1294 err = func(name, map_fd, pdef, op, &idx, arg); 1295 if (err) { 1296 pr_debug("ERROR: failed to insert value to %s[%u]\n", 1297 name, idx); 1298 return err; 1299 } 1300 } 1301 } 1302 return 0; 1303} 1304 1305static int 1306bpf_map_config_foreach_key(struct bpf_map *map, 1307 map_config_func_t func, 1308 void *arg) 1309{ 1310 int err, map_fd; 1311 struct bpf_map_op *op; 1312 const struct bpf_map_def *def; 1313 const char *name = bpf_map__name(map); 1314 struct bpf_map_priv *priv = bpf_map__priv(map); 1315 1316 if (IS_ERR(priv)) { 1317 pr_debug("ERROR: failed to get private from map %s\n", name); 1318 return -BPF_LOADER_ERRNO__INTERNAL; 1319 } 1320 if (!priv || list_empty(&priv->ops_list)) { 1321 pr_debug("INFO: nothing to config for map %s\n", name); 1322 return 0; 1323 } 1324 1325 def = bpf_map__def(map); 1326 if (IS_ERR(def)) { 1327 pr_debug("ERROR: failed to get definition from map %s\n", name); 1328 return -BPF_LOADER_ERRNO__INTERNAL; 1329 } 1330 map_fd = bpf_map__fd(map); 1331 if (map_fd < 0) { 1332 pr_debug("ERROR: failed to get fd from map %s\n", name); 1333 return map_fd; 1334 } 1335 1336 list_for_each_entry(op, &priv->ops_list, list) { 1337 switch (def->type) { 1338 case BPF_MAP_TYPE_ARRAY: 1339 case BPF_MAP_TYPE_PERF_EVENT_ARRAY: 1340 switch (op->key_type) { 1341 case BPF_MAP_KEY_ALL: 1342 err = foreach_key_array_all(func, arg, name, 1343 map_fd, def, op); 1344 break; 1345 case BPF_MAP_KEY_RANGES: 1346 err = foreach_key_array_ranges(func, arg, name, 1347 map_fd, def, 1348 op); 1349 break; 1350 default: 1351 pr_debug("ERROR: keytype for map '%s' invalid\n", 1352 name); 1353 return -BPF_LOADER_ERRNO__INTERNAL; 1354 } 1355 if (err) 1356 return err; 1357 break; 1358 default: 1359 pr_debug("ERROR: type of '%s' incorrect\n", name); 1360 return -BPF_LOADER_ERRNO__OBJCONF_MAP_TYPE; 1361 } 1362 } 1363 1364 return 0; 1365} 1366 1367static int 1368apply_config_value_for_key(int map_fd, void *pkey, 1369 size_t val_size, u64 val) 1370{ 1371 int err = 0; 1372 1373 switch (val_size) { 1374 case 1: { 1375 u8 _val = (u8)(val); 1376 err = bpf_map_update_elem(map_fd, pkey, &_val, BPF_ANY); 1377 break; 1378 } 1379 case 2: { 1380 u16 _val = (u16)(val); 1381 err = bpf_map_update_elem(map_fd, pkey, &_val, BPF_ANY); 1382 break; 1383 } 1384 case 4: { 1385 u32 _val = (u32)(val); 1386 err = bpf_map_update_elem(map_fd, pkey, &_val, BPF_ANY); 1387 break; 1388 } 1389 case 8: { 1390 err = bpf_map_update_elem(map_fd, pkey, &val, BPF_ANY); 1391 break; 1392 } 1393 default: 1394 pr_debug("ERROR: invalid value size\n"); 1395 return -BPF_LOADER_ERRNO__OBJCONF_MAP_VALUESIZE; 1396 } 1397 if (err && errno) 1398 err = -errno; 1399 return err; 1400} 1401 1402static int 1403apply_config_evsel_for_key(const char *name, int map_fd, void *pkey, 1404 struct evsel *evsel) 1405{ 1406 struct xyarray *xy = evsel->core.fd; 1407 struct perf_event_attr *attr; 1408 unsigned int key, events; 1409 bool check_pass = false; 1410 int *evt_fd; 1411 int err; 1412 1413 if (!xy) { 1414 pr_debug("ERROR: evsel not ready for map %s\n", name); 1415 return -BPF_LOADER_ERRNO__INTERNAL; 1416 } 1417 1418 if (xy->row_size / xy->entry_size != 1) { 1419 pr_debug("ERROR: Dimension of target event is incorrect for map %s\n", 1420 name); 1421 return -BPF_LOADER_ERRNO__OBJCONF_MAP_EVTDIM; 1422 } 1423 1424 attr = &evsel->core.attr; 1425 if (attr->inherit) { 1426 pr_debug("ERROR: Can't put inherit event into map %s\n", name); 1427 return -BPF_LOADER_ERRNO__OBJCONF_MAP_EVTINH; 1428 } 1429 1430 if (evsel__is_bpf_output(evsel)) 1431 check_pass = true; 1432 if (attr->type == PERF_TYPE_RAW) 1433 check_pass = true; 1434 if (attr->type == PERF_TYPE_HARDWARE) 1435 check_pass = true; 1436 if (!check_pass) { 1437 pr_debug("ERROR: Event type is wrong for map %s\n", name); 1438 return -BPF_LOADER_ERRNO__OBJCONF_MAP_EVTTYPE; 1439 } 1440 1441 events = xy->entries / (xy->row_size / xy->entry_size); 1442 key = *((unsigned int *)pkey); 1443 if (key >= events) { 1444 pr_debug("ERROR: there is no event %d for map %s\n", 1445 key, name); 1446 return -BPF_LOADER_ERRNO__OBJCONF_MAP_MAPSIZE; 1447 } 1448 evt_fd = xyarray__entry(xy, key, 0); 1449 err = bpf_map_update_elem(map_fd, pkey, evt_fd, BPF_ANY); 1450 if (err && errno) 1451 err = -errno; 1452 return err; 1453} 1454 1455static int 1456apply_obj_config_map_for_key(const char *name, int map_fd, 1457 const struct bpf_map_def *pdef, 1458 struct bpf_map_op *op, 1459 void *pkey, void *arg __maybe_unused) 1460{ 1461 int err; 1462 1463 switch (op->op_type) { 1464 case BPF_MAP_OP_SET_VALUE: 1465 err = apply_config_value_for_key(map_fd, pkey, 1466 pdef->value_size, 1467 op->v.value); 1468 break; 1469 case BPF_MAP_OP_SET_EVSEL: 1470 err = apply_config_evsel_for_key(name, map_fd, pkey, 1471 op->v.evsel); 1472 break; 1473 default: 1474 pr_debug("ERROR: unknown value type for '%s'\n", name); 1475 err = -BPF_LOADER_ERRNO__INTERNAL; 1476 } 1477 return err; 1478} 1479 1480static int 1481apply_obj_config_map(struct bpf_map *map) 1482{ 1483 return bpf_map_config_foreach_key(map, 1484 apply_obj_config_map_for_key, 1485 NULL); 1486} 1487 1488static int 1489apply_obj_config_object(struct bpf_object *obj) 1490{ 1491 struct bpf_map *map; 1492 int err; 1493 1494 bpf_object__for_each_map(map, obj) { 1495 err = apply_obj_config_map(map); 1496 if (err) 1497 return err; 1498 } 1499 return 0; 1500} 1501 1502int bpf__apply_obj_config(void) 1503{ 1504 struct bpf_object *obj, *tmp; 1505 int err; 1506 1507 bpf_object__for_each_safe(obj, tmp) { 1508 err = apply_obj_config_object(obj); 1509 if (err) 1510 return err; 1511 } 1512 1513 return 0; 1514} 1515 1516#define bpf__for_each_map(pos, obj, objtmp) \ 1517 bpf_object__for_each_safe(obj, objtmp) \ 1518 bpf_object__for_each_map(pos, obj) 1519 1520#define bpf__for_each_map_named(pos, obj, objtmp, name) \ 1521 bpf__for_each_map(pos, obj, objtmp) \ 1522 if (bpf_map__name(pos) && \ 1523 (strcmp(name, \ 1524 bpf_map__name(pos)) == 0)) 1525 1526struct evsel *bpf__setup_output_event(struct evlist *evlist, const char *name) 1527{ 1528 struct bpf_map_priv *tmpl_priv = NULL; 1529 struct bpf_object *obj, *tmp; 1530 struct evsel *evsel = NULL; 1531 struct bpf_map *map; 1532 int err; 1533 bool need_init = false; 1534 1535 bpf__for_each_map_named(map, obj, tmp, name) { 1536 struct bpf_map_priv *priv = bpf_map__priv(map); 1537 1538 if (IS_ERR(priv)) 1539 return ERR_PTR(-BPF_LOADER_ERRNO__INTERNAL); 1540 1541 /* 1542 * No need to check map type: type should have been 1543 * verified by kernel. 1544 */ 1545 if (!need_init && !priv) 1546 need_init = !priv; 1547 if (!tmpl_priv && priv) 1548 tmpl_priv = priv; 1549 } 1550 1551 if (!need_init) 1552 return NULL; 1553 1554 if (!tmpl_priv) { 1555 char *event_definition = NULL; 1556 1557 if (asprintf(&event_definition, "bpf-output/no-inherit=1,name=%s/", name) < 0) 1558 return ERR_PTR(-ENOMEM); 1559 1560 err = parse_events(evlist, event_definition, NULL); 1561 free(event_definition); 1562 1563 if (err) { 1564 pr_debug("ERROR: failed to create the \"%s\" bpf-output event\n", name); 1565 return ERR_PTR(-err); 1566 } 1567 1568 evsel = evlist__last(evlist); 1569 } 1570 1571 bpf__for_each_map_named(map, obj, tmp, name) { 1572 struct bpf_map_priv *priv = bpf_map__priv(map); 1573 1574 if (IS_ERR(priv)) 1575 return ERR_PTR(-BPF_LOADER_ERRNO__INTERNAL); 1576 if (priv) 1577 continue; 1578 1579 if (tmpl_priv) { 1580 priv = bpf_map_priv__clone(tmpl_priv); 1581 if (!priv) 1582 return ERR_PTR(-ENOMEM); 1583 1584 err = bpf_map__set_priv(map, priv, bpf_map_priv__clear); 1585 if (err) { 1586 bpf_map_priv__clear(map, priv); 1587 return ERR_PTR(err); 1588 } 1589 } else if (evsel) { 1590 struct bpf_map_op *op; 1591 1592 op = bpf_map__add_newop(map, NULL); 1593 if (IS_ERR(op)) 1594 return ERR_CAST(op); 1595 op->op_type = BPF_MAP_OP_SET_EVSEL; 1596 op->v.evsel = evsel; 1597 } 1598 } 1599 1600 return evsel; 1601} 1602 1603int bpf__setup_stdout(struct evlist *evlist) 1604{ 1605 struct evsel *evsel = bpf__setup_output_event(evlist, "__bpf_stdout__"); 1606 return PTR_ERR_OR_ZERO(evsel); 1607} 1608 1609#define ERRNO_OFFSET(e) ((e) - __BPF_LOADER_ERRNO__START) 1610#define ERRCODE_OFFSET(c) ERRNO_OFFSET(BPF_LOADER_ERRNO__##c) 1611#define NR_ERRNO (__BPF_LOADER_ERRNO__END - __BPF_LOADER_ERRNO__START) 1612 1613static const char *bpf_loader_strerror_table[NR_ERRNO] = { 1614 [ERRCODE_OFFSET(CONFIG)] = "Invalid config string", 1615 [ERRCODE_OFFSET(GROUP)] = "Invalid group name", 1616 [ERRCODE_OFFSET(EVENTNAME)] = "No event name found in config string", 1617 [ERRCODE_OFFSET(INTERNAL)] = "BPF loader internal error", 1618 [ERRCODE_OFFSET(COMPILE)] = "Error when compiling BPF scriptlet", 1619 [ERRCODE_OFFSET(PROGCONF_TERM)] = "Invalid program config term in config string", 1620 [ERRCODE_OFFSET(PROLOGUE)] = "Failed to generate prologue", 1621 [ERRCODE_OFFSET(PROLOGUE2BIG)] = "Prologue too big for program", 1622 [ERRCODE_OFFSET(PROLOGUEOOB)] = "Offset out of bound for prologue", 1623 [ERRCODE_OFFSET(OBJCONF_OPT)] = "Invalid object config option", 1624 [ERRCODE_OFFSET(OBJCONF_CONF)] = "Config value not set (missing '=')", 1625 [ERRCODE_OFFSET(OBJCONF_MAP_OPT)] = "Invalid object map config option", 1626 [ERRCODE_OFFSET(OBJCONF_MAP_NOTEXIST)] = "Target map doesn't exist", 1627 [ERRCODE_OFFSET(OBJCONF_MAP_VALUE)] = "Incorrect value type for map", 1628 [ERRCODE_OFFSET(OBJCONF_MAP_TYPE)] = "Incorrect map type", 1629 [ERRCODE_OFFSET(OBJCONF_MAP_KEYSIZE)] = "Incorrect map key size", 1630 [ERRCODE_OFFSET(OBJCONF_MAP_VALUESIZE)] = "Incorrect map value size", 1631 [ERRCODE_OFFSET(OBJCONF_MAP_NOEVT)] = "Event not found for map setting", 1632 [ERRCODE_OFFSET(OBJCONF_MAP_MAPSIZE)] = "Invalid map size for event setting", 1633 [ERRCODE_OFFSET(OBJCONF_MAP_EVTDIM)] = "Event dimension too large", 1634 [ERRCODE_OFFSET(OBJCONF_MAP_EVTINH)] = "Doesn't support inherit event", 1635 [ERRCODE_OFFSET(OBJCONF_MAP_EVTTYPE)] = "Wrong event type for map", 1636 [ERRCODE_OFFSET(OBJCONF_MAP_IDX2BIG)] = "Index too large", 1637}; 1638 1639static int 1640bpf_loader_strerror(int err, char *buf, size_t size) 1641{ 1642 char sbuf[STRERR_BUFSIZE]; 1643 const char *msg; 1644 1645 if (!buf || !size) 1646 return -1; 1647 1648 err = err > 0 ? err : -err; 1649 1650 if (err >= __LIBBPF_ERRNO__START) 1651 return libbpf_strerror(err, buf, size); 1652 1653 if (err >= __BPF_LOADER_ERRNO__START && err < __BPF_LOADER_ERRNO__END) { 1654 msg = bpf_loader_strerror_table[ERRNO_OFFSET(err)]; 1655 snprintf(buf, size, "%s", msg); 1656 buf[size - 1] = '\0'; 1657 return 0; 1658 } 1659 1660 if (err >= __BPF_LOADER_ERRNO__END) 1661 snprintf(buf, size, "Unknown bpf loader error %d", err); 1662 else 1663 snprintf(buf, size, "%s", 1664 str_error_r(err, sbuf, sizeof(sbuf))); 1665 1666 buf[size - 1] = '\0'; 1667 return -1; 1668} 1669 1670#define bpf__strerror_head(err, buf, size) \ 1671 char sbuf[STRERR_BUFSIZE], *emsg;\ 1672 if (!size)\ 1673 return 0;\ 1674 if (err < 0)\ 1675 err = -err;\ 1676 bpf_loader_strerror(err, sbuf, sizeof(sbuf));\ 1677 emsg = sbuf;\ 1678 switch (err) {\ 1679 default:\ 1680 scnprintf(buf, size, "%s", emsg);\ 1681 break; 1682 1683#define bpf__strerror_entry(val, fmt...)\ 1684 case val: {\ 1685 scnprintf(buf, size, fmt);\ 1686 break;\ 1687 } 1688 1689#define bpf__strerror_end(buf, size)\ 1690 }\ 1691 buf[size - 1] = '\0'; 1692 1693int bpf__strerror_prepare_load(const char *filename, bool source, 1694 int err, char *buf, size_t size) 1695{ 1696 size_t n; 1697 int ret; 1698 1699 n = snprintf(buf, size, "Failed to load %s%s: ", 1700 filename, source ? " from source" : ""); 1701 if (n >= size) { 1702 buf[size - 1] = '\0'; 1703 return 0; 1704 } 1705 buf += n; 1706 size -= n; 1707 1708 ret = bpf_loader_strerror(err, buf, size); 1709 buf[size - 1] = '\0'; 1710 return ret; 1711} 1712 1713int bpf__strerror_probe(struct bpf_object *obj __maybe_unused, 1714 int err, char *buf, size_t size) 1715{ 1716 bpf__strerror_head(err, buf, size); 1717 case BPF_LOADER_ERRNO__PROGCONF_TERM: { 1718 scnprintf(buf, size, "%s (add -v to see detail)", emsg); 1719 break; 1720 } 1721 bpf__strerror_entry(EEXIST, "Probe point exist. Try 'perf probe -d \"*\"' and set 'force=yes'"); 1722 bpf__strerror_entry(EACCES, "You need to be root"); 1723 bpf__strerror_entry(EPERM, "You need to be root, and /proc/sys/kernel/kptr_restrict should be 0"); 1724 bpf__strerror_entry(ENOENT, "You need to check probing points in BPF file"); 1725 bpf__strerror_end(buf, size); 1726 return 0; 1727} 1728 1729int bpf__strerror_load(struct bpf_object *obj, 1730 int err, char *buf, size_t size) 1731{ 1732 bpf__strerror_head(err, buf, size); 1733 case LIBBPF_ERRNO__KVER: { 1734 unsigned int obj_kver = bpf_object__kversion(obj); 1735 unsigned int real_kver; 1736 1737 if (fetch_kernel_version(&real_kver, NULL, 0)) { 1738 scnprintf(buf, size, "Unable to fetch kernel version"); 1739 break; 1740 } 1741 1742 if (obj_kver != real_kver) { 1743 scnprintf(buf, size, 1744 "'version' ("KVER_FMT") doesn't match running kernel ("KVER_FMT")", 1745 KVER_PARAM(obj_kver), 1746 KVER_PARAM(real_kver)); 1747 break; 1748 } 1749 1750 scnprintf(buf, size, "Failed to load program for unknown reason"); 1751 break; 1752 } 1753 bpf__strerror_end(buf, size); 1754 return 0; 1755} 1756 1757int bpf__strerror_config_obj(struct bpf_object *obj __maybe_unused, 1758 struct parse_events_term *term __maybe_unused, 1759 struct evlist *evlist __maybe_unused, 1760 int *error_pos __maybe_unused, int err, 1761 char *buf, size_t size) 1762{ 1763 bpf__strerror_head(err, buf, size); 1764 bpf__strerror_entry(BPF_LOADER_ERRNO__OBJCONF_MAP_TYPE, 1765 "Can't use this config term with this map type"); 1766 bpf__strerror_end(buf, size); 1767 return 0; 1768} 1769 1770int bpf__strerror_apply_obj_config(int err, char *buf, size_t size) 1771{ 1772 bpf__strerror_head(err, buf, size); 1773 bpf__strerror_entry(BPF_LOADER_ERRNO__OBJCONF_MAP_EVTDIM, 1774 "Cannot set event to BPF map in multi-thread tracing"); 1775 bpf__strerror_entry(BPF_LOADER_ERRNO__OBJCONF_MAP_EVTINH, 1776 "%s (Hint: use -i to turn off inherit)", emsg); 1777 bpf__strerror_entry(BPF_LOADER_ERRNO__OBJCONF_MAP_EVTTYPE, 1778 "Can only put raw, hardware and BPF output event into a BPF map"); 1779 bpf__strerror_end(buf, size); 1780 return 0; 1781} 1782 1783int bpf__strerror_setup_output_event(struct evlist *evlist __maybe_unused, 1784 int err, char *buf, size_t size) 1785{ 1786 bpf__strerror_head(err, buf, size); 1787 bpf__strerror_end(buf, size); 1788 return 0; 1789}