10 #include <bpf/libbpf.h> 12 #include <linux/err.h> 13 #include <linux/kernel.h> 14 #include <linux/string.h> 27 #define DEFINE_PRINT_FN(name, level) \ 28 static int libbpf_##name(const char *fmt, ...) \ 33 va_start(args, fmt); \ 34 ret = veprintf(level, verbose, pr_fmt(fmt), args);\ 59 struct bpf_object *obj;
62 libbpf_set_print(libbpf_warning,
68 obj = bpf_object__open_buffer(obj_buf, obj_buf_sz, name);
69 if (IS_ERR_OR_NULL(obj)) {
70 pr_debug(
"bpf: failed to load buffer\n");
71 return ERR_PTR(-EINVAL);
79 struct bpf_object *obj;
82 libbpf_set_print(libbpf_warning,
97 pr_debug(
"bpf: builtin compilation failed: %d, try external compiler\n", err);
102 pr_debug(
"bpf: successfull builtin compilation\n");
103 obj = bpf_object__open_buffer(obj_buf, obj_buf_sz, filename);
110 obj = bpf_object__open(filename);
112 if (IS_ERR_OR_NULL(obj)) {
113 pr_debug(
"bpf: failed to load %s\n", filename);
122 struct bpf_object *obj, *tmp;
124 bpf_object__for_each_safe(obj, tmp) {
126 bpf_object__close(obj);
148 pev->
target = strdup(value);
158 pev->
target = strdup(value);
173 err = strtobool(value, &bool_value);
177 *pbool = invert ? !bool_value : bool_value;
203 .usage =
"exec=<full path of file>",
204 .desc =
"Set uprobe target",
209 .usage =
"module=<module name> ",
210 .desc =
"Set kprobe module",
215 .usage =
"inlines=[yes|no] ",
216 .desc =
"Probe at inline symbol",
221 .usage =
"force=[yes|no] ",
222 .desc =
"Forcibly add events with existing name",
233 pr_debug(
"config bpf program: %s=%s\n", key, value);
238 pr_debug(
"BPF: ERROR: invalid program config option: %s=%s\n",
241 pr_debug(
"\nHint: Valid options are:\n");
253 char *text = strdup(config_str);
255 const char *main_str = NULL;
259 pr_debug(
"Not enough memory: dup config_str failed\n");
260 return ERR_PTR(-ENOMEM);
264 while ((sep = strchr(line,
';'))) {
268 equ = strchr(line,
'=');
270 pr_warning(
"WARNING: invalid config in BPF object: %s\n",
285 main_str = config_str + (line - text);
288 return err ? ERR_PTR(err) : main_str;
298 if (IS_ERR(main_str))
299 return PTR_ERR(main_str);
301 *p_main_str = main_str;
302 if (!strchr(main_str,
'=')) {
304 const char *s = strchr(main_str,
':');
307 pr_debug(
"bpf: '%s' is not a valid tracepoint\n",
319 pr_debug(
"bpf: '%s' is not a valid config string\n",
332 const char *config_str, *main_str;
340 config_str = bpf_program__title(prog,
false);
341 if (IS_ERR(config_str)) {
342 pr_debug(
"bpf: unable to get title for program\n");
343 return PTR_ERR(config_str);
346 priv = calloc(
sizeof(*priv), 1);
348 pr_debug(
"bpf: failed to alloc priv\n");
353 pr_debug(
"bpf: config program '%s'\n", config_str);
359 char *s = strchr(main_str,
':');
362 priv->
sys_name = strndup(main_str, s - main_str);
368 pr_debug(
"bpf: '%s': group for event is set and not '%s'.\n",
372 }
else if (!pev->
group)
382 pr_debug(
"bpf: '%s': event name is missing. Section name should be 'key=value'\n",
387 pr_debug(
"bpf: config '%s' is ok\n", config_str);
392 pr_debug(
"Failed to set priv for program '%s'\n", config_str);
408 static bool initialized =
false;
421 pr_debug(
"Failed to init_probe_symbol_maps\n");
428 struct bpf_insn *orig_insns,
int orig_insns_cnt,
429 struct bpf_prog_prep_result *res)
434 struct bpf_insn *buf;
435 size_t prologue_cnt = 0;
438 if (IS_ERR(priv) || !priv || priv->
is_tp)
447 for (i = 0; i < pev->
ntevs; i++) {
452 if (i >= pev->
ntevs) {
453 pr_debug(
"Internal error: prologue type %d not found\n", n);
462 BPF_MAXINSNS - orig_insns_cnt);
466 title = bpf_program__title(prog,
false);
470 pr_debug(
"Failed to generate prologue for program %s\n",
475 memcpy(&buf[prologue_cnt], orig_insns,
476 sizeof(
struct bpf_insn) * orig_insns_cnt);
478 res->new_insn_ptr = buf;
479 res->new_insn_cnt = prologue_cnt + orig_insns_cnt;
484 pr_debug(
"Internal error in preproc_gen_prologue\n");
504 for (i = 0; i < tev1->
nargs; i++) {
508 arg1 = &tev1->
args[i];
509 arg2 = &tev2->
args[i];
518 while (ref1 && ref2) {
528 return ref2 ? 1 : -1;
545 size_t array_sz =
sizeof(*ptevs) * pev->
ntevs;
549 pr_debug(
"Not enough memory: alloc ptevs failed\n");
554 for (i = 0; i < pev->
ntevs; i++)
555 ptevs[i] = &pev->
tevs[i];
557 qsort(ptevs, pev->
ntevs,
sizeof(*ptevs),
560 for (i = 0; i < pev->
ntevs; i++) {
563 n = ptevs[i] - pev->
tevs;
566 pr_debug(
"mapping[%d]=%d\n", n, type);
575 pr_debug(
"mapping[%d]=%d\n", n, mapping[n]);
578 *nr_types = type + 1;
590 if (IS_ERR(priv) || !priv) {
591 pr_debug(
"Internal error when hook preprocessor\n");
601 for (i = 0; i < pev->
ntevs; i++) {
604 if (tev->
nargs > 0) {
605 need_prologue =
true;
614 if (!need_prologue) {
622 pr_debug(
"Not enough memory: alloc insns_buf failed\n");
628 pr_debug(
"Not enough memory: alloc type_mapping failed\n");
632 sizeof(
int) * pev->
ntevs);
638 err = bpf_program__set_prep(prog, priv->
nr_types,
646 struct bpf_program *
prog;
652 pr_debug(
"bpf__prepare_probe failed\n");
656 bpf_object__for_each_program(prog, obj) {
661 priv = bpf_program__priv(prog);
662 if (IS_ERR(priv) || !priv) {
668 bpf_program__set_tracepoint(prog);
672 bpf_program__set_kprobe(prog);
677 pr_debug(
"bpf_probe: failed to convert perf probe events\n");
683 pr_debug(
"bpf_probe: failed to apply perf probe events\n");
700 return err < 0 ?
err : 0;
703 #define EVENTS_WRITE_BUFSIZE 4096 707 struct bpf_program *
prog;
709 bpf_object__for_each_program(prog, obj) {
713 if (IS_ERR(priv) || !priv || priv->
is_tp)
716 for (i = 0; i < priv->
pev.
ntevs; i++) {
727 pr_debug(
"Failed to create filter for unprobing\n");
735 pr_debug(
"Failed to delete %s\n", name_buf);
748 err = bpf_object__load(obj);
750 pr_debug(
"bpf: load objects failed\n");
760 struct bpf_program *
prog;
763 bpf_object__for_each_program(prog, obj) {
769 if (IS_ERR(priv) || !priv) {
770 pr_debug(
"bpf: failed to get private field\n");
775 fd = bpf_program__fd(prog);
778 pr_debug(
"bpf: tracepoint call back failed, stop iterate\n");
785 for (i = 0; i < pev->
ntevs; i++) {
791 fd = bpf_program__nth_fd(prog, type);
793 fd = bpf_program__fd(prog);
797 pr_debug(
"bpf: failed to get file descriptor\n");
801 err = (*func)(tev->
group, tev->
event, fd, arg);
803 pr_debug(
"bpf: call back failed, stop iterate\n");
822 struct list_head list;
835 struct list_head ops_list;
841 if (!list_empty(&op->
list))
853 list_for_each_entry_safe(pos, n, &priv->
ops_list,
list) {
854 list_del_init(&pos->
list);
882 pr_debug(
"Not enough memory to alloc indices for map\n");
899 pr_debug(
"Failed to alloc bpf_map_op\n");
900 return ERR_PTR(-ENOMEM);
902 INIT_LIST_HEAD(&op->
list);
917 newop = memdup(op,
sizeof(*op));
919 pr_debug(
"Failed to alloc bpf_map_op\n");
923 INIT_LIST_HEAD(&newop->
list);
930 pr_debug(
"Failed to alloc indices for map\n");
945 newpriv =
zalloc(
sizeof(*newpriv));
947 pr_debug(
"Not enough memory to alloc map private\n");
967 const char *map_name = bpf_map__name(map);
971 pr_debug(
"Failed to get private from map %s\n", map_name);
972 return PTR_ERR(priv);
976 priv =
zalloc(
sizeof(*priv));
978 pr_debug(
"Not enough memory to alloc map private\n");
1006 return ERR_PTR(err);
1016 const char *map_name = bpf_map__name(map);
1017 const struct bpf_map_def *def = bpf_map__def(map);
1020 pr_debug(
"Unable to get map definition from '%s'\n",
1026 pr_debug(
"Map %s type is not BPF_MAP_TYPE_ARRAY\n",
1030 if (def->
key_size <
sizeof(
unsigned int)) {
1031 pr_debug(
"Map %s has incorrect key size\n", map_name);
1041 pr_debug(
"Map %s has incorrect value size\n", map_name);
1059 pr_debug(
"Config value not set\n");
1064 pr_debug(
"ERROR: wrong value type for 'value'\n");
1079 const char *map_name = bpf_map__name(map);
1083 pr_debug(
"Event (for '%s') '%s' doesn't exist\n",
1084 map_name, term->
val.
str);
1088 def = bpf_map__def(map);
1090 pr_debug(
"Unable to get map definition from '%s'\n",
1092 return PTR_ERR(def);
1099 if (def->
type != BPF_MAP_TYPE_PERF_EVENT_ARRAY) {
1100 pr_debug(
"Map %s type is not BPF_MAP_TYPE_PERF_EVENT_ARRAY\n",
1119 pr_debug(
"Config value not set\n");
1124 pr_debug(
"ERROR: wrong value type for 'event'\n");
1144 struct bpf_map *
map,
1145 const char *map_name)
1154 pr_debug(
"ERROR: map %s: array->nr_ranges is %d but range array is NULL\n",
1159 def = bpf_map__def(map);
1161 pr_debug(
"ERROR: Unable to get map definition from '%s'\n",
1166 for (i = 0; i < array->
nr_ranges; i++) {
1169 unsigned int idx = start + length - 1;
1172 pr_debug(
"ERROR: index %d too large\n", idx);
1186 char *map_name = strdup(term->
config +
sizeof(
"map:") - 1);
1187 struct bpf_map *
map;
1195 map_opt = strchr(map_name,
'.');
1197 pr_debug(
"ERROR: Invalid map config: %s\n", map_name);
1202 if (*map_opt ==
'\0') {
1207 map = bpf_object__find_map_by_name(obj, map_name);
1209 pr_debug(
"ERROR: Map %s doesn't exist\n", map_name);
1214 *key_scan_pos += strlen(map_opt);
1218 *key_scan_pos -= strlen(map_opt);
1220 for (i = 0; i < ARRAY_SIZE(bpf_obj_config__map_funcs); i++) {
1222 &bpf_obj_config__map_funcs[i];
1224 if (strcmp(map_opt, func->
config_opt) == 0) {
1230 pr_debug(
"ERROR: Invalid map config option '%s'\n", map_opt);
1235 key_scan_pos += strlen(map_opt);
1244 int key_scan_pos = 0;
1247 if (!obj || !term || !term->
config)
1250 if (strstarts(term->
config,
"map:")) {
1251 key_scan_pos =
sizeof(
"map:") - 1;
1258 *error_pos = key_scan_pos;
1266 void *pkey,
void *arg);
1270 void *arg,
const char *
name,
1278 err =
func(name, map_fd, pdef, op, &i, arg);
1280 pr_debug(
"ERROR: failed to insert value to %s[%u]\n",
1290 const char *
name,
int map_fd,
1301 for (j = 0; j < length; j++) {
1302 unsigned int idx = start + j;
1304 err =
func(name, map_fd, pdef, op, &idx, arg);
1306 pr_debug(
"ERROR: failed to insert value to %s[%u]\n",
1323 const char *
name = bpf_map__name(map);
1327 pr_debug(
"ERROR: failed to get private from map %s\n", name);
1330 if (!priv || list_empty(&priv->
ops_list)) {
1331 pr_debug(
"INFO: nothing to config for map %s\n", name);
1335 def = bpf_map__def(map);
1337 pr_debug(
"ERROR: failed to get definition from map %s\n", name);
1340 map_fd = bpf_map__fd(map);
1342 pr_debug(
"ERROR: failed to get fd from map %s\n", name);
1346 list_for_each_entry(op, &priv->
ops_list, list) {
1347 switch (def->
type) {
1349 case BPF_MAP_TYPE_PERF_EVENT_ARRAY:
1361 pr_debug(
"ERROR: keytype for map '%s' invalid\n",
1369 pr_debug(
"ERROR: type of '%s' incorrect\n", name);
1379 size_t val_size, u64 val)
1385 u8 _val = (u8)(val);
1390 u16 _val = (u16)(val);
1395 u32 _val = (u32)(val);
1404 pr_debug(
"ERROR: invalid value size\n");
1417 struct perf_event_attr *
attr;
1419 bool check_pass =
false;
1424 pr_debug(
"ERROR: evsel not ready for map %s\n", name);
1429 pr_debug(
"ERROR: Dimension of target event is incorrect for map %s\n",
1434 attr = &evsel->
attr;
1435 if (attr->inherit) {
1436 pr_debug(
"ERROR: Can't put inherit event into map %s\n", name);
1442 if (attr->type == PERF_TYPE_RAW)
1444 if (attr->type == PERF_TYPE_HARDWARE)
1447 pr_debug(
"ERROR: Event type is wrong for map %s\n", name);
1452 key = *((
unsigned int *)pkey);
1453 if (key >= events) {
1454 pr_debug(
"ERROR: there is no event %d for map %s\n",
1469 void *pkey,
void *arg __maybe_unused)
1484 pr_debug(
"ERROR: unknown value type for '%s'\n", name);
1501 struct bpf_map *
map;
1504 bpf_map__for_each(map, obj) {
1514 struct bpf_object *obj, *tmp;
1517 bpf_object__for_each_safe(obj, tmp) {
1526 #define bpf__for_each_map(pos, obj, objtmp) \ 1527 bpf_object__for_each_safe(obj, objtmp) \ 1528 bpf_map__for_each(pos, obj) 1530 #define bpf__for_each_stdout_map(pos, obj, objtmp) \ 1531 bpf__for_each_map(pos, obj, objtmp) \ 1532 if (bpf_map__name(pos) && \ 1533 (strcmp("__bpf_stdout__", \ 1534 bpf_map__name(pos)) == 0)) 1539 struct bpf_object *obj, *tmp;
1541 struct bpf_map *
map;
1543 bool need_init =
false;
1555 if (!need_init && !priv)
1557 if (!tmpl_priv && priv)
1565 err =
parse_events(evlist,
"bpf-output/no-inherit=1,name=__bpf_stdout__/",
1568 pr_debug(
"ERROR: failed to create bpf-output event\n");
1607 #define ERRNO_OFFSET(e) ((e) - __BPF_LOADER_ERRNO__START) 1608 #define ERRCODE_OFFSET(c) ERRNO_OFFSET(BPF_LOADER_ERRNO__##c) 1609 #define NR_ERRNO (__BPF_LOADER_ERRNO__END - __BPF_LOADER_ERRNO__START) 1614 [
ERRCODE_OFFSET(EVENTNAME)] =
"No event name found in config string",
1616 [
ERRCODE_OFFSET(COMPILE)] =
"Error when compiling BPF scriptlet",
1617 [
ERRCODE_OFFSET(PROGCONF_TERM)] =
"Invalid program config term in config string",
1620 [
ERRCODE_OFFSET(PROLOGUEOOB)] =
"Offset out of bound for prologue",
1622 [
ERRCODE_OFFSET(OBJCONF_CONF)] =
"Config value not set (missing '=')",
1623 [
ERRCODE_OFFSET(OBJCONF_MAP_OPT)] =
"Invalid object map config option",
1624 [
ERRCODE_OFFSET(OBJCONF_MAP_NOTEXIST)] =
"Target map doesn't exist",
1625 [
ERRCODE_OFFSET(OBJCONF_MAP_VALUE)] =
"Incorrect value type for map",
1627 [
ERRCODE_OFFSET(OBJCONF_MAP_KEYSIZE)] =
"Incorrect map key size",
1628 [
ERRCODE_OFFSET(OBJCONF_MAP_VALUESIZE)] =
"Incorrect map value size",
1629 [
ERRCODE_OFFSET(OBJCONF_MAP_NOEVT)] =
"Event not found for map setting",
1630 [
ERRCODE_OFFSET(OBJCONF_MAP_MAPSIZE)] =
"Invalid map size for event setting",
1631 [
ERRCODE_OFFSET(OBJCONF_MAP_EVTDIM)] =
"Event dimension too large",
1632 [
ERRCODE_OFFSET(OBJCONF_MAP_EVTINH)] =
"Doesn't support inherit event",
1633 [
ERRCODE_OFFSET(OBJCONF_MAP_EVTTYPE)] =
"Wrong event type for map",
1646 err = err > 0 ?
err : -
err;
1648 if (err >= __LIBBPF_ERRNO__START)
1649 return libbpf_strerror(err, buf, size);
1653 snprintf(buf, size,
"%s", msg);
1654 buf[size - 1] =
'\0';
1659 snprintf(buf, size,
"Unknown bpf loader error %d", err);
1661 snprintf(buf, size,
"%s",
1662 str_error_r(err, sbuf,
sizeof(sbuf)));
1664 buf[size - 1] =
'\0';
1668 #define bpf__strerror_head(err, buf, size) \ 1669 char sbuf[STRERR_BUFSIZE], *emsg;\ 1674 bpf_loader_strerror(err, sbuf, sizeof(sbuf));\ 1678 scnprintf(buf, size, "%s", emsg);\ 1681 #define bpf__strerror_entry(val, fmt...)\ 1683 scnprintf(buf, size, fmt);\ 1687 #define bpf__strerror_end(buf, size)\ 1689 buf[size - 1] = '\0'; 1692 int err,
char *buf,
size_t size)
1697 n = snprintf(buf, size,
"Failed to load %s%s: ",
1698 filename, source ?
" from source" :
"");
1700 buf[size - 1] =
'\0';
1707 buf[size - 1] =
'\0';
1712 int err,
char *buf,
size_t size)
1716 scnprintf(buf, size,
"%s (add -v to see detail)", emsg);
1719 bpf__strerror_entry(EEXIST,
"Probe point exist. Try 'perf probe -d \"*\"' and set 'force=yes'");
1721 bpf__strerror_entry(EPERM,
"You need to be root, and /proc/sys/kernel/kptr_restrict should be 0");
1728 int err,
char *buf,
size_t size)
1731 case LIBBPF_ERRNO__KVER: {
1732 unsigned int obj_kver = bpf_object__kversion(obj);
1733 unsigned int real_kver;
1736 scnprintf(buf, size,
"Unable to fetch kernel version");
1740 if (obj_kver != real_kver) {
1741 scnprintf(buf, size,
1748 scnprintf(buf, size,
"Failed to load program for unknown reason");
1758 int *error_pos __maybe_unused,
int err,
1759 char *buf,
size_t size)
1763 "Can't use this config term with this map type");
1772 "Cannot set event to BPF map in multi-thread tracing");
1774 "%s (Hint: use -i to turn off inherit)", emsg);
1776 "Can only put raw, hardware and BPF output event into a BPF map");
1782 int err,
char *buf,
size_t size)
void parse_events__clear_array(struct parse_events_array *a)
int fetch_kernel_version(unsigned int *puint, char *str, size_t str_size)
static const char * parse_prog_config_kvpair(const char *config_str, struct perf_probe_event *pev)
int del_perf_probe_events(struct strfilter *filter)
struct perf_probe_event events[MAX_PROBES]
int bpf__strerror_setup_stdout(struct perf_evlist *evlist __maybe_unused, int err, char *buf, size_t size)
struct strfilter * strfilter__new(const char *rules, const char **err)
static bool libbpf_initialized
static int bpf_loader_strerror(int err, char *buf, size_t size)
static int bpf__prepare_probe(void)
static int parse_prog_config(const char *config_str, const char **p_main_str, bool *is_tp, struct perf_probe_event *pev)
static void bpf_map_priv__purge(struct bpf_map_priv *priv)
int bpf__strerror_probe(struct bpf_object *obj __maybe_unused, int err, char *buf, size_t size)
static void * xyarray__entry(struct xyarray *xy, int x, int y)
int init_probe_symbol_maps(bool user_only)
static bool perf_evsel__is_bpf_output(struct perf_evsel *evsel)
int bpf__config_obj(struct bpf_object *obj, struct parse_events_term *term, struct perf_evlist *evlist, int *error_pos)
static struct bpf_map_priv * bpf_map_priv__clone(struct bpf_map_priv *priv)
static int prog_config__exec(const char *value, struct perf_probe_event *pev)
void perf_clang__cleanup(void)
#define ERRCODE_OFFSET(c)
int bpf__probe(struct bpf_object *obj)
struct parse_events_array array
static int foreach_key_array_all(map_config_func_t func, void *arg, const char *name, int map_fd, const struct bpf_map_def *pdef, struct bpf_map_op *op)
enum bpf_map_op_type op_type
#define bpf__strerror_end(buf, size)
struct bpf_obj_config__map_func bpf_obj_config__map_funcs[]
void cleanup_perf_probe_events(struct perf_probe_event *pevs, int npevs)
static struct bpf_map_op * bpf_map_op__new(struct parse_events_term *term)
static int bpf_map__config_event(struct bpf_map *map, struct parse_events_term *term, struct perf_evlist *evlist)
static int term(yyscan_t scanner, int type)
static int map_prologue(struct perf_probe_event *pev, int *mapping, int *nr_types)
int bpf__strerror_config_obj(struct bpf_object *obj __maybe_unused, struct parse_events_term *term __maybe_unused, struct perf_evlist *evlist __maybe_unused, int *error_pos __maybe_unused, int err, char *buf, size_t size)
x86 movsq based memset() in arch/x86/lib/memset_64.S") MEMSET_FN(memset_erms
int apply_perf_probe_events(struct perf_probe_event *pevs, int npevs)
int bpf__strerror_load(struct bpf_object *obj, int err, char *buf, size_t size)
union parse_events_term::@132 val
#define DEFINE_PRINT_FN(name, level)
int bpf__strerror_apply_obj_config(int err, char *buf, size_t size)
struct probe_trace_event * tevs
static int apply_obj_config_map_for_key(const char *name, int map_fd, const struct bpf_map_def *pdef, struct bpf_map_op *op, void *pkey, void *arg __maybe_unused)
int parse_events(struct perf_evlist *evlist, const char *str, struct parse_events_error *err)
struct parse_events_array array
static int prog_config__force(const char *value, struct perf_probe_event *pev __maybe_unused)
#define EVENTS_WRITE_BUFSIZE
enum bpf_map_key_type key_type
#define BPF_MAP_TYPE_ARRAY
static int config_map_indices_range_check(struct parse_events_term *term, struct bpf_map *map, const char *map_name)
struct probe_trace_arg_ref * next
struct bpf_object * bpf__prepare_load(const char *filename, bool source)
void strfilter__delete(struct strfilter *filter)
static int hook_load_preprocessor(struct bpf_program *prog)
static void bpf_map_priv__clear(struct bpf_map *map __maybe_unused, void *_priv)
#define pr_debug(fmt,...)
int bpf__foreach_event(struct bpf_object *obj, bpf_prog_iter_callback_t func, void *arg)
static int apply_obj_config_object(struct bpf_object *obj)
static void bpf_map_op__delete(struct bpf_map_op *op)
int convert_perf_probe_events(struct perf_probe_event *pevs, int npevs)
void clear_perf_probe_event(struct perf_probe_event *pev)
static int bpf_map__add_op(struct bpf_map *map, struct bpf_map_op *op)
static void clear_prog_priv(struct bpf_program *prog __maybe_unused, void *_priv)
static int config_bpf_program(struct bpf_program *prog)
#define bpf__strerror_head(err, buf, size)
struct perf_evsel * evsel
int(* bpf_prog_iter_callback_t)(const char *group, const char *event, int fd, void *arg)
static struct bpf_map_op * bpf_map__add_newop(struct bpf_map *map, struct parse_events_term *term)
int bpf__load(struct bpf_object *obj)
#define bpf__for_each_stdout_map(pos, obj, objtmp)
static int apply_obj_config_map(struct bpf_map *map)
struct bpf_object * bpf__prepare_load_buffer(void *obj_buf, size_t obj_buf_sz, const char *name)
int bpf__strerror_prepare_load(const char *filename, bool source, int err, char *buf, size_t size)
static int prog_config__module(const char *value, struct perf_probe_event *pev)
int bpf__apply_obj_config(void)
#define PERF_BPF_PROBE_GROUP
struct probe_trace_arg * args
static struct bpf_map_op * bpf_map_op__clone(struct bpf_map_op *op)
static int __bpf_map__config_event(struct bpf_map *map, struct parse_events_term *term, struct perf_evlist *evlist)
static int do_prog_config(const char *key, const char *value, struct perf_probe_event *pev)
struct bpf_insn * insns_buf
x86 movsq based memcpy() in arch/x86/lib/memcpy_64.S") MEMCPY_FN(memcpy_erms
static int bpf_map_op_setkey(struct bpf_map_op *op, struct parse_events_term *term)
int bpf__gen_prologue(struct probe_trace_arg *args, int nargs, struct bpf_insn *new_prog, size_t *new_cnt, size_t cnt_space)
int bpf__unprobe(struct bpf_object *obj)
int(* config_func)(struct bpf_map *, struct parse_events_term *, struct perf_evlist *)
static int compare_tev_args(const void *ptev1, const void *ptev2)
int(* map_config_func_t)(const char *name, int map_fd, const struct bpf_map_def *pdef, struct bpf_map_op *op, void *pkey, void *arg)
static int prog_config__bool(const char *value, bool *pbool, bool invert)
static struct @43 bpf_prog_config_terms[]
int bpf__setup_stdout(struct perf_evlist *evlist)
static void *(* bpf_map_update_elem)(void *map, void *key, void *value, int flags)
int parse_perf_probe_command(const char *cmd, struct perf_probe_event *pev)
int(* func)(const char *, struct perf_probe_event *)
static int prog_config__inlines(const char *value, struct perf_probe_event *pev __maybe_unused)
static const char * bpf_loader_strerror_table[NR_ERRNO]
int llvm__compile_bpf(const char *path, void **p_obj_buf, size_t *p_obj_buf_sz)
static int bpf_map_config_foreach_key(struct bpf_map *map, map_config_func_t func, void *arg)
static int __bpf_map__config_value(struct bpf_map *map, struct parse_events_term *term)
#define bpf__strerror_entry(val, fmt...)
static int bpf_map__config_value(struct bpf_map *map, struct parse_events_term *term, struct perf_evlist *evlist __maybe_unused)
struct perf_probe_event pev
static struct perf_evsel * perf_evlist__last(struct perf_evlist *evlist)
struct list_head ops_list
void llvm__dump_obj(const char *path, void *obj_buf, size_t size)
static int preproc_gen_prologue(struct bpf_program *prog, int n, struct bpf_insn *orig_insns, int orig_insns_cnt, struct bpf_prog_prep_result *res)
static int foreach_key_array_ranges(map_config_func_t func, void *arg, const char *name, int map_fd, const struct bpf_map_def *pdef, struct bpf_map_op *op)
#define pr_warning(fmt,...)
int perf_clang__compile_bpf(const char *filename, void **p_obj_buf, size_t *p_obj_buf_sz)
static int bpf__obj_config_map(struct bpf_object *obj, struct parse_events_term *term, struct perf_evlist *evlist, int *key_scan_pos)
static int apply_config_value_for_key(int map_fd, void *pkey, size_t val_size, u64 val)
struct perf_evsel * perf_evlist__find_evsel_by_str(struct perf_evlist *evlist, const char *str)
struct perf_event_attr attr
struct parse_events_array::@131 * ranges
void perf_clang__init(void)
void static void * zalloc(size_t size)
static int apply_config_evsel_for_key(const char *name, int map_fd, void *pkey, struct perf_evsel *evsel)
struct probe_trace_arg_ref * ref