|
@@ -21,6 +21,7 @@
|
|
|
#include "debug.h"
|
|
|
#include "cpumap.h"
|
|
|
#include "pmu.h"
|
|
|
+#include "vdso.h"
|
|
|
|
|
|
static bool no_buildid_cache = false;
|
|
|
|
|
@@ -129,7 +130,7 @@ static int do_write_string(int fd, const char *str)
|
|
|
int ret;
|
|
|
|
|
|
olen = strlen(str) + 1;
|
|
|
- len = ALIGN(olen, NAME_ALIGN);
|
|
|
+ len = PERF_ALIGN(olen, NAME_ALIGN);
|
|
|
|
|
|
/* write len, incl. \0 */
|
|
|
ret = do_write(fd, &len, sizeof(len));
|
|
@@ -207,6 +208,29 @@ perf_header__set_cmdline(int argc, const char **argv)
|
|
|
continue; \
|
|
|
else
|
|
|
|
|
|
+static int write_buildid(char *name, size_t name_len, u8 *build_id,
|
|
|
+ pid_t pid, u16 misc, int fd)
|
|
|
+{
|
|
|
+ int err;
|
|
|
+ struct build_id_event b;
|
|
|
+ size_t len;
|
|
|
+
|
|
|
+ len = name_len + 1;
|
|
|
+ len = PERF_ALIGN(len, NAME_ALIGN);
|
|
|
+
|
|
|
+ memset(&b, 0, sizeof(b));
|
|
|
+ memcpy(&b.build_id, build_id, BUILD_ID_SIZE);
|
|
|
+ b.pid = pid;
|
|
|
+ b.header.misc = misc;
|
|
|
+ b.header.size = sizeof(b) + len;
|
|
|
+
|
|
|
+ err = do_write(fd, &b, sizeof(b));
|
|
|
+ if (err < 0)
|
|
|
+ return err;
|
|
|
+
|
|
|
+ return write_padded(fd, name, name_len + 1, len);
|
|
|
+}
|
|
|
+
|
|
|
static int __dsos__write_buildid_table(struct list_head *head, pid_t pid,
|
|
|
u16 misc, int fd)
|
|
|
{
|
|
@@ -214,24 +238,23 @@ static int __dsos__write_buildid_table(struct list_head *head, pid_t pid,
|
|
|
|
|
|
dsos__for_each_with_build_id(pos, head) {
|
|
|
int err;
|
|
|
- struct build_id_event b;
|
|
|
- size_t len;
|
|
|
+ char *name;
|
|
|
+ size_t name_len;
|
|
|
|
|
|
if (!pos->hit)
|
|
|
continue;
|
|
|
- len = pos->long_name_len + 1;
|
|
|
- len = ALIGN(len, NAME_ALIGN);
|
|
|
- memset(&b, 0, sizeof(b));
|
|
|
- memcpy(&b.build_id, pos->build_id, sizeof(pos->build_id));
|
|
|
- b.pid = pid;
|
|
|
- b.header.misc = misc;
|
|
|
- b.header.size = sizeof(b) + len;
|
|
|
- err = do_write(fd, &b, sizeof(b));
|
|
|
- if (err < 0)
|
|
|
- return err;
|
|
|
- err = write_padded(fd, pos->long_name,
|
|
|
- pos->long_name_len + 1, len);
|
|
|
- if (err < 0)
|
|
|
+
|
|
|
+ if (is_vdso_map(pos->short_name)) {
|
|
|
+ name = (char *) VDSO__MAP_NAME;
|
|
|
+ name_len = sizeof(VDSO__MAP_NAME) + 1;
|
|
|
+ } else {
|
|
|
+ name = pos->long_name;
|
|
|
+ name_len = pos->long_name_len + 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ err = write_buildid(name, name_len, pos->build_id,
|
|
|
+ pid, misc, fd);
|
|
|
+ if (err)
|
|
|
return err;
|
|
|
}
|
|
|
|
|
@@ -277,19 +300,20 @@ static int dsos__write_buildid_table(struct perf_header *header, int fd)
|
|
|
}
|
|
|
|
|
|
int build_id_cache__add_s(const char *sbuild_id, const char *debugdir,
|
|
|
- const char *name, bool is_kallsyms)
|
|
|
+ const char *name, bool is_kallsyms, bool is_vdso)
|
|
|
{
|
|
|
const size_t size = PATH_MAX;
|
|
|
char *realname, *filename = zalloc(size),
|
|
|
*linkname = zalloc(size), *targetname;
|
|
|
int len, err = -1;
|
|
|
+ bool slash = is_kallsyms || is_vdso;
|
|
|
|
|
|
if (is_kallsyms) {
|
|
|
if (symbol_conf.kptr_restrict) {
|
|
|
pr_debug("Not caching a kptr_restrict'ed /proc/kallsyms\n");
|
|
|
return 0;
|
|
|
}
|
|
|
- realname = (char *)name;
|
|
|
+ realname = (char *) name;
|
|
|
} else
|
|
|
realname = realpath(name, NULL);
|
|
|
|
|
@@ -297,7 +321,8 @@ int build_id_cache__add_s(const char *sbuild_id, const char *debugdir,
|
|
|
goto out_free;
|
|
|
|
|
|
len = scnprintf(filename, size, "%s%s%s",
|
|
|
- debugdir, is_kallsyms ? "/" : "", realname);
|
|
|
+ debugdir, slash ? "/" : "",
|
|
|
+ is_vdso ? VDSO__MAP_NAME : realname);
|
|
|
if (mkdir_p(filename, 0755))
|
|
|
goto out_free;
|
|
|
|
|
@@ -333,13 +358,14 @@ out_free:
|
|
|
|
|
|
static int build_id_cache__add_b(const u8 *build_id, size_t build_id_size,
|
|
|
const char *name, const char *debugdir,
|
|
|
- bool is_kallsyms)
|
|
|
+ bool is_kallsyms, bool is_vdso)
|
|
|
{
|
|
|
char sbuild_id[BUILD_ID_SIZE * 2 + 1];
|
|
|
|
|
|
build_id__sprintf(build_id, build_id_size, sbuild_id);
|
|
|
|
|
|
- return build_id_cache__add_s(sbuild_id, debugdir, name, is_kallsyms);
|
|
|
+ return build_id_cache__add_s(sbuild_id, debugdir, name,
|
|
|
+ is_kallsyms, is_vdso);
|
|
|
}
|
|
|
|
|
|
int build_id_cache__remove_s(const char *sbuild_id, const char *debugdir)
|
|
@@ -383,9 +409,11 @@ out_free:
|
|
|
static int dso__cache_build_id(struct dso *dso, const char *debugdir)
|
|
|
{
|
|
|
bool is_kallsyms = dso->kernel && dso->long_name[0] != '/';
|
|
|
+ bool is_vdso = is_vdso_map(dso->short_name);
|
|
|
|
|
|
return build_id_cache__add_b(dso->build_id, sizeof(dso->build_id),
|
|
|
- dso->long_name, debugdir, is_kallsyms);
|
|
|
+ dso->long_name, debugdir,
|
|
|
+ is_kallsyms, is_vdso);
|
|
|
}
|
|
|
|
|
|
static int __dsos__cache_build_ids(struct list_head *head, const char *debugdir)
|
|
@@ -447,7 +475,7 @@ static bool perf_session__read_build_ids(struct perf_session *session, bool with
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
-static int write_tracing_data(int fd, struct perf_header *h __used,
|
|
|
+static int write_tracing_data(int fd, struct perf_header *h __maybe_unused,
|
|
|
struct perf_evlist *evlist)
|
|
|
{
|
|
|
return read_tracing_data(fd, &evlist->entries);
|
|
@@ -455,7 +483,7 @@ static int write_tracing_data(int fd, struct perf_header *h __used,
|
|
|
|
|
|
|
|
|
static int write_build_id(int fd, struct perf_header *h,
|
|
|
- struct perf_evlist *evlist __used)
|
|
|
+ struct perf_evlist *evlist __maybe_unused)
|
|
|
{
|
|
|
struct perf_session *session;
|
|
|
int err;
|
|
@@ -476,8 +504,8 @@ static int write_build_id(int fd, struct perf_header *h,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int write_hostname(int fd, struct perf_header *h __used,
|
|
|
- struct perf_evlist *evlist __used)
|
|
|
+static int write_hostname(int fd, struct perf_header *h __maybe_unused,
|
|
|
+ struct perf_evlist *evlist __maybe_unused)
|
|
|
{
|
|
|
struct utsname uts;
|
|
|
int ret;
|
|
@@ -489,8 +517,8 @@ static int write_hostname(int fd, struct perf_header *h __used,
|
|
|
return do_write_string(fd, uts.nodename);
|
|
|
}
|
|
|
|
|
|
-static int write_osrelease(int fd, struct perf_header *h __used,
|
|
|
- struct perf_evlist *evlist __used)
|
|
|
+static int write_osrelease(int fd, struct perf_header *h __maybe_unused,
|
|
|
+ struct perf_evlist *evlist __maybe_unused)
|
|
|
{
|
|
|
struct utsname uts;
|
|
|
int ret;
|
|
@@ -502,8 +530,8 @@ static int write_osrelease(int fd, struct perf_header *h __used,
|
|
|
return do_write_string(fd, uts.release);
|
|
|
}
|
|
|
|
|
|
-static int write_arch(int fd, struct perf_header *h __used,
|
|
|
- struct perf_evlist *evlist __used)
|
|
|
+static int write_arch(int fd, struct perf_header *h __maybe_unused,
|
|
|
+ struct perf_evlist *evlist __maybe_unused)
|
|
|
{
|
|
|
struct utsname uts;
|
|
|
int ret;
|
|
@@ -515,14 +543,14 @@ static int write_arch(int fd, struct perf_header *h __used,
|
|
|
return do_write_string(fd, uts.machine);
|
|
|
}
|
|
|
|
|
|
-static int write_version(int fd, struct perf_header *h __used,
|
|
|
- struct perf_evlist *evlist __used)
|
|
|
+static int write_version(int fd, struct perf_header *h __maybe_unused,
|
|
|
+ struct perf_evlist *evlist __maybe_unused)
|
|
|
{
|
|
|
return do_write_string(fd, perf_version_string);
|
|
|
}
|
|
|
|
|
|
-static int write_cpudesc(int fd, struct perf_header *h __used,
|
|
|
- struct perf_evlist *evlist __used)
|
|
|
+static int write_cpudesc(int fd, struct perf_header *h __maybe_unused,
|
|
|
+ struct perf_evlist *evlist __maybe_unused)
|
|
|
{
|
|
|
#ifndef CPUINFO_PROC
|
|
|
#define CPUINFO_PROC NULL
|
|
@@ -580,8 +608,8 @@ done:
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
-static int write_nrcpus(int fd, struct perf_header *h __used,
|
|
|
- struct perf_evlist *evlist __used)
|
|
|
+static int write_nrcpus(int fd, struct perf_header *h __maybe_unused,
|
|
|
+ struct perf_evlist *evlist __maybe_unused)
|
|
|
{
|
|
|
long nr;
|
|
|
u32 nrc, nra;
|
|
@@ -606,7 +634,7 @@ static int write_nrcpus(int fd, struct perf_header *h __used,
|
|
|
return do_write(fd, &nra, sizeof(nra));
|
|
|
}
|
|
|
|
|
|
-static int write_event_desc(int fd, struct perf_header *h __used,
|
|
|
+static int write_event_desc(int fd, struct perf_header *h __maybe_unused,
|
|
|
struct perf_evlist *evlist)
|
|
|
{
|
|
|
struct perf_evsel *evsel;
|
|
@@ -663,8 +691,8 @@ static int write_event_desc(int fd, struct perf_header *h __used,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int write_cmdline(int fd, struct perf_header *h __used,
|
|
|
- struct perf_evlist *evlist __used)
|
|
|
+static int write_cmdline(int fd, struct perf_header *h __maybe_unused,
|
|
|
+ struct perf_evlist *evlist __maybe_unused)
|
|
|
{
|
|
|
char buf[MAXPATHLEN];
|
|
|
char proc[32];
|
|
@@ -832,8 +860,8 @@ static struct cpu_topo *build_cpu_topology(void)
|
|
|
return tp;
|
|
|
}
|
|
|
|
|
|
-static int write_cpu_topology(int fd, struct perf_header *h __used,
|
|
|
- struct perf_evlist *evlist __used)
|
|
|
+static int write_cpu_topology(int fd, struct perf_header *h __maybe_unused,
|
|
|
+ struct perf_evlist *evlist __maybe_unused)
|
|
|
{
|
|
|
struct cpu_topo *tp;
|
|
|
u32 i;
|
|
@@ -868,8 +896,8 @@ done:
|
|
|
|
|
|
|
|
|
|
|
|
-static int write_total_mem(int fd, struct perf_header *h __used,
|
|
|
- struct perf_evlist *evlist __used)
|
|
|
+static int write_total_mem(int fd, struct perf_header *h __maybe_unused,
|
|
|
+ struct perf_evlist *evlist __maybe_unused)
|
|
|
{
|
|
|
char *buf = NULL;
|
|
|
FILE *fp;
|
|
@@ -954,8 +982,8 @@ done:
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
-static int write_numa_topology(int fd, struct perf_header *h __used,
|
|
|
- struct perf_evlist *evlist __used)
|
|
|
+static int write_numa_topology(int fd, struct perf_header *h __maybe_unused,
|
|
|
+ struct perf_evlist *evlist __maybe_unused)
|
|
|
{
|
|
|
char *buf = NULL;
|
|
|
size_t len = 0;
|
|
@@ -1015,8 +1043,8 @@ done:
|
|
|
* };
|
|
|
*/
|
|
|
|
|
|
-static int write_pmu_mappings(int fd, struct perf_header *h __used,
|
|
|
- struct perf_evlist *evlist __used)
|
|
|
+static int write_pmu_mappings(int fd, struct perf_header *h __maybe_unused,
|
|
|
+ struct perf_evlist *evlist __maybe_unused)
|
|
|
{
|
|
|
struct perf_pmu *pmu = NULL;
|
|
|
off_t offset = lseek(fd, 0, SEEK_CUR);
|
|
@@ -1046,13 +1074,14 @@ static int write_pmu_mappings(int fd, struct perf_header *h __used,
|
|
|
* default get_cpuid(): nothing gets recorded
|
|
|
* actual implementation must be in arch/$(ARCH)/util/header.c
|
|
|
*/
|
|
|
-int __attribute__((weak)) get_cpuid(char *buffer __used, size_t sz __used)
|
|
|
+int __attribute__ ((weak)) get_cpuid(char *buffer __maybe_unused,
|
|
|
+ size_t sz __maybe_unused)
|
|
|
{
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
|
-static int write_cpuid(int fd, struct perf_header *h __used,
|
|
|
- struct perf_evlist *evlist __used)
|
|
|
+static int write_cpuid(int fd, struct perf_header *h __maybe_unused,
|
|
|
+ struct perf_evlist *evlist __maybe_unused)
|
|
|
{
|
|
|
char buffer[64];
|
|
|
int ret;
|
|
@@ -1066,8 +1095,9 @@ write_it:
|
|
|
return do_write_string(fd, buffer);
|
|
|
}
|
|
|
|
|
|
-static int write_branch_stack(int fd __used, struct perf_header *h __used,
|
|
|
- struct perf_evlist *evlist __used)
|
|
|
+static int write_branch_stack(int fd __maybe_unused,
|
|
|
+ struct perf_header *h __maybe_unused,
|
|
|
+ struct perf_evlist *evlist __maybe_unused)
|
|
|
{
|
|
|
return 0;
|
|
|
}
|
|
@@ -1344,7 +1374,8 @@ static void print_event_desc(struct perf_header *ph, int fd, FILE *fp)
|
|
|
free_event_desc(events);
|
|
|
}
|
|
|
|
|
|
-static void print_total_mem(struct perf_header *h __used, int fd, FILE *fp)
|
|
|
+static void print_total_mem(struct perf_header *h __maybe_unused, int fd,
|
|
|
+ FILE *fp)
|
|
|
{
|
|
|
uint64_t mem;
|
|
|
ssize_t ret;
|
|
@@ -1362,7 +1393,8 @@ error:
|
|
|
fprintf(fp, "# total memory : unknown\n");
|
|
|
}
|
|
|
|
|
|
-static void print_numa_topology(struct perf_header *h __used, int fd, FILE *fp)
|
|
|
+static void print_numa_topology(struct perf_header *h __maybe_unused, int fd,
|
|
|
+ FILE *fp)
|
|
|
{
|
|
|
ssize_t ret;
|
|
|
u32 nr, c, i;
|
|
@@ -1422,7 +1454,8 @@ static void print_cpuid(struct perf_header *ph, int fd, FILE *fp)
|
|
|
free(str);
|
|
|
}
|
|
|
|
|
|
-static void print_branch_stack(struct perf_header *ph __used, int fd __used,
|
|
|
+static void print_branch_stack(struct perf_header *ph __maybe_unused,
|
|
|
+ int fd __maybe_unused,
|
|
|
FILE *fp)
|
|
|
{
|
|
|
fprintf(fp, "# contains samples with branch stack\n");
|
|
@@ -1532,7 +1565,7 @@ static int perf_header__read_build_ids_abi_quirk(struct perf_header *header,
|
|
|
struct perf_session *session = container_of(header, struct perf_session, header);
|
|
|
struct {
|
|
|
struct perf_event_header header;
|
|
|
- u8 build_id[ALIGN(BUILD_ID_SIZE, sizeof(u64))];
|
|
|
+ u8 build_id[PERF_ALIGN(BUILD_ID_SIZE, sizeof(u64))];
|
|
|
char filename[0];
|
|
|
} old_bev;
|
|
|
struct build_id_event bev;
|
|
@@ -1621,9 +1654,10 @@ out:
|
|
|
return err;
|
|
|
}
|
|
|
|
|
|
-static int process_tracing_data(struct perf_file_section *section __unused,
|
|
|
- struct perf_header *ph __unused,
|
|
|
- int feat __unused, int fd, void *data)
|
|
|
+static int process_tracing_data(struct perf_file_section *section
|
|
|
+ __maybe_unused,
|
|
|
+ struct perf_header *ph __maybe_unused,
|
|
|
+ int feat __maybe_unused, int fd, void *data)
|
|
|
{
|
|
|
trace_report(fd, data, false);
|
|
|
return 0;
|
|
@@ -1631,7 +1665,8 @@ static int process_tracing_data(struct perf_file_section *section __unused,
|
|
|
|
|
|
static int process_build_id(struct perf_file_section *section,
|
|
|
struct perf_header *ph,
|
|
|
- int feat __unused, int fd, void *data __used)
|
|
|
+ int feat __maybe_unused, int fd,
|
|
|
+ void *data __maybe_unused)
|
|
|
{
|
|
|
if (perf_header__read_build_ids(ph, fd, section->offset, section->size))
|
|
|
pr_debug("Failed to read buildids, continuing...\n");
|
|
@@ -1670,9 +1705,9 @@ perf_evlist__set_event_name(struct perf_evlist *evlist, struct perf_evsel *event
|
|
|
}
|
|
|
|
|
|
static int
|
|
|
-process_event_desc(struct perf_file_section *section __unused,
|
|
|
- struct perf_header *header, int feat __unused, int fd,
|
|
|
- void *data __used)
|
|
|
+process_event_desc(struct perf_file_section *section __maybe_unused,
|
|
|
+ struct perf_header *header, int feat __maybe_unused, int fd,
|
|
|
+ void *data __maybe_unused)
|
|
|
{
|
|
|
struct perf_session *session = container_of(header, struct perf_session, header);
|
|
|
struct perf_evsel *evsel, *events = read_event_desc(header, fd);
|
|
@@ -2439,7 +2474,7 @@ int perf_event__synthesize_attr(struct perf_tool *tool,
|
|
|
int err;
|
|
|
|
|
|
size = sizeof(struct perf_event_attr);
|
|
|
- size = ALIGN(size, sizeof(u64));
|
|
|
+ size = PERF_ALIGN(size, sizeof(u64));
|
|
|
size += sizeof(struct perf_event_header);
|
|
|
size += ids * sizeof(u64);
|
|
|
|
|
@@ -2537,7 +2572,7 @@ int perf_event__synthesize_event_type(struct perf_tool *tool,
|
|
|
|
|
|
ev.event_type.header.type = PERF_RECORD_HEADER_EVENT_TYPE;
|
|
|
size = strlen(ev.event_type.event_type.name);
|
|
|
- size = ALIGN(size, sizeof(u64));
|
|
|
+ size = PERF_ALIGN(size, sizeof(u64));
|
|
|
ev.event_type.header.size = sizeof(ev.event_type) -
|
|
|
(sizeof(ev.event_type.event_type.name) - size);
|
|
|
|
|
@@ -2568,7 +2603,7 @@ int perf_event__synthesize_event_types(struct perf_tool *tool,
|
|
|
return err;
|
|
|
}
|
|
|
|
|
|
-int perf_event__process_event_type(struct perf_tool *tool __unused,
|
|
|
+int perf_event__process_event_type(struct perf_tool *tool __maybe_unused,
|
|
|
union perf_event *event)
|
|
|
{
|
|
|
if (perf_header__push_event(event->event_type.event_type.event_id,
|
|
@@ -2585,7 +2620,7 @@ int perf_event__synthesize_tracing_data(struct perf_tool *tool, int fd,
|
|
|
union perf_event ev;
|
|
|
struct tracing_data *tdata;
|
|
|
ssize_t size = 0, aligned_size = 0, padding;
|
|
|
- int err __used = 0;
|
|
|
+ int err __maybe_unused = 0;
|
|
|
|
|
|
/*
|
|
|
* We are going to store the size of the data followed
|
|
@@ -2606,7 +2641,7 @@ int perf_event__synthesize_tracing_data(struct perf_tool *tool, int fd,
|
|
|
|
|
|
ev.tracing_data.header.type = PERF_RECORD_HEADER_TRACING_DATA;
|
|
|
size = tdata->size;
|
|
|
- aligned_size = ALIGN(size, sizeof(u64));
|
|
|
+ aligned_size = PERF_ALIGN(size, sizeof(u64));
|
|
|
padding = aligned_size - size;
|
|
|
ev.tracing_data.header.size = sizeof(ev.tracing_data);
|
|
|
ev.tracing_data.size = aligned_size;
|
|
@@ -2637,7 +2672,7 @@ int perf_event__process_tracing_data(union perf_event *event,
|
|
|
|
|
|
size_read = trace_report(session->fd, &session->pevent,
|
|
|
session->repipe);
|
|
|
- padding = ALIGN(size_read, sizeof(u64)) - size_read;
|
|
|
+ padding = PERF_ALIGN(size_read, sizeof(u64)) - size_read;
|
|
|
|
|
|
if (read(session->fd, buf, padding) < 0)
|
|
|
die("reading input file");
|
|
@@ -2671,7 +2706,7 @@ int perf_event__synthesize_build_id(struct perf_tool *tool,
|
|
|
memset(&ev, 0, sizeof(ev));
|
|
|
|
|
|
len = pos->long_name_len + 1;
|
|
|
- len = ALIGN(len, NAME_ALIGN);
|
|
|
+ len = PERF_ALIGN(len, NAME_ALIGN);
|
|
|
memcpy(&ev.build_id.build_id, pos->build_id, sizeof(pos->build_id));
|
|
|
ev.build_id.header.type = PERF_RECORD_HEADER_BUILD_ID;
|
|
|
ev.build_id.header.misc = misc;
|
|
@@ -2684,7 +2719,7 @@ int perf_event__synthesize_build_id(struct perf_tool *tool,
|
|
|
return err;
|
|
|
}
|
|
|
|
|
|
-int perf_event__process_build_id(struct perf_tool *tool __used,
|
|
|
+int perf_event__process_build_id(struct perf_tool *tool __maybe_unused,
|
|
|
union perf_event *event,
|
|
|
struct perf_session *session)
|
|
|
{
|