Lines Matching +full:cpu +full:- +full:nr

1 // SPDX-License-Identifier: GPL-2.0
35 #include "trace-event.h"
44 #include "build-id.h"
50 #include "time-utils.h"
54 #include "bpf-event.h"
55 #include "bpf-utils.h"
62 #include <event-parse.h>
89 __set_bit(feat, header->adds_features); in perf_header__set_feat()
94 __clear_bit(feat, header->adds_features); in perf_header__clear_feat()
99 return test_bit(feat, header->adds_features); in perf_header__has_feat()
104 ssize_t ret = writen(ff->fd, buf, size); in __do_write_fd()
107 return ret < 0 ? (int)ret : -1; in __do_write_fd()
114 const size_t max_size = 0xffff - sizeof(struct perf_event_header); in __do_write_buf()
115 size_t new_size = ff->size; in __do_write_buf()
118 if (size + ff->offset > max_size) in __do_write_buf()
119 return -E2BIG; in __do_write_buf()
121 while (size > (new_size - ff->offset)) in __do_write_buf()
125 if (ff->size < new_size) { in __do_write_buf()
126 addr = realloc(ff->buf, new_size); in __do_write_buf()
128 return -ENOMEM; in __do_write_buf()
129 ff->buf = addr; in __do_write_buf()
130 ff->size = new_size; in __do_write_buf()
133 memcpy(ff->buf + ff->offset, buf, size); in __do_write_buf()
134 ff->offset += size; in __do_write_buf()
139 /* Return: 0 if succeeded, -ERR if failed. */
142 if (!ff->buf) in do_write()
147 /* Return: 0 if succeeded, -ERR if failed. */
166 /* Return: 0 if succeeded, -ERR if failed. */
174 err = do_write(ff, zero_buf, count_aligned - count); in write_padded()
182 /* Return: 0 if succeeded, -ERR if failed. */
201 ssize_t ret = readn(ff->fd, addr, size); in __do_read_fd()
204 return ret < 0 ? (int)ret : -1; in __do_read_fd()
210 if (size > (ssize_t)ff->size - ff->offset) in __do_read_buf()
211 return -1; in __do_read_buf()
213 memcpy(addr, ff->buf + ff->offset, size); in __do_read_buf()
214 ff->offset += size; in __do_read_buf()
222 if (!ff->buf) in __do_read()
235 if (ff->ph->needs_swap) in do_read_u32()
248 if (ff->ph->needs_swap) in do_read_u64()
278 /* Return: 0 if succeeded, -ERR if failed. */
291 return -ENOMEM; in do_read_bitmap()
312 if (WARN(ff->buf, "Error: calling %s in pipe-mode.\n", __func__)) in write_tracing_data()
313 return -1; in write_tracing_data()
315 return read_tracing_data(ff->fd, &evlist->core.entries); in write_tracing_data()
325 session = container_of(ff->ph, struct perf_session, header); in write_build_id()
328 return -1; in write_build_id()
330 if (WARN(ff->buf, "Error: calling %s in pipe-mode.\n", __func__)) in write_build_id()
331 return -1; in write_build_id()
351 return -1; in write_hostname()
364 return -1; in write_osrelease()
377 return -1; in write_arch()
395 int ret = -1; in __write_cpudesc()
398 return -1; in __write_cpudesc()
402 return -1; in __write_cpudesc()
411 ret = -1; in __write_cpudesc()
447 #define CPUINFO_PROC { "cpu", } in write_cpudesc()
451 #define CPUINFO_PROC { "cpu type", } in write_cpudesc()
453 #define CPUINFO_PROC { "cpu model", } in write_cpudesc()
475 return -1; in write_cpudesc()
482 long nr; in write_nrcpus() local
486 nrc = cpu__max_present_cpu().cpu; in write_nrcpus()
488 nr = sysconf(_SC_NPROCESSORS_ONLN); in write_nrcpus()
489 if (nr < 0) in write_nrcpus()
490 return -1; in write_nrcpus()
492 nra = (u32)(nr & UINT_MAX); in write_nrcpus()
508 nre = evlist->core.nr_entries; in write_event_desc()
520 sz = (u32)sizeof(evsel->core.attr); in write_event_desc()
526 ret = do_write(ff, &evsel->core.attr, sz); in write_event_desc()
536 nri = evsel->core.ids; in write_event_desc()
550 ret = do_write(ff, evsel->core.id, evsel->core.ids * sizeof(u64)); in write_event_desc()
595 return -1; in write_cpu_topology()
597 ret = do_write(ff, &tp->package_cpus_lists, sizeof(tp->package_cpus_lists)); in write_cpu_topology()
601 for (i = 0; i < tp->package_cpus_lists; i++) { in write_cpu_topology()
602 ret = do_write_string(ff, tp->package_cpus_list[i]); in write_cpu_topology()
606 ret = do_write(ff, &tp->core_cpus_lists, sizeof(tp->core_cpus_lists)); in write_cpu_topology()
610 for (i = 0; i < tp->core_cpus_lists; i++) { in write_cpu_topology()
611 ret = do_write_string(ff, tp->core_cpus_list[i]); in write_cpu_topology()
621 ret = do_write(ff, &perf_env.cpu[j].core_id, in write_cpu_topology()
622 sizeof(perf_env.cpu[j].core_id)); in write_cpu_topology()
625 ret = do_write(ff, &perf_env.cpu[j].socket_id, in write_cpu_topology()
626 sizeof(perf_env.cpu[j].socket_id)); in write_cpu_topology()
631 if (!tp->die_cpus_lists) in write_cpu_topology()
634 ret = do_write(ff, &tp->die_cpus_lists, sizeof(tp->die_cpus_lists)); in write_cpu_topology()
638 for (i = 0; i < tp->die_cpus_lists; i++) { in write_cpu_topology()
639 ret = do_write_string(ff, tp->die_cpus_list[i]); in write_cpu_topology()
645 ret = do_write(ff, &perf_env.cpu[j].die_id, in write_cpu_topology()
646 sizeof(perf_env.cpu[j].die_id)); in write_cpu_topology()
664 int ret = -1, n; in write_total_mem()
669 return -1; in write_total_mem()
681 ret = -1; in write_total_mem()
691 int ret = -1; in write_numa_topology()
696 return -ENOMEM; in write_numa_topology()
698 ret = do_write(ff, &tp->nr, sizeof(u32)); in write_numa_topology()
702 for (i = 0; i < tp->nr; i++) { in write_numa_topology()
703 struct numa_topology_node *n = &tp->nodes[i]; in write_numa_topology()
705 ret = do_write(ff, &n->node, sizeof(u32)); in write_numa_topology()
709 ret = do_write(ff, &n->mem_total, sizeof(u64)); in write_numa_topology()
713 ret = do_write(ff, &n->mem_free, sizeof(u64)); in write_numa_topology()
717 ret = do_write_string(ff, n->cpus); in write_numa_topology()
760 ret = do_write(ff, &pmu->type, sizeof(pmu->type)); in write_pmu_mappings()
764 ret = do_write_string(ff, pmu->name); in write_pmu_mappings()
796 if (evsel__is_group_leader(evsel) && evsel->core.nr_members > 1) { in write_group_desc()
797 const char *name = evsel->group_name ?: "{anon_group}"; in write_group_desc()
798 u32 leader_idx = evsel->core.idx; in write_group_desc()
799 u32 nr_members = evsel->core.nr_members; in write_group_desc()
818 * Return the CPU id as a raw string.
823 char * __weak get_cpuid_str(struct perf_cpu cpu __maybe_unused) in get_cpuid_str()
828 char *get_cpuid_allow_env_override(struct perf_cpu cpu) in get_cpuid_allow_env_override() argument
837 cpuid = get_cpuid_str(cpu); in get_cpuid_allow_env_override()
850 * Otherwise return non-zero.
867 size_t match_len = (pmatch[0].rm_eo - pmatch[0].rm_so); in strcmp_cpuid_str()
881 struct perf_cpu cpu __maybe_unused) in get_cpuid()
888 struct perf_cpu cpu = perf_cpu_map__min(evlist->core.all_cpus); in write_cpuid() local
892 ret = get_cpuid(buffer, sizeof(buffer), cpu); in write_cpuid()
894 return -1; in write_cpuid()
911 if (WARN(ff->buf, "Error: calling %s in pipe-mode.\n", __func__)) in write_auxtrace()
912 return -1; in write_auxtrace()
914 session = container_of(ff->ph, struct perf_session, header); in write_auxtrace()
916 err = auxtrace_index__write(ff->fd, &session->auxtrace_index); in write_auxtrace()
925 return do_write(ff, &ff->ph->env.clock.clockid_res_ns, in write_clockid()
926 sizeof(ff->ph->env.clock.clockid_res_ns)); in write_clockid()
944 data32 = ff->ph->env.clock.clockid; in write_clock_data()
951 data64 = &ff->ph->env.clock.tod_ns; in write_clock_data()
958 data64 = &ff->ph->env.clock.clockid_ns; in write_clock_data()
972 return -ENOENT; in write_hybrid_topology()
974 ret = do_write(ff, &tp->nr, sizeof(u32)); in write_hybrid_topology()
978 for (i = 0; i < tp->nr; i++) { in write_hybrid_topology()
979 struct hybrid_topology_node *n = &tp->nodes[i]; in write_hybrid_topology()
981 ret = do_write_string(ff, n->pmu_name); in write_hybrid_topology()
985 ret = do_write_string(ff, n->cpus); in write_hybrid_topology()
1003 session = container_of(ff->ph, struct perf_session, header); in write_dir_format()
1004 data = session->data; in write_dir_format()
1007 return -1; in write_dir_format()
1009 return do_write(ff, &data->dir.version, sizeof(data->dir.version)); in write_dir_format()
1016 struct perf_env *env = &ff->ph->env; in write_bpf_prog_info()
1021 down_read(&env->bpf_progs.lock); in write_bpf_prog_info()
1023 ret = do_write(ff, &env->bpf_progs.infos_cnt, in write_bpf_prog_info()
1024 sizeof(env->bpf_progs.infos_cnt)); in write_bpf_prog_info()
1028 root = &env->bpf_progs.infos; in write_bpf_prog_info()
1035 next = rb_next(&node->rb_node); in write_bpf_prog_info()
1037 node->info_linear->data_len; in write_bpf_prog_info()
1040 bpil_addr_to_offs(node->info_linear); in write_bpf_prog_info()
1041 ret = do_write(ff, node->info_linear, len); in write_bpf_prog_info()
1046 bpil_offs_to_addr(node->info_linear); in write_bpf_prog_info()
1051 up_read(&env->bpf_progs.lock); in write_bpf_prog_info()
1058 struct perf_env *env = &ff->ph->env; in write_bpf_btf()
1063 down_read(&env->bpf_progs.lock); in write_bpf_btf()
1065 ret = do_write(ff, &env->bpf_progs.btfs_cnt, in write_bpf_btf()
1066 sizeof(env->bpf_progs.btfs_cnt)); in write_bpf_btf()
1071 root = &env->bpf_progs.btfs; in write_bpf_btf()
1077 next = rb_next(&node->rb_node); in write_bpf_btf()
1078 ret = do_write(ff, &node->id, in write_bpf_btf()
1079 sizeof(u32) * 2 + node->data_size); in write_bpf_btf()
1084 up_read(&env->bpf_progs.lock); in write_bpf_btf()
1094 return cache_a->level - cache_b->level; in cpu_cache_level__sort()
1099 if (a->level != b->level) in cpu_cache_level__cmp()
1102 if (a->line_size != b->line_size) in cpu_cache_level__cmp()
1105 if (a->sets != b->sets) in cpu_cache_level__cmp()
1108 if (a->ways != b->ways) in cpu_cache_level__cmp()
1111 if (strcmp(a->type, b->type)) in cpu_cache_level__cmp()
1114 if (strcmp(a->size, b->size)) in cpu_cache_level__cmp()
1117 if (strcmp(a->map, b->map)) in cpu_cache_level__cmp()
1123 static int cpu_cache_level__read(struct cpu_cache_level *cache, u32 cpu, u16 level) in cpu_cache_level__read() argument
1129 scnprintf(path, PATH_MAX, "devices/system/cpu/cpu%d/cache/index%d/", cpu, level); in cpu_cache_level__read()
1136 if (sysfs__read_int(file, (int *) &cache->level)) in cpu_cache_level__read()
1137 return -1; in cpu_cache_level__read()
1140 if (sysfs__read_int(file, (int *) &cache->line_size)) in cpu_cache_level__read()
1141 return -1; in cpu_cache_level__read()
1144 if (sysfs__read_int(file, (int *) &cache->sets)) in cpu_cache_level__read()
1145 return -1; in cpu_cache_level__read()
1148 if (sysfs__read_int(file, (int *) &cache->ways)) in cpu_cache_level__read()
1149 return -1; in cpu_cache_level__read()
1152 if (sysfs__read_str(file, &cache->type, &len)) in cpu_cache_level__read()
1153 return -1; in cpu_cache_level__read()
1155 cache->type[len] = 0; in cpu_cache_level__read()
1156 cache->type = strim(cache->type); in cpu_cache_level__read()
1159 if (sysfs__read_str(file, &cache->size, &len)) { in cpu_cache_level__read()
1160 zfree(&cache->type); in cpu_cache_level__read()
1161 return -1; in cpu_cache_level__read()
1164 cache->size[len] = 0; in cpu_cache_level__read()
1165 cache->size = strim(cache->size); in cpu_cache_level__read()
1168 if (sysfs__read_str(file, &cache->map, &len)) { in cpu_cache_level__read()
1169 zfree(&cache->size); in cpu_cache_level__read()
1170 zfree(&cache->type); in cpu_cache_level__read()
1171 return -1; in cpu_cache_level__read()
1174 cache->map[len] = 0; in cpu_cache_level__read()
1175 cache->map = strim(cache->map); in cpu_cache_level__read()
1181 fprintf(out, "L%d %-15s %8s [%s]\n", c->level, c->type, c->size, c->map); in cpu_cache_level__fprintf()
1185 * Build caches levels for a particular CPU from the data in
1186 * /sys/devices/system/cpu/cpu<cpu>/cache/
1190 int build_caches_for_cpu(u32 cpu, struct cpu_cache_level caches[], u32 *cntp) in build_caches_for_cpu() argument
1199 err = cpu_cache_level__read(&c, cpu, level); in build_caches_for_cpu()
1223 u32 nr, cpu, cnt = 0; in build_caches() local
1225 nr = cpu__max_cpu().cpu; in build_caches()
1227 for (cpu = 0; cpu < nr; cpu++) { in build_caches()
1228 int ret = build_caches_for_cpu(cpu, caches, &cnt); in build_caches()
1240 u32 max_caches = cpu__max_cpu().cpu * MAX_CACHE_LVL; in write_cache()
1263 ret = do_write(ff, &c->v, sizeof(u32)); \ in write_cache()
1274 ret = do_write_string(ff, (const char *) c->v); \ in write_cache()
1301 ret = do_write(ff, &evlist->first_sample_time, in write_sample_time()
1302 sizeof(evlist->first_sample_time)); in write_sample_time()
1306 return do_write(ff, &evlist->last_sample_time, in write_sample_time()
1307 sizeof(evlist->last_sample_time)); in write_sample_time()
1320 if (strcmp(ent->d_name, ".") && \ in memory_node__read()
1321 strcmp(ent->d_name, "..") && \ in memory_node__read()
1322 sscanf(ent->d_name, "memory%u", &mem) == 1) in memory_node__read()
1331 return -1; in memory_node__read()
1340 n->set = bitmap_zalloc(size); in memory_node__read()
1341 if (!n->set) { in memory_node__read()
1343 return -ENOMEM; in memory_node__read()
1346 n->node = idx; in memory_node__read()
1347 n->size = size; in memory_node__read()
1352 __set_bit(phys, n->set); in memory_node__read()
1372 return na->node - nb->node; in memory_node__sort()
1391 return -1; in build_mem_topology()
1398 if (!strcmp(ent->d_name, ".") || in build_mem_topology()
1399 !strcmp(ent->d_name, "..")) in build_mem_topology()
1402 r = sscanf(ent->d_name, "node%u", &idx); in build_mem_topology()
1412 ret = -ENOMEM; in build_mem_topology()
1438 * 0 - version | for future changes
1439 * 8 - block_size_bytes | /sys/devices/system/memory/block_size_bytes
1440 * 16 - count | number of nodes
1445 * 32 - node id | node index
1446 * 40 - size | size of bitmap
1447 * 48 - bitmap | bitmap of memory indexes that belongs to node
1453 u64 bsize, version = 1, i, nr = 0; in write_mem_topology() local
1461 ret = build_mem_topology(&nodes, &nr); in write_mem_topology()
1473 ret = do_write(ff, &nr, sizeof(nr)); in write_mem_topology()
1477 for (i = 0; i < nr; i++) { in write_mem_topology()
1481 ret = do_write(ff, &n->v, sizeof(n->v)); \ in write_mem_topology()
1490 ret = do_write_bitmap(ff, n->set, n->size); in write_mem_topology()
1496 memory_node__delete_nodes(nodes, nr); in write_mem_topology()
1505 ret = do_write(ff, &(ff->ph->env.comp_ver), sizeof(ff->ph->env.comp_ver)); in write_compressed()
1509 ret = do_write(ff, &(ff->ph->env.comp_type), sizeof(ff->ph->env.comp_type)); in write_compressed()
1513 ret = do_write(ff, &(ff->ph->env.comp_level), sizeof(ff->ph->env.comp_level)); in write_compressed()
1517 ret = do_write(ff, &(ff->ph->env.comp_ratio), sizeof(ff->ph->env.comp_ratio)); in write_compressed()
1521 return do_write(ff, &(ff->ph->env.comp_mmap_len), sizeof(ff->ph->env.comp_mmap_len)); in write_compressed()
1530 ret = do_write(ff, &pmu->nr_caps, sizeof(pmu->nr_caps)); in __write_pmu_caps()
1534 list_for_each_entry(caps, &pmu->caps, list) { in __write_pmu_caps()
1535 ret = do_write_string(ff, caps->name); in __write_pmu_caps()
1539 ret = do_write_string(ff, caps->value); in __write_pmu_caps()
1545 ret = do_write_string(ff, pmu->name); in __write_pmu_caps()
1556 struct perf_pmu *cpu_pmu = perf_pmus__find("cpu"); in write_cpu_pmu_caps()
1560 return -ENOENT; in write_cpu_pmu_caps()
1577 if (!strcmp(pmu->name, "cpu")) { in write_pmu_caps()
1579 * The "cpu" PMU is special and covered by in write_pmu_caps()
1603 if (!strcmp(pmu->name, "cpu")) { in write_pmu_caps()
1618 fprintf(fp, "# hostname : %s\n", ff->ph->env.hostname); in print_hostname()
1623 fprintf(fp, "# os release : %s\n", ff->ph->env.os_release); in print_osrelease()
1628 fprintf(fp, "# arch : %s\n", ff->ph->env.arch); in print_arch()
1633 fprintf(fp, "# cpudesc : %s\n", ff->ph->env.cpu_desc); in print_cpudesc()
1638 fprintf(fp, "# nrcpus online : %u\n", ff->ph->env.nr_cpus_online); in print_nrcpus()
1639 fprintf(fp, "# nrcpus avail : %u\n", ff->ph->env.nr_cpus_avail); in print_nrcpus()
1644 fprintf(fp, "# perf version : %s\n", ff->ph->env.version); in print_version()
1649 int nr, i; in print_cmdline() local
1651 nr = ff->ph->env.nr_cmdline; in print_cmdline()
1655 for (i = 0; i < nr; i++) { in print_cmdline()
1656 char *argv_i = strdup(ff->ph->env.cmdline_argv[i]); in print_cmdline()
1658 fprintf(fp, "%s ", ff->ph->env.cmdline_argv[i]); in print_cmdline()
1678 struct perf_header *ph = ff->ph; in print_cpu_topology()
1679 int cpu_nr = ph->env.nr_cpus_avail; in print_cpu_topology()
1680 int nr, i; in print_cpu_topology() local
1683 nr = ph->env.nr_sibling_cores; in print_cpu_topology()
1684 str = ph->env.sibling_cores; in print_cpu_topology()
1686 for (i = 0; i < nr; i++) { in print_cpu_topology()
1691 if (ph->env.nr_sibling_dies) { in print_cpu_topology()
1692 nr = ph->env.nr_sibling_dies; in print_cpu_topology()
1693 str = ph->env.sibling_dies; in print_cpu_topology()
1695 for (i = 0; i < nr; i++) { in print_cpu_topology()
1701 nr = ph->env.nr_sibling_threads; in print_cpu_topology()
1702 str = ph->env.sibling_threads; in print_cpu_topology()
1704 for (i = 0; i < nr; i++) { in print_cpu_topology()
1709 if (ph->env.nr_sibling_dies) { in print_cpu_topology()
1710 if (ph->env.cpu != NULL) { in print_cpu_topology()
1712 fprintf(fp, "# CPU %d: Core ID %d, " in print_cpu_topology()
1714 i, ph->env.cpu[i].core_id, in print_cpu_topology()
1715 ph->env.cpu[i].die_id, in print_cpu_topology()
1716 ph->env.cpu[i].socket_id); in print_cpu_topology()
1721 if (ph->env.cpu != NULL) { in print_cpu_topology()
1723 fprintf(fp, "# CPU %d: Core ID %d, " in print_cpu_topology()
1725 i, ph->env.cpu[i].core_id, in print_cpu_topology()
1726 ph->env.cpu[i].socket_id); in print_cpu_topology()
1736 ff->ph->env.clock.clockid_res_ns * 1000); in print_clockid()
1748 if (!ff->ph->env.clock.enabled) { in print_clock_data()
1754 ref = ff->ph->env.clock.tod_ns; in print_clock_data()
1756 ref -= tod_ns.tv_sec * NSEC_PER_SEC; in print_clock_data()
1760 ref = ff->ph->env.clock.clockid_ns; in print_clock_data()
1762 ref -= clockid_ns.tv_sec * NSEC_PER_SEC; in print_clock_data()
1765 clockid = ff->ph->env.clock.clockid; in print_clock_data()
1787 fprintf(fp, "# hybrid cpu system:\n"); in print_hybrid_topology()
1788 for (i = 0; i < ff->ph->env.nr_hybrid_nodes; i++) { in print_hybrid_topology()
1789 n = &ff->ph->env.hybrid_nodes[i]; in print_hybrid_topology()
1790 fprintf(fp, "# %s cpu list : %s\n", n->pmu_name, n->cpus); in print_hybrid_topology()
1799 session = container_of(ff->ph, struct perf_session, header); in print_dir_format()
1800 data = session->data; in print_dir_format()
1802 fprintf(fp, "# directory data version : %"PRIu64"\n", data->dir.version); in print_dir_format()
1808 struct perf_env *env = &ff->ph->env; in print_bpf_prog_info()
1812 down_read(&env->bpf_progs.lock); in print_bpf_prog_info()
1814 root = &env->bpf_progs.infos; in print_bpf_prog_info()
1821 next = rb_next(&node->rb_node); in print_bpf_prog_info()
1823 __bpf_event__print_bpf_prog_info(&node->info_linear->info, in print_bpf_prog_info()
1827 up_read(&env->bpf_progs.lock); in print_bpf_prog_info()
1832 struct perf_env *env = &ff->ph->env; in print_bpf_btf()
1836 down_read(&env->bpf_progs.lock); in print_bpf_btf()
1838 root = &env->bpf_progs.btfs; in print_bpf_btf()
1845 next = rb_next(&node->rb_node); in print_bpf_btf()
1846 fprintf(fp, "# btf info of id %u\n", node->id); in print_bpf_btf()
1849 up_read(&env->bpf_progs.lock); in print_bpf_btf()
1860 for (evsel = events; evsel->core.attr.size; evsel++) { in free_event_desc()
1861 zfree(&evsel->name); in free_event_desc()
1862 zfree(&evsel->core.id); in free_event_desc()
1870 if (attr->__reserved_1 || attr->__reserved_2 || attr->__reserved_3) { in perf_attr_check()
1876 if (attr->sample_type & ~(PERF_SAMPLE_MAX-1)) { in perf_attr_check()
1879 attr->sample_type); in perf_attr_check()
1883 if (attr->read_format & ~(PERF_FORMAT_MAX-1)) { in perf_attr_check()
1886 attr->read_format); in perf_attr_check()
1890 if ((attr->sample_type & PERF_SAMPLE_BRANCH_STACK) && in perf_attr_check()
1891 (attr->branch_sample_type & ~(PERF_SAMPLE_BRANCH_MAX-1))) { in perf_attr_check()
1894 attr->branch_sample_type); in perf_attr_check()
1907 u32 nre, sz, nr, i, j; in read_event_desc() local
1922 /* the last event terminates with evsel->core.attr.size == 0: */ in read_event_desc()
1927 msz = sizeof(evsel->core.attr); in read_event_desc()
1932 evsel->core.idx = i; in read_event_desc()
1935 * must read entire on-file attr struct to in read_event_desc()
1941 if (ff->ph->needs_swap) in read_event_desc()
1944 memcpy(&evsel->core.attr, buf, msz); in read_event_desc()
1946 if (!perf_attr_check(&evsel->core.attr)) in read_event_desc()
1949 if (do_read_u32(ff, &nr)) in read_event_desc()
1952 if (ff->ph->needs_swap) in read_event_desc()
1953 evsel->needs_swap = true; in read_event_desc()
1955 evsel->name = do_read_string(ff); in read_event_desc()
1956 if (!evsel->name) in read_event_desc()
1959 if (!nr) in read_event_desc()
1962 id = calloc(nr, sizeof(*id)); in read_event_desc()
1965 evsel->core.ids = nr; in read_event_desc()
1966 evsel->core.id = id; in read_event_desc()
1968 for (j = 0 ; j < nr; j++) { in read_event_desc()
1995 if (ff->events) in print_event_desc()
1996 events = ff->events; in print_event_desc()
2005 for (evsel = events; evsel->core.attr.size; evsel++) { in print_event_desc()
2006 fprintf(fp, "# event : name = %s, ", evsel->name); in print_event_desc()
2008 if (evsel->core.ids) { in print_event_desc()
2010 for (j = 0, id = evsel->core.id; j < evsel->core.ids; j++, id++) { in print_event_desc()
2018 perf_event_attr__fprintf(fp, &evsel->core.attr, __desc_attr__fprintf, NULL); in print_event_desc()
2024 ff->events = NULL; in print_event_desc()
2029 fprintf(fp, "# total memory : %llu kB\n", ff->ph->env.total_mem); in print_total_mem()
2037 for (i = 0; i < ff->ph->env.nr_numa_nodes; i++) { in print_numa_topology()
2038 n = &ff->ph->env.numa_nodes[i]; in print_numa_topology()
2042 n->node, n->mem_total, n->mem_free); in print_numa_topology()
2044 fprintf(fp, "# node%u cpu list : ", n->node); in print_numa_topology()
2045 cpu_map__fprintf(n->map, fp); in print_numa_topology()
2051 fprintf(fp, "# cpuid : %s\n", ff->ph->env.cpuid); in print_cpuid()
2073 fprintf(fp, "# CPU cache info:\n"); in print_cache()
2074 for (i = 0; i < ff->ph->env.caches_cnt; i++) { in print_cache()
2076 cpu_cache_level__fprintf(fp, &ff->ph->env.caches[i]); in print_cache()
2083 ff->ph->env.comp_type == PERF_COMP_ZSTD ? "Zstd" : "Unknown", in print_compressed()
2084 ff->ph->env.comp_level, ff->ph->env.comp_ratio); in print_compressed()
2108 __print_pmu_caps(fp, ff->ph->env.nr_cpu_pmu_caps, in print_cpu_pmu_caps()
2109 ff->ph->env.cpu_pmu_caps, (char *)"cpu"); in print_cpu_pmu_caps()
2116 for (int i = 0; i < ff->ph->env.nr_pmus_with_caps; i++) { in print_pmu_caps()
2117 pmu_caps = &ff->ph->env.pmu_caps[i]; in print_pmu_caps()
2118 __print_pmu_caps(fp, pmu_caps->nr_caps, pmu_caps->caps, in print_pmu_caps()
2119 pmu_caps->pmu_name); in print_pmu_caps()
2122 if (strcmp(perf_env__arch(&ff->ph->env), "x86") == 0 && in print_pmu_caps()
2123 perf_env__has_pmu_mapping(&ff->ph->env, "ibs_op")) { in print_pmu_caps()
2124 char *max_precise = perf_env__find_pmu_cap(&ff->ph->env, "cpu", "max_precise"); in print_pmu_caps()
2138 pmu_num = ff->ph->env.nr_pmu_mappings; in print_pmu_mappings()
2144 str = ff->ph->env.pmu_mappings; in print_pmu_mappings()
2156 pmu_num--; in print_pmu_mappings()
2171 u32 nr = 0; in print_group_desc() local
2173 session = container_of(ff->ph, struct perf_session, header); in print_group_desc()
2175 evlist__for_each_entry(session->evlist, evsel) { in print_group_desc()
2176 if (evsel__is_group_leader(evsel) && evsel->core.nr_members > 1) { in print_group_desc()
2177 fprintf(fp, "# group: %s{%s", evsel->group_name ?: "", evsel__name(evsel)); in print_group_desc()
2179 nr = evsel->core.nr_members - 1; in print_group_desc()
2180 } else if (nr) { in print_group_desc()
2183 if (--nr == 0) in print_group_desc()
2195 session = container_of(ff->ph, struct perf_session, header); in print_sample_time()
2197 timestamp__scnprintf_usec(session->evlist->first_sample_time, in print_sample_time()
2201 timestamp__scnprintf_usec(session->evlist->last_sample_time, in print_sample_time()
2205 d = (double)(session->evlist->last_sample_time - in print_sample_time()
2206 session->evlist->first_sample_time) / NSEC_PER_MSEC; in print_sample_time()
2217 size = bsize * bitmap_weight(n->set, n->size); in memory_node__fprintf()
2220 bitmap_scnprintf(n->set, n->size, buf_map, 100); in memory_node__fprintf()
2221 fprintf(fp, "# %3" PRIu64 " [%s]: %s\n", n->node, buf_size, buf_map); in memory_node__fprintf()
2227 int i, nr; in print_mem_topology() local
2229 nodes = ff->ph->env.memory_nodes; in print_mem_topology()
2230 nr = ff->ph->env.nr_memory_nodes; in print_mem_topology()
2232 fprintf(fp, "# memory nodes (nr %d, block size 0x%llx):\n", in print_mem_topology()
2233 nr, ff->ph->env.memory_bsize); in print_mem_topology()
2235 for (i = 0; i < nr; i++) { in print_mem_topology()
2236 memory_node__fprintf(&nodes[i], ff->ph->env.memory_bsize, fp); in print_mem_topology()
2244 int err = -1; in __event_process_build_id()
2250 machine = perf_session__findnew_machine(session, bev->pid); in __event_process_build_id()
2254 cpumode = bev->header.misc & PERF_RECORD_MISC_CPUMODE_MASK; in __event_process_build_id()
2277 if (bev->header.misc & PERF_RECORD_MISC_BUILD_ID_SIZE) in __event_process_build_id()
2278 size = bev->size; in __event_process_build_id()
2280 build_id__init(&bid, bev->data, size); in __event_process_build_id()
2322 return -1; in perf_header__read_build_ids_abi_quirk()
2324 if (header->needs_swap) in perf_header__read_build_ids_abi_quirk()
2327 len = old_bev.header.size - sizeof(old_bev); in perf_header__read_build_ids_abi_quirk()
2329 return -1; in perf_header__read_build_ids_abi_quirk()
2358 int err = -1; in perf_header__read_build_ids()
2366 if (header->needs_swap) in perf_header__read_build_ids()
2369 len = bev.header.size - sizeof(bev); in perf_header__read_build_ids()
2380 * Since the kernel build-id is the first entry, process the in perf_header__read_build_ids()
2382 * '[kernel.kallsyms]' string for the kernel build-id has the in perf_header__read_build_ids()
2386 if (lseek(input, orig_offset, SEEK_SET) == (off_t)-1) in perf_header__read_build_ids()
2387 return -1; in perf_header__read_build_ids()
2404 free(ff->ph->env.__feat_env); \
2405 ff->ph->env.__feat_env = do_read_string(ff); \
2406 return ff->ph->env.__feat_env ? 0 : -ENOMEM; \
2419 ssize_t ret = trace_report(ff->fd, data, false); in process_tracing_data()
2421 return ret < 0 ? -1 : 0; in process_tracing_data()
2427 if (perf_header__read_build_ids(ff->ph, ff->fd, ff->offset, ff->size)) in process_build_id()
2444 ff->ph->env.nr_cpus_avail = (int)nr_cpus_avail; in process_nrcpus()
2445 ff->ph->env.nr_cpus_online = (int)nr_cpus_online; in process_nrcpus()
2456 return -1; in process_total_mem()
2457 ff->ph->env.total_mem = (unsigned long long)total_mem; in process_total_mem()
2466 if (evsel->core.idx == idx) in evlist__find_by_index()
2477 if (!event->name) in evlist__set_event_name()
2480 evsel = evlist__find_by_index(evlist, event->core.idx); in evlist__set_event_name()
2484 if (evsel->name) in evlist__set_event_name()
2487 evsel->name = strdup(event->name); in evlist__set_event_name()
2499 session = container_of(ff->ph, struct perf_session, header); in process_event_desc()
2501 if (session->data->is_pipe) { in process_event_desc()
2504 ff->events = events; in process_event_desc()
2507 for (evsel = events; evsel->core.attr.size; evsel++) in process_event_desc()
2508 evlist__set_event_name(session->evlist, evsel); in process_event_desc()
2510 if (!session->data->is_pipe) in process_event_desc()
2519 u32 nr, i, len = 0; in process_cmdline() local
2521 if (do_read_u32(ff, &nr)) in process_cmdline()
2522 return -1; in process_cmdline()
2524 ff->ph->env.nr_cmdline = nr; in process_cmdline()
2526 cmdline = zalloc(ff->size + nr + 1); in process_cmdline()
2528 return -1; in process_cmdline()
2530 argv = zalloc(sizeof(char *) * (nr + 1)); in process_cmdline()
2534 for (i = 0; i < nr; i++) { in process_cmdline()
2544 ff->ph->env.cmdline = cmdline; in process_cmdline()
2545 ff->ph->env.cmdline_argv = (const char **) argv; in process_cmdline()
2551 return -1; in process_cmdline()
2556 u32 nr, i; in process_cpu_topology() local
2559 int cpu_nr = ff->ph->env.nr_cpus_avail; in process_cpu_topology()
2561 struct perf_header *ph = ff->ph; in process_cpu_topology()
2564 ph->env.cpu = calloc(cpu_nr, sizeof(*ph->env.cpu)); in process_cpu_topology()
2565 if (!ph->env.cpu) in process_cpu_topology()
2566 return -1; in process_cpu_topology()
2568 if (do_read_u32(ff, &nr)) in process_cpu_topology()
2571 ph->env.nr_sibling_cores = nr; in process_cpu_topology()
2576 for (i = 0; i < nr; i++) { in process_cpu_topology()
2587 ph->env.sibling_cores = strbuf_detach(&sb, NULL); in process_cpu_topology()
2589 if (do_read_u32(ff, &nr)) in process_cpu_topology()
2590 return -1; in process_cpu_topology()
2592 ph->env.nr_sibling_threads = nr; in process_cpu_topology()
2595 for (i = 0; i < nr; i++) { in process_cpu_topology()
2606 ph->env.sibling_threads = strbuf_detach(&sb, NULL); in process_cpu_topology()
2612 if (ff->size <= size) { in process_cpu_topology()
2613 zfree(&ph->env.cpu); in process_cpu_topology()
2622 if (ph->env.arch && (!strncmp(ph->env.arch, "s390", 4) in process_cpu_topology()
2623 || !strncmp(ph->env.arch, "aarch64", 7))) in process_cpu_topology()
2627 if (do_read_u32(ff, &nr)) in process_cpu_topology()
2630 ph->env.cpu[i].core_id = nr; in process_cpu_topology()
2633 if (do_read_u32(ff, &nr)) in process_cpu_topology()
2636 if (do_core_id_test && nr != (u32)-1 && nr > (u32)cpu_nr) { in process_cpu_topology()
2642 ph->env.cpu[i].socket_id = nr; in process_cpu_topology()
2650 if (ff->size <= size) in process_cpu_topology()
2653 if (do_read_u32(ff, &nr)) in process_cpu_topology()
2654 return -1; in process_cpu_topology()
2656 ph->env.nr_sibling_dies = nr; in process_cpu_topology()
2659 for (i = 0; i < nr; i++) { in process_cpu_topology()
2670 ph->env.sibling_dies = strbuf_detach(&sb, NULL); in process_cpu_topology()
2673 if (do_read_u32(ff, &nr)) in process_cpu_topology()
2676 ph->env.cpu[i].die_id = nr; in process_cpu_topology()
2685 zfree(&ph->env.cpu); in process_cpu_topology()
2686 return -1; in process_cpu_topology()
2692 u32 nr, i; in process_numa_topology() local
2695 /* nr nodes */ in process_numa_topology()
2696 if (do_read_u32(ff, &nr)) in process_numa_topology()
2697 return -1; in process_numa_topology()
2699 nodes = zalloc(sizeof(*nodes) * nr); in process_numa_topology()
2701 return -ENOMEM; in process_numa_topology()
2703 for (i = 0; i < nr; i++) { in process_numa_topology()
2707 if (do_read_u32(ff, &n->node)) in process_numa_topology()
2710 if (do_read_u64(ff, &n->mem_total)) in process_numa_topology()
2713 if (do_read_u64(ff, &n->mem_free)) in process_numa_topology()
2720 n->map = perf_cpu_map__new(str); in process_numa_topology()
2722 if (!n->map) in process_numa_topology()
2725 ff->ph->env.nr_numa_nodes = nr; in process_numa_topology()
2726 ff->ph->env.numa_nodes = nodes; in process_numa_topology()
2731 return -1; in process_numa_topology()
2742 return -1; in process_pmu_mappings()
2749 ff->ph->env.nr_pmu_mappings = pmu_num; in process_pmu_mappings()
2751 return -1; in process_pmu_mappings()
2768 ff->ph->env.msr_pmu_type = type; in process_pmu_mappings()
2771 pmu_num--; in process_pmu_mappings()
2774 free(ff->ph->env.pmu_mappings); in process_pmu_mappings()
2775 ff->ph->env.pmu_mappings = strbuf_detach(&sb, NULL); in process_pmu_mappings()
2780 return -1; in process_pmu_mappings()
2785 size_t ret = -1; in process_group_desc()
2786 u32 i, nr, nr_groups; in process_group_desc() local
2796 return -1; in process_group_desc()
2798 ff->ph->env.nr_groups = nr_groups; in process_group_desc()
2806 return -1; in process_group_desc()
2823 session = container_of(ff->ph, struct perf_session, header); in process_group_desc()
2825 i = nr = 0; in process_group_desc()
2826 evlist__for_each_entry(session->evlist, evsel) { in process_group_desc()
2827 if (i < nr_groups && evsel->core.idx == (int) desc[i].leader_idx) { in process_group_desc()
2831 evsel->group_name = desc[i].name; in process_group_desc()
2834 evsel->core.nr_members = desc[i].nr_members; in process_group_desc()
2836 if (i >= nr_groups || nr > 0) { in process_group_desc()
2842 nr = evsel->core.nr_members - 1; in process_group_desc()
2844 } else if (nr) { in process_group_desc()
2848 nr--; in process_group_desc()
2852 if (i != nr_groups || nr != 0) { in process_group_desc()
2871 session = container_of(ff->ph, struct perf_session, header); in process_auxtrace()
2873 err = auxtrace_index__process(ff->fd, ff->size, session, in process_auxtrace()
2874 ff->ph->needs_swap); in process_auxtrace()
2886 return -1; in process_cache()
2889 return -1; in process_cache()
2892 return -1; in process_cache()
2896 return -1; in process_cache()
2902 if (do_read_u32(ff, &c->v)) \ in process_cache()
2912 c->v = do_read_string(ff); \ in process_cache()
2913 if (!c->v) \ in process_cache()
2922 ff->ph->env.caches = caches; in process_cache()
2923 ff->ph->env.caches_cnt = cnt; in process_cache()
2932 return -1; in process_cache()
2941 session = container_of(ff->ph, struct perf_session, header); in process_sample_time()
2945 return -1; in process_sample_time()
2949 return -1; in process_sample_time()
2951 session->evlist->first_sample_time = first_sample_time; in process_sample_time()
2952 session->evlist->last_sample_time = last_sample_time; in process_sample_time()
2960 u64 version, i, nr, bsize; in process_mem_topology() local
2961 int ret = -1; in process_mem_topology()
2964 return -1; in process_mem_topology()
2967 return -1; in process_mem_topology()
2970 return -1; in process_mem_topology()
2972 if (do_read_u64(ff, &nr)) in process_mem_topology()
2973 return -1; in process_mem_topology()
2975 nodes = zalloc(sizeof(*nodes) * nr); in process_mem_topology()
2977 return -1; in process_mem_topology()
2979 for (i = 0; i < nr; i++) { in process_mem_topology()
2997 ff->ph->env.memory_bsize = bsize; in process_mem_topology()
2998 ff->ph->env.memory_nodes = nodes; in process_mem_topology()
2999 ff->ph->env.nr_memory_nodes = nr; in process_mem_topology()
3011 if (do_read_u64(ff, &ff->ph->env.clock.clockid_res_ns)) in process_clockid()
3012 return -1; in process_clockid()
3025 return -1; in process_clock_data()
3028 return -1; in process_clock_data()
3032 return -1; in process_clock_data()
3034 ff->ph->env.clock.clockid = data32; in process_clock_data()
3038 return -1; in process_clock_data()
3040 ff->ph->env.clock.tod_ns = data64; in process_clock_data()
3044 return -1; in process_clock_data()
3046 ff->ph->env.clock.clockid_ns = data64; in process_clock_data()
3047 ff->ph->env.clock.enabled = true; in process_clock_data()
3055 u32 nr, i; in process_hybrid_topology() local
3057 /* nr nodes */ in process_hybrid_topology()
3058 if (do_read_u32(ff, &nr)) in process_hybrid_topology()
3059 return -1; in process_hybrid_topology()
3061 nodes = zalloc(sizeof(*nodes) * nr); in process_hybrid_topology()
3063 return -ENOMEM; in process_hybrid_topology()
3065 for (i = 0; i < nr; i++) { in process_hybrid_topology()
3068 n->pmu_name = do_read_string(ff); in process_hybrid_topology()
3069 if (!n->pmu_name) in process_hybrid_topology()
3072 n->cpus = do_read_string(ff); in process_hybrid_topology()
3073 if (!n->cpus) in process_hybrid_topology()
3077 ff->ph->env.nr_hybrid_nodes = nr; in process_hybrid_topology()
3078 ff->ph->env.hybrid_nodes = nodes; in process_hybrid_topology()
3082 for (i = 0; i < nr; i++) { in process_hybrid_topology()
3088 return -1; in process_hybrid_topology()
3097 session = container_of(ff->ph, struct perf_session, header); in process_dir_format()
3098 data = session->data; in process_dir_format()
3101 return -1; in process_dir_format()
3103 return do_read_u64(ff, &data->dir.version); in process_dir_format()
3110 struct perf_env *env = &ff->ph->env; in process_bpf_prog_info()
3113 int err = -1; in process_bpf_prog_info()
3115 if (ff->ph->needs_swap) { in process_bpf_prog_info()
3121 return -1; in process_bpf_prog_info()
3123 down_write(&env->bpf_progs.lock); in process_bpf_prog_info()
3144 info_linear->info_len = sizeof(struct bpf_prog_info); in process_bpf_prog_info()
3145 info_linear->data_len = data_len; in process_bpf_prog_info()
3146 if (do_read_u64(ff, (u64 *)(&info_linear->arrays))) in process_bpf_prog_info()
3148 if (__do_read(ff, &info_linear->info, info_len)) in process_bpf_prog_info()
3151 memset(((void *)(&info_linear->info)) + info_len, 0, in process_bpf_prog_info()
3152 sizeof(struct bpf_prog_info) - info_len); in process_bpf_prog_info()
3154 if (__do_read(ff, info_linear->data, data_len)) in process_bpf_prog_info()
3163 info_node->info_linear = info_linear; in process_bpf_prog_info()
3170 up_write(&env->bpf_progs.lock); in process_bpf_prog_info()
3175 up_write(&env->bpf_progs.lock); in process_bpf_prog_info()
3181 struct perf_env *env = &ff->ph->env; in process_bpf_btf()
3184 int err = -1; in process_bpf_btf()
3186 if (ff->ph->needs_swap) { in process_bpf_btf()
3192 return -1; in process_bpf_btf()
3194 down_write(&env->bpf_progs.lock); in process_bpf_btf()
3208 node->id = id; in process_bpf_btf()
3209 node->data_size = data_size; in process_bpf_btf()
3211 if (__do_read(ff, node->data, data_size)) in process_bpf_btf()
3221 up_write(&env->bpf_progs.lock); in process_bpf_btf()
3230 if (do_read_u32(ff, &(ff->ph->env.comp_ver))) in process_compressed()
3231 return -1; in process_compressed()
3233 if (do_read_u32(ff, &(ff->ph->env.comp_type))) in process_compressed()
3234 return -1; in process_compressed()
3236 if (do_read_u32(ff, &(ff->ph->env.comp_level))) in process_compressed()
3237 return -1; in process_compressed()
3239 if (do_read_u32(ff, &(ff->ph->env.comp_ratio))) in process_compressed()
3240 return -1; in process_compressed()
3242 if (do_read_u32(ff, &(ff->ph->env.comp_mmap_len))) in process_compressed()
3243 return -1; in process_compressed()
3260 return -1; in __process_pmu_caps()
3267 return -1; in __process_pmu_caps()
3303 for (; i > 0; i--) in __process_pmu_caps()
3304 free((*caps)[i - 1]); in __process_pmu_caps()
3308 return -1; in __process_pmu_caps()
3314 int ret = __process_pmu_caps(ff, &ff->ph->env.nr_cpu_pmu_caps, in process_cpu_pmu_caps()
3315 &ff->ph->env.cpu_pmu_caps, in process_cpu_pmu_caps()
3316 &ff->ph->env.max_branches, in process_cpu_pmu_caps()
3317 &ff->ph->env.br_cntr_nr, in process_cpu_pmu_caps()
3318 &ff->ph->env.br_cntr_width); in process_cpu_pmu_caps()
3320 if (!ret && !ff->ph->env.cpu_pmu_caps) in process_cpu_pmu_caps()
3321 pr_debug("cpu pmu capabilities not available\n"); in process_cpu_pmu_caps()
3333 return -1; in process_pmu_caps()
3342 return -ENOMEM; in process_pmu_caps()
3355 ret = -1; in process_pmu_caps()
3364 ff->ph->env.nr_pmus_with_caps = nr_pmu; in process_pmu_caps()
3365 ff->ph->env.pmu_caps = pmu_caps; in process_pmu_caps()
3406 // Only used in util/synthetic-events.c
3459 if (lseek(fd, section->offset, SEEK_SET) == (off_t)-1) { in perf_file_section__fprintf_info()
3461 "%d, continuing...\n", section->offset, feat); in perf_file_section__fprintf_info()
3476 if (!feat_ops[feat].full_only || hd->full) in perf_file_section__fprintf_info()
3477 feat_ops[feat].print(&ff, hd->fp); in perf_file_section__fprintf_info()
3479 fprintf(hd->fp, "# %s info available, use -I to display\n", in perf_file_section__fprintf_info()
3488 struct perf_header *header = &session->header; in perf_header__fprintf_info()
3489 int fd = perf_data__fd(session->data); in perf_header__fprintf_info()
3498 if (ret == -1) in perf_header__fprintf_info()
3499 return -1; in perf_header__fprintf_info()
3504 fprintf(fp, "# header version : %u\n", header->version); in perf_header__fprintf_info()
3505 fprintf(fp, "# data offset : %" PRIu64 "\n", header->data_offset); in perf_header__fprintf_info()
3506 fprintf(fp, "# data size : %" PRIu64 "\n", header->data_size); in perf_header__fprintf_info()
3507 fprintf(fp, "# feat offset : %" PRIu64 "\n", header->feat_offset); in perf_header__fprintf_info()
3512 if (session->data->is_pipe) in perf_header__fprintf_info()
3516 for_each_clear_bit(bit, header->adds_features, HEADER_LAST_FEATURE) { in perf_header__fprintf_info()
3534 return do_write(h->ff, buf, sz); in feat_writer_cb()
3545 if (perf_header__has_feat(ff->ph, type)) { in do_write_feat()
3547 return -1; in do_write_feat()
3549 if (WARN(ff->buf, "Error: calling %s in pipe-mode.\n", __func__)) in do_write_feat()
3550 return -1; in do_write_feat()
3552 (*p)->offset = lseek(ff->fd, 0, SEEK_CUR); in do_write_feat()
3558 if (fc && fc->copy) { in do_write_feat()
3564 /* ->copy() returns 0 if the feature was not copied */ in do_write_feat()
3565 err = fc->copy(fc, type, &h.fw); in do_write_feat()
3575 lseek(ff->fd, (*p)->offset, SEEK_SET); in do_write_feat()
3577 return -1; in do_write_feat()
3579 (*p)->size = lseek(ff->fd, 0, SEEK_CUR) - (*p)->offset; in do_write_feat()
3600 nr_sections = bitmap_weight(header->adds_features, HEADER_FEAT_BITS); in perf_header__adds_write()
3606 return -ENOMEM; in perf_header__adds_write()
3610 sec_start = header->feat_offset; in perf_header__adds_write()
3613 for_each_set_bit(feat, header->adds_features, HEADER_FEAT_BITS) { in perf_header__adds_write()
3626 free(ff.buf); /* TODO: added to silence clang-tidy. */ in perf_header__adds_write()
3660 struct perf_header *header = &session->header; in perf_session__do_write_header()
3673 if (!header->data_offset && header->data_size) { in perf_session__do_write_header()
3675 err = -1; in perf_session__do_write_header()
3678 header->feat_offset = header->data_offset + header->data_size; in perf_session__do_write_header()
3687 evlist__for_each_entry(session->evlist, evsel) { in perf_session__do_write_header()
3688 evsel->id_offset = attr_offset; in perf_session__do_write_header()
3691 err = do_write(&ff, evsel->core.id, evsel->core.ids * sizeof(u64)); in perf_session__do_write_header()
3697 attr_offset += evsel->core.ids * sizeof(u64); in perf_session__do_write_header()
3701 if (evsel->core.attr.size < sizeof(evsel->core.attr)) { in perf_session__do_write_header()
3707 evsel->core.attr.size = sizeof(evsel->core.attr); in perf_session__do_write_header()
3712 .attr = evsel->core.attr, in perf_session__do_write_header()
3714 .offset = evsel->id_offset, in perf_session__do_write_header()
3715 .size = evsel->core.ids * sizeof(u64), in perf_session__do_write_header()
3727 if (!header->data_offset) { in perf_session__do_write_header()
3729 header->data_offset = sizeof(f_header); in perf_session__do_write_header()
3731 header->data_offset = attr_offset + attr_size; in perf_session__do_write_header()
3733 header->feat_offset = header->data_offset + header->data_size; in perf_session__do_write_header()
3751 .offset = header->data_offset, in perf_session__do_write_header()
3752 .size = header->data_size, in perf_session__do_write_header()
3757 memcpy(&f_header.adds_features, &header->adds_features, sizeof(header->adds_features)); in perf_session__do_write_header()
3788 data_offset += evsel->core.ids * sizeof(u64); in perf_session__data_offset()
3790 data_offset += evlist->core.nr_entries * sizeof(struct perf_file_attr); in perf_session__data_offset()
3809 return -1; in perf_header__getbuffer64()
3811 if (header->needs_swap) in perf_header__getbuffer64()
3829 nr_sections = bitmap_weight(header->adds_features, HEADER_FEAT_BITS); in perf_header__process_sections()
3835 return -1; in perf_header__process_sections()
3839 lseek(fd, header->feat_offset, SEEK_SET); in perf_header__process_sections()
3845 for_each_set_bit(feat, header->adds_features, HEADER_LAST_FEATURE) { in perf_header__process_sections()
3884 ph->needs_swap = true; in try_all_file_abis()
3888 ph->needs_swap); in try_all_file_abis()
3892 return -1; in try_all_file_abis()
3920 ph->needs_swap = true; in try_all_pipe_abis()
3925 return -1; in try_all_pipe_abis()
3946 ph->version = PERF_HEADER_VERSION_1; in check_magic_endian()
3955 * - unique number to identify actual perf.data files in check_magic_endian()
3956 * - encode endianness of file in check_magic_endian()
3958 ph->version = PERF_HEADER_VERSION_2; in check_magic_endian()
3966 return -1; in check_magic_endian()
3968 ph->needs_swap = true; in check_magic_endian()
3982 return -1; in perf_file_header__read()
3984 if (check_magic_endian(header->magic, in perf_file_header__read()
3985 header->attr_size, false, ph) < 0) { in perf_file_header__read()
3987 return -1; in perf_file_header__read()
3990 if (ph->needs_swap) { in perf_file_header__read()
3995 if (header->size > header->attrs.offset) { in perf_file_header__read()
3997 return -1; in perf_file_header__read()
4000 if (header->size > header->data.offset) { in perf_file_header__read()
4002 return -1; in perf_file_header__read()
4005 if ((header->attrs.offset <= header->data.offset && in perf_file_header__read()
4006 header->attrs.offset + header->attrs.size > header->data.offset) || in perf_file_header__read()
4007 (header->attrs.offset > header->data.offset && in perf_file_header__read()
4008 header->data.offset + header->data.size > header->attrs.offset)) { in perf_file_header__read()
4010 return -1; in perf_file_header__read()
4013 if (header->size != sizeof(*header)) { in perf_file_header__read()
4015 if (header->size == offsetof(typeof(*header), adds_features)) in perf_file_header__read()
4016 bitmap_zero(header->adds_features, HEADER_FEAT_BITS); in perf_file_header__read()
4018 return -1; in perf_file_header__read()
4019 } else if (ph->needs_swap) { in perf_file_header__read()
4021 * feature bitmap is declared as an array of unsigned longs -- in perf_file_header__read()
4027 * guess at determining it: try 64-bit swap first (ie., file in perf_file_header__read()
4028 * created on a 64-bit host), and check if the hostname feature in perf_file_header__read()
4030 * If the bit is not, undo the 64-bit swap and try a 32-bit in perf_file_header__read()
4032 * file), punt and fallback to the original behavior -- in perf_file_header__read()
4035 mem_bswap_64(&header->adds_features, in perf_file_header__read()
4038 if (!test_bit(HEADER_HOSTNAME, header->adds_features)) { in perf_file_header__read()
4040 mem_bswap_64(&header->adds_features, in perf_file_header__read()
4044 mem_bswap_32(&header->adds_features, in perf_file_header__read()
4048 if (!test_bit(HEADER_HOSTNAME, header->adds_features)) { in perf_file_header__read()
4049 bitmap_zero(header->adds_features, HEADER_FEAT_BITS); in perf_file_header__read()
4050 __set_bit(HEADER_BUILD_ID, header->adds_features); in perf_file_header__read()
4054 memcpy(&ph->adds_features, &header->adds_features, in perf_file_header__read()
4055 sizeof(ph->adds_features)); in perf_file_header__read()
4057 ph->data_offset = header->data.offset; in perf_file_header__read()
4058 ph->data_size = header->data.size; in perf_file_header__read()
4059 ph->feat_offset = header->data.offset + header->data.size; in perf_file_header__read()
4070 .size = section->size, in perf_file_section__process()
4071 .offset = section->offset, in perf_file_section__process()
4074 if (lseek(fd, section->offset, SEEK_SET) == (off_t)-1) { in perf_file_section__process()
4076 "%d, continuing...\n", section->offset, feat); in perf_file_section__process()
4099 return -1; in perf_file_header__read_pipe()
4101 if (check_magic_endian(header->magic, header->size, true, ph) < 0) { in perf_file_header__read_pipe()
4103 return -1; in perf_file_header__read_pipe()
4106 if (ph->needs_swap) in perf_file_header__read_pipe()
4107 header->size = bswap_64(header->size); in perf_file_header__read_pipe()
4114 struct perf_header *header = &session->header; in perf_header__read_pipe()
4117 if (perf_file_header__read_pipe(&f_header, header, session->data) < 0) { in perf_header__read_pipe()
4119 return -EINVAL; in perf_header__read_pipe()
4122 return f_header.size == sizeof(f_header) ? 0 : -1; in perf_header__read_pipe()
4128 struct perf_event_attr *attr = &f_attr->attr; in read_attr()
4130 size_t our_sz = sizeof(f_attr->attr); in read_attr()
4140 return -1; in read_attr()
4144 sz = attr->size; in read_attr()
4146 if (ph->needs_swap) in read_attr()
4154 " (%zu bytes extra)\n", sz - our_sz); in read_attr()
4155 return -1; in read_attr()
4158 left = sz - PERF_ATTR_SIZE_VER0; in read_attr()
4166 ret = readn(fd, &f_attr->ids, sizeof(f_attr->ids)); in read_attr()
4168 return ret <= 0 ? -1 : 0; in read_attr()
4178 if (evsel->tp_format) in evsel__prepare_tracepoint_event()
4183 return -1; in evsel__prepare_tracepoint_event()
4186 event = tep_find_event(pevent, evsel->core.attr.config); in evsel__prepare_tracepoint_event()
4188 pr_debug("cannot find event format for %d\n", (int)evsel->core.attr.config); in evsel__prepare_tracepoint_event()
4189 return -1; in evsel__prepare_tracepoint_event()
4192 if (!evsel->name) { in evsel__prepare_tracepoint_event()
4193 snprintf(bf, sizeof(bf), "%s:%s", event->system, event->name); in evsel__prepare_tracepoint_event()
4194 evsel->name = strdup(bf); in evsel__prepare_tracepoint_event()
4195 if (evsel->name == NULL) in evsel__prepare_tracepoint_event()
4196 return -1; in evsel__prepare_tracepoint_event()
4199 evsel->tp_format = event; in evsel__prepare_tracepoint_event()
4208 if (pos->core.attr.type == PERF_TYPE_TRACEPOINT && in evlist__prepare_tracepoint_events()
4210 return -1; in evlist__prepare_tracepoint_events()
4219 struct perf_data *data = session->data; in perf_session__read_header()
4220 struct perf_header *header = &session->header; in perf_session__read_header()
4227 session->evlist = evlist__new(); in perf_session__read_header()
4228 if (session->evlist == NULL) in perf_session__read_header()
4229 return -ENOMEM; in perf_session__read_header()
4231 session->evlist->env = &header->env; in perf_session__read_header()
4232 session->machines.host.env = &header->env; in perf_session__read_header()
4240 data->is_pipe = true; in perf_session__read_header()
4245 return -EINVAL; in perf_session__read_header()
4247 if (header->needs_swap && data->in_place_update) { in perf_session__read_header()
4248 pr_err("In-place update not supported when byte-swapping is required\n"); in perf_session__read_header()
4249 return -EINVAL; in perf_session__read_header()
4261 data->file.path); in perf_session__read_header()
4267 data->file.path); in perf_session__read_header()
4268 return -EINVAL; in perf_session__read_header()
4281 if (header->needs_swap) { in perf_session__read_header()
4293 evsel->needs_swap = header->needs_swap; in perf_session__read_header()
4298 evlist__add(session->evlist, evsel); in perf_session__read_header()
4302 * We don't have the cpu and thread maps on the header, so in perf_session__read_header()
4303 * for allocating the perf_sample_id table we fake 1 cpu and in perf_session__read_header()
4304 * hattr->ids threads. in perf_session__read_header()
4306 if (perf_evsel__alloc_id(&evsel->core, 1, nr_ids)) in perf_session__read_header()
4315 perf_evlist__id_add(&session->evlist->core, &evsel->core, 0, j, f_id); in perf_session__read_header()
4322 perf_header__process_sections(header, fd, &session->tevent, in perf_session__read_header()
4325 if (evlist__prepare_tracepoint_events(session->evlist, session->tevent.pevent)) in perf_session__read_header()
4333 return -errno; in perf_session__read_header()
4336 evlist__delete(session->evlist); in perf_session__read_header()
4337 session->evlist = NULL; in perf_session__read_header()
4338 return -ENOMEM; in perf_session__read_header()
4344 const struct perf_tool *tool = session->tool; in perf_event__process_feature()
4347 int type = fe->header.type; in perf_event__process_feature()
4348 u64 feat = fe->feat_id; in perf_event__process_feature()
4352 pr_warning("invalid record type %d in pipe-mode\n", type); in perf_event__process_feature()
4356 pr_warning("invalid record type %d in pipe-mode\n", type); in perf_event__process_feature()
4357 return -1; in perf_event__process_feature()
4363 ff.buf = (void *)fe->data; in perf_event__process_feature()
4364 ff.size = event->header.size - sizeof(*fe); in perf_event__process_feature()
4365 ff.ph = &session->header; in perf_event__process_feature()
4368 ret = -1; in perf_event__process_feature()
4372 if (!feat_ops[feat].print || !tool->show_feat_hdr) in perf_event__process_feature()
4376 tool->show_feat_hdr >= SHOW_FEAT_HEADER_FULL_INFO) { in perf_event__process_feature()
4379 fprintf(stdout, "# %s info available, use -I to display\n", in perf_event__process_feature()
4389 struct perf_record_event_update *ev = &event->event_update; in perf_event__fprintf_event_update()
4393 ret = fprintf(fp, "\n... id: %" PRI_lu64 "\n", ev->id); in perf_event__fprintf_event_update()
4395 switch (ev->type) { in perf_event__fprintf_event_update()
4397 ret += fprintf(fp, "... scale: %f\n", ev->scale.scale); in perf_event__fprintf_event_update()
4400 ret += fprintf(fp, "... unit: %s\n", ev->unit); in perf_event__fprintf_event_update()
4403 ret += fprintf(fp, "... name: %s\n", ev->name); in perf_event__fprintf_event_update()
4408 map = cpu_map__new_data(&ev->cpus.cpus); in perf_event__fprintf_event_update()
4435 return -ENOMEM; in perf_event__process_attr()
4438 evsel = evsel__new(&event->attr.attr); in perf_event__process_attr()
4440 return -ENOMEM; in perf_event__process_attr()
4444 n_ids = event->header.size - sizeof(event->header) - event->attr.attr.size; in perf_event__process_attr()
4447 * We don't have the cpu and thread maps on the header, so in perf_event__process_attr()
4448 * for allocating the perf_sample_id table we fake 1 cpu and in perf_event__process_attr()
4449 * hattr->ids threads. in perf_event__process_attr()
4451 if (perf_evsel__alloc_id(&evsel->core, 1, n_ids)) in perf_event__process_attr()
4452 return -ENOMEM; in perf_event__process_attr()
4456 perf_evlist__id_add(&evlist->core, &evsel->core, 0, i, ids[i]); in perf_event__process_attr()
4466 struct perf_record_event_update *ev = &event->event_update; in perf_event__process_event_update()
4475 return -EINVAL; in perf_event__process_event_update()
4479 evsel = evlist__id2evsel(evlist, ev->id); in perf_event__process_event_update()
4481 return -EINVAL; in perf_event__process_event_update()
4483 switch (ev->type) { in perf_event__process_event_update()
4485 free((char *)evsel->unit); in perf_event__process_event_update()
4486 evsel->unit = strdup(ev->unit); in perf_event__process_event_update()
4489 free(evsel->name); in perf_event__process_event_update()
4490 evsel->name = strdup(ev->name); in perf_event__process_event_update()
4493 evsel->scale = ev->scale.scale; in perf_event__process_event_update()
4496 map = cpu_map__new_data(&ev->cpus.cpus); in perf_event__process_event_update()
4498 perf_cpu_map__put(evsel->core.own_cpus); in perf_event__process_event_update()
4499 evsel->core.own_cpus = map; in perf_event__process_event_update()
4513 ssize_t size_read, padding, size = event->tracing_data.size; in perf_event__process_tracing_data()
4514 int fd = perf_data__fd(session->data); in perf_event__process_tracing_data()
4524 if (!perf_data__is_pipe(session->data)) { in perf_event__process_tracing_data()
4532 size_read = trace_report(fd, &session->tevent, session->trace_event_repipe); in perf_event__process_tracing_data()
4533 padding = PERF_ALIGN(size_read, sizeof(u64)) - size_read; in perf_event__process_tracing_data()
4537 return -1; in perf_event__process_tracing_data()
4539 if (session->trace_event_repipe) { in perf_event__process_tracing_data()
4543 return -1; in perf_event__process_tracing_data()
4549 return -1; in perf_event__process_tracing_data()
4552 evlist__prepare_tracepoint_events(session->evlist, session->tevent.pevent); in perf_event__process_tracing_data()
4561 __event_process_build_id(&event->build_id, in perf_event__process_build_id()
4562 event->build_id.filename, in perf_event__process_build_id()