Commit 500d85ce authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'perf-fixes-for-linus' of...

Merge branch 'perf-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip

* 'perf-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
  perf tools: Fix time function double declaration with glibc
  perf tools: Fix build by checking if extra warnings are supported
  perf tools: Fix build when using gcc 3.4.6
  perf tools: Add missing header, fixes build
  perf tools: Fix 64 bit integer format strings
  perf test: Fix build on older glibcs
  perf: perf_event_exit_task_context: s/rcu_dereference/rcu_dereference_raw/
  perf test: Use cpu_map->[cpu] when setting affinity
  perf symbols: Fix annotation of thumb code
  perf: Annotate cpuctx->ctx.mutex to avoid a lockdep splat
  powerpc, perf: Fix frequency calculation for overflowing counters (FSL version)
  perf: Fix perf_event_init_task()/perf_event_free_task() interaction
  perf: Fix find_get_context() vs perf_event_exit_task() race
parents ce84d539 00e99a49
...@@ -596,6 +596,7 @@ static void record_and_restart(struct perf_event *event, unsigned long val, ...@@ -596,6 +596,7 @@ static void record_and_restart(struct perf_event *event, unsigned long val,
if (left <= 0) if (left <= 0)
left = period; left = period;
record = 1; record = 1;
event->hw.last_period = event->hw.sample_period;
} }
if (left < 0x80000000LL) if (left < 0x80000000LL)
val = 0x80000000LL - left; val = 0x80000000LL - left;
......
...@@ -2201,13 +2201,6 @@ find_lively_task_by_vpid(pid_t vpid) ...@@ -2201,13 +2201,6 @@ find_lively_task_by_vpid(pid_t vpid)
if (!task) if (!task)
return ERR_PTR(-ESRCH); return ERR_PTR(-ESRCH);
/*
* Can't attach events to a dying task.
*/
err = -ESRCH;
if (task->flags & PF_EXITING)
goto errout;
/* Reuse ptrace permission checks for now. */ /* Reuse ptrace permission checks for now. */
err = -EACCES; err = -EACCES;
if (!ptrace_may_access(task, PTRACE_MODE_READ)) if (!ptrace_may_access(task, PTRACE_MODE_READ))
...@@ -2268,14 +2261,27 @@ find_get_context(struct pmu *pmu, struct task_struct *task, int cpu) ...@@ -2268,14 +2261,27 @@ find_get_context(struct pmu *pmu, struct task_struct *task, int cpu)
get_ctx(ctx); get_ctx(ctx);
if (cmpxchg(&task->perf_event_ctxp[ctxn], NULL, ctx)) { err = 0;
/* mutex_lock(&task->perf_event_mutex);
* We raced with some other task; use /*
* the context they set. * If it has already passed perf_event_exit_task().
*/ * we must see PF_EXITING, it takes this mutex too.
*/
if (task->flags & PF_EXITING)
err = -ESRCH;
else if (task->perf_event_ctxp[ctxn])
err = -EAGAIN;
else
rcu_assign_pointer(task->perf_event_ctxp[ctxn], ctx);
mutex_unlock(&task->perf_event_mutex);
if (unlikely(err)) {
put_task_struct(task); put_task_struct(task);
kfree(ctx); kfree(ctx);
goto retry;
if (err == -EAGAIN)
goto retry;
goto errout;
} }
} }
...@@ -5374,6 +5380,8 @@ static int pmu_dev_alloc(struct pmu *pmu) ...@@ -5374,6 +5380,8 @@ static int pmu_dev_alloc(struct pmu *pmu)
goto out; goto out;
} }
static struct lock_class_key cpuctx_mutex;
int perf_pmu_register(struct pmu *pmu, char *name, int type) int perf_pmu_register(struct pmu *pmu, char *name, int type)
{ {
int cpu, ret; int cpu, ret;
...@@ -5422,6 +5430,7 @@ int perf_pmu_register(struct pmu *pmu, char *name, int type) ...@@ -5422,6 +5430,7 @@ int perf_pmu_register(struct pmu *pmu, char *name, int type)
cpuctx = per_cpu_ptr(pmu->pmu_cpu_context, cpu); cpuctx = per_cpu_ptr(pmu->pmu_cpu_context, cpu);
__perf_event_init_context(&cpuctx->ctx); __perf_event_init_context(&cpuctx->ctx);
lockdep_set_class(&cpuctx->ctx.mutex, &cpuctx_mutex);
cpuctx->ctx.type = cpu_context; cpuctx->ctx.type = cpu_context;
cpuctx->ctx.pmu = pmu; cpuctx->ctx.pmu = pmu;
cpuctx->jiffies_interval = 1; cpuctx->jiffies_interval = 1;
...@@ -6127,7 +6136,7 @@ static void perf_event_exit_task_context(struct task_struct *child, int ctxn) ...@@ -6127,7 +6136,7 @@ static void perf_event_exit_task_context(struct task_struct *child, int ctxn)
* scheduled, so we are now safe from rescheduling changing * scheduled, so we are now safe from rescheduling changing
* our context. * our context.
*/ */
child_ctx = child->perf_event_ctxp[ctxn]; child_ctx = rcu_dereference_raw(child->perf_event_ctxp[ctxn]);
task_ctx_sched_out(child_ctx, EVENT_ALL); task_ctx_sched_out(child_ctx, EVENT_ALL);
/* /*
...@@ -6440,11 +6449,6 @@ int perf_event_init_context(struct task_struct *child, int ctxn) ...@@ -6440,11 +6449,6 @@ int perf_event_init_context(struct task_struct *child, int ctxn)
unsigned long flags; unsigned long flags;
int ret = 0; int ret = 0;
child->perf_event_ctxp[ctxn] = NULL;
mutex_init(&child->perf_event_mutex);
INIT_LIST_HEAD(&child->perf_event_list);
if (likely(!parent->perf_event_ctxp[ctxn])) if (likely(!parent->perf_event_ctxp[ctxn]))
return 0; return 0;
...@@ -6533,6 +6537,10 @@ int perf_event_init_task(struct task_struct *child) ...@@ -6533,6 +6537,10 @@ int perf_event_init_task(struct task_struct *child)
{ {
int ctxn, ret; int ctxn, ret;
memset(child->perf_event_ctxp, 0, sizeof(child->perf_event_ctxp));
mutex_init(&child->perf_event_mutex);
INIT_LIST_HEAD(&child->perf_event_list);
for_each_task_context_nr(ctxn) { for_each_task_context_nr(ctxn) {
ret = perf_event_init_context(child, ctxn); ret = perf_event_init_context(child, ctxn);
if (ret) if (ret)
......
...@@ -204,13 +204,11 @@ EXTRA_WARNINGS := $(EXTRA_WARNINGS) -Wshadow ...@@ -204,13 +204,11 @@ EXTRA_WARNINGS := $(EXTRA_WARNINGS) -Wshadow
EXTRA_WARNINGS := $(EXTRA_WARNINGS) -Winit-self EXTRA_WARNINGS := $(EXTRA_WARNINGS) -Winit-self
EXTRA_WARNINGS := $(EXTRA_WARNINGS) -Wpacked EXTRA_WARNINGS := $(EXTRA_WARNINGS) -Wpacked
EXTRA_WARNINGS := $(EXTRA_WARNINGS) -Wredundant-decls EXTRA_WARNINGS := $(EXTRA_WARNINGS) -Wredundant-decls
EXTRA_WARNINGS := $(EXTRA_WARNINGS) -Wstack-protector
EXTRA_WARNINGS := $(EXTRA_WARNINGS) -Wstrict-aliasing=3 EXTRA_WARNINGS := $(EXTRA_WARNINGS) -Wstrict-aliasing=3
EXTRA_WARNINGS := $(EXTRA_WARNINGS) -Wswitch-default EXTRA_WARNINGS := $(EXTRA_WARNINGS) -Wswitch-default
EXTRA_WARNINGS := $(EXTRA_WARNINGS) -Wswitch-enum EXTRA_WARNINGS := $(EXTRA_WARNINGS) -Wswitch-enum
EXTRA_WARNINGS := $(EXTRA_WARNINGS) -Wno-system-headers EXTRA_WARNINGS := $(EXTRA_WARNINGS) -Wno-system-headers
EXTRA_WARNINGS := $(EXTRA_WARNINGS) -Wundef EXTRA_WARNINGS := $(EXTRA_WARNINGS) -Wundef
EXTRA_WARNINGS := $(EXTRA_WARNINGS) -Wvolatile-register-var
EXTRA_WARNINGS := $(EXTRA_WARNINGS) -Wwrite-strings EXTRA_WARNINGS := $(EXTRA_WARNINGS) -Wwrite-strings
EXTRA_WARNINGS := $(EXTRA_WARNINGS) -Wbad-function-cast EXTRA_WARNINGS := $(EXTRA_WARNINGS) -Wbad-function-cast
EXTRA_WARNINGS := $(EXTRA_WARNINGS) -Wmissing-declarations EXTRA_WARNINGS := $(EXTRA_WARNINGS) -Wmissing-declarations
...@@ -294,6 +292,13 @@ ifeq ($(call try-cc,$(SOURCE_HELLO),-Werror -fstack-protector-all),y) ...@@ -294,6 +292,13 @@ ifeq ($(call try-cc,$(SOURCE_HELLO),-Werror -fstack-protector-all),y)
CFLAGS := $(CFLAGS) -fstack-protector-all CFLAGS := $(CFLAGS) -fstack-protector-all
endif endif
ifeq ($(call try-cc,$(SOURCE_HELLO),-Werror -Wstack-protector),y)
CFLAGS := $(CFLAGS) -Wstack-protector
endif
ifeq ($(call try-cc,$(SOURCE_HELLO),-Werror -Wvolatile-register-var),y)
CFLAGS := $(CFLAGS) -Wvolatile-register-var
endif
### --- END CONFIGURATION SECTION --- ### --- END CONFIGURATION SECTION ---
......
...@@ -212,7 +212,7 @@ get_source_line(struct hist_entry *he, int len, const char *filename) ...@@ -212,7 +212,7 @@ get_source_line(struct hist_entry *he, int len, const char *filename)
continue; continue;
offset = start + i; offset = start + i;
sprintf(cmd, "addr2line -e %s %016llx", filename, offset); sprintf(cmd, "addr2line -e %s %016" PRIx64, filename, offset);
fp = popen(cmd, "r"); fp = popen(cmd, "r");
if (!fp) if (!fp)
continue; continue;
...@@ -270,9 +270,9 @@ static void hist_entry__print_hits(struct hist_entry *self) ...@@ -270,9 +270,9 @@ static void hist_entry__print_hits(struct hist_entry *self)
for (offset = 0; offset < len; ++offset) for (offset = 0; offset < len; ++offset)
if (h->ip[offset] != 0) if (h->ip[offset] != 0)
printf("%*Lx: %Lu\n", BITS_PER_LONG / 2, printf("%*" PRIx64 ": %" PRIu64 "\n", BITS_PER_LONG / 2,
sym->start + offset, h->ip[offset]); sym->start + offset, h->ip[offset]);
printf("%*s: %Lu\n", BITS_PER_LONG / 2, "h->sum", h->sum); printf("%*s: %" PRIu64 "\n", BITS_PER_LONG / 2, "h->sum", h->sum);
} }
static int hist_entry__tty_annotate(struct hist_entry *he) static int hist_entry__tty_annotate(struct hist_entry *he)
......
...@@ -371,10 +371,10 @@ static void __print_result(struct rb_root *root, struct perf_session *session, ...@@ -371,10 +371,10 @@ static void __print_result(struct rb_root *root, struct perf_session *session,
addr = data->ptr; addr = data->ptr;
if (sym != NULL) if (sym != NULL)
snprintf(buf, sizeof(buf), "%s+%Lx", sym->name, snprintf(buf, sizeof(buf), "%s+%" PRIx64 "", sym->name,
addr - map->unmap_ip(map, sym->start)); addr - map->unmap_ip(map, sym->start));
else else
snprintf(buf, sizeof(buf), "%#Lx", addr); snprintf(buf, sizeof(buf), "%#" PRIx64 "", addr);
printf(" %-34s |", buf); printf(" %-34s |", buf);
printf(" %9llu/%-5lu | %9llu/%-5lu | %8lu | %8lu | %6.3f%%\n", printf(" %9llu/%-5lu | %9llu/%-5lu | %8lu | %8lu | %6.3f%%\n",
......
...@@ -782,9 +782,9 @@ static void print_result(void) ...@@ -782,9 +782,9 @@ static void print_result(void)
pr_info("%10u ", st->nr_acquired); pr_info("%10u ", st->nr_acquired);
pr_info("%10u ", st->nr_contended); pr_info("%10u ", st->nr_contended);
pr_info("%15llu ", st->wait_time_total); pr_info("%15" PRIu64 " ", st->wait_time_total);
pr_info("%15llu ", st->wait_time_max); pr_info("%15" PRIu64 " ", st->wait_time_max);
pr_info("%15llu ", st->wait_time_min == ULLONG_MAX ? pr_info("%15" PRIu64 " ", st->wait_time_min == ULLONG_MAX ?
0 : st->wait_time_min); 0 : st->wait_time_min);
pr_info("\n"); pr_info("\n");
} }
......
...@@ -817,7 +817,7 @@ static int __cmd_record(int argc, const char **argv) ...@@ -817,7 +817,7 @@ static int __cmd_record(int argc, const char **argv)
* Approximate RIP event size: 24 bytes. * Approximate RIP event size: 24 bytes.
*/ */
fprintf(stderr, fprintf(stderr,
"[ perf record: Captured and wrote %.3f MB %s (~%lld samples) ]\n", "[ perf record: Captured and wrote %.3f MB %s (~%" PRIu64 " samples) ]\n",
(double)bytes_written / 1024.0 / 1024.0, (double)bytes_written / 1024.0 / 1024.0,
output_name, output_name,
bytes_written / 24); bytes_written / 24);
......
...@@ -197,7 +197,7 @@ static int process_read_event(event_t *event, struct sample_data *sample __used, ...@@ -197,7 +197,7 @@ static int process_read_event(event_t *event, struct sample_data *sample __used,
event->read.value); event->read.value);
} }
dump_printf(": %d %d %s %Lu\n", event->read.pid, event->read.tid, dump_printf(": %d %d %s %" PRIu64 "\n", event->read.pid, event->read.tid,
attr ? __event_name(attr->type, attr->config) : "FAIL", attr ? __event_name(attr->type, attr->config) : "FAIL",
event->read.value); event->read.value);
......
...@@ -193,7 +193,7 @@ static void calibrate_run_measurement_overhead(void) ...@@ -193,7 +193,7 @@ static void calibrate_run_measurement_overhead(void)
} }
run_measurement_overhead = min_delta; run_measurement_overhead = min_delta;
printf("run measurement overhead: %Ld nsecs\n", min_delta); printf("run measurement overhead: %" PRIu64 " nsecs\n", min_delta);
} }
static void calibrate_sleep_measurement_overhead(void) static void calibrate_sleep_measurement_overhead(void)
...@@ -211,7 +211,7 @@ static void calibrate_sleep_measurement_overhead(void) ...@@ -211,7 +211,7 @@ static void calibrate_sleep_measurement_overhead(void)
min_delta -= 10000; min_delta -= 10000;
sleep_measurement_overhead = min_delta; sleep_measurement_overhead = min_delta;
printf("sleep measurement overhead: %Ld nsecs\n", min_delta); printf("sleep measurement overhead: %" PRIu64 " nsecs\n", min_delta);
} }
static struct sched_atom * static struct sched_atom *
...@@ -617,13 +617,13 @@ static void test_calibrations(void) ...@@ -617,13 +617,13 @@ static void test_calibrations(void)
burn_nsecs(1e6); burn_nsecs(1e6);
T1 = get_nsecs(); T1 = get_nsecs();
printf("the run test took %Ld nsecs\n", T1-T0); printf("the run test took %" PRIu64 " nsecs\n", T1 - T0);
T0 = get_nsecs(); T0 = get_nsecs();
sleep_nsecs(1e6); sleep_nsecs(1e6);
T1 = get_nsecs(); T1 = get_nsecs();
printf("the sleep test took %Ld nsecs\n", T1-T0); printf("the sleep test took %" PRIu64 " nsecs\n", T1 - T0);
} }
#define FILL_FIELD(ptr, field, event, data) \ #define FILL_FIELD(ptr, field, event, data) \
...@@ -816,10 +816,10 @@ replay_switch_event(struct trace_switch_event *switch_event, ...@@ -816,10 +816,10 @@ replay_switch_event(struct trace_switch_event *switch_event,
delta = 0; delta = 0;
if (delta < 0) if (delta < 0)
die("hm, delta: %Ld < 0 ?\n", delta); die("hm, delta: %" PRIu64 " < 0 ?\n", delta);
if (verbose) { if (verbose) {
printf(" ... switch from %s/%d to %s/%d [ran %Ld nsecs]\n", printf(" ... switch from %s/%d to %s/%d [ran %" PRIu64 " nsecs]\n",
switch_event->prev_comm, switch_event->prev_pid, switch_event->prev_comm, switch_event->prev_pid,
switch_event->next_comm, switch_event->next_pid, switch_event->next_comm, switch_event->next_pid,
delta); delta);
...@@ -1048,7 +1048,7 @@ latency_switch_event(struct trace_switch_event *switch_event, ...@@ -1048,7 +1048,7 @@ latency_switch_event(struct trace_switch_event *switch_event,
delta = 0; delta = 0;
if (delta < 0) if (delta < 0)
die("hm, delta: %Ld < 0 ?\n", delta); die("hm, delta: %" PRIu64 " < 0 ?\n", delta);
sched_out = perf_session__findnew(session, switch_event->prev_pid); sched_out = perf_session__findnew(session, switch_event->prev_pid);
...@@ -1221,7 +1221,7 @@ static void output_lat_thread(struct work_atoms *work_list) ...@@ -1221,7 +1221,7 @@ static void output_lat_thread(struct work_atoms *work_list)
avg = work_list->total_lat / work_list->nb_atoms; avg = work_list->total_lat / work_list->nb_atoms;
printf("|%11.3f ms |%9llu | avg:%9.3f ms | max:%9.3f ms | max at: %9.6f s\n", printf("|%11.3f ms |%9" PRIu64 " | avg:%9.3f ms | max:%9.3f ms | max at: %9.6f s\n",
(double)work_list->total_runtime / 1e6, (double)work_list->total_runtime / 1e6,
work_list->nb_atoms, (double)avg / 1e6, work_list->nb_atoms, (double)avg / 1e6,
(double)work_list->max_lat / 1e6, (double)work_list->max_lat / 1e6,
...@@ -1423,7 +1423,7 @@ map_switch_event(struct trace_switch_event *switch_event, ...@@ -1423,7 +1423,7 @@ map_switch_event(struct trace_switch_event *switch_event,
delta = 0; delta = 0;
if (delta < 0) if (delta < 0)
die("hm, delta: %Ld < 0 ?\n", delta); die("hm, delta: %" PRIu64 " < 0 ?\n", delta);
sched_out = perf_session__findnew(session, switch_event->prev_pid); sched_out = perf_session__findnew(session, switch_event->prev_pid);
...@@ -1713,7 +1713,7 @@ static void __cmd_lat(void) ...@@ -1713,7 +1713,7 @@ static void __cmd_lat(void)
} }
printf(" -----------------------------------------------------------------------------------------\n"); printf(" -----------------------------------------------------------------------------------------\n");
printf(" TOTAL: |%11.3f ms |%9Ld |\n", printf(" TOTAL: |%11.3f ms |%9" PRIu64 " |\n",
(double)all_runtime/1e6, all_count); (double)all_runtime/1e6, all_count);
printf(" ---------------------------------------------------\n"); printf(" ---------------------------------------------------\n");
......
...@@ -77,8 +77,8 @@ static int process_sample_event(event_t *event, struct sample_data *sample, ...@@ -77,8 +77,8 @@ static int process_sample_event(event_t *event, struct sample_data *sample,
if (session->sample_type & PERF_SAMPLE_RAW) { if (session->sample_type & PERF_SAMPLE_RAW) {
if (debug_mode) { if (debug_mode) {
if (sample->time < last_timestamp) { if (sample->time < last_timestamp) {
pr_err("Samples misordered, previous: %llu " pr_err("Samples misordered, previous: %" PRIu64
"this: %llu\n", last_timestamp, " this: %" PRIu64 "\n", last_timestamp,
sample->time); sample->time);
nr_unordered++; nr_unordered++;
} }
...@@ -126,7 +126,7 @@ static int __cmd_script(struct perf_session *session) ...@@ -126,7 +126,7 @@ static int __cmd_script(struct perf_session *session)
ret = perf_session__process_events(session, &event_ops); ret = perf_session__process_events(session, &event_ops);
if (debug_mode) if (debug_mode)
pr_err("Misordered timestamps: %llu\n", nr_unordered); pr_err("Misordered timestamps: %" PRIu64 "\n", nr_unordered);
return ret; return ret;
} }
......
...@@ -206,8 +206,8 @@ static int read_counter_aggr(struct perf_evsel *counter) ...@@ -206,8 +206,8 @@ static int read_counter_aggr(struct perf_evsel *counter)
update_stats(&ps->res_stats[i], count[i]); update_stats(&ps->res_stats[i], count[i]);
if (verbose) { if (verbose) {
fprintf(stderr, "%s: %Ld %Ld %Ld\n", event_name(counter), fprintf(stderr, "%s: %" PRIu64 " %" PRIu64 " %" PRIu64 "\n",
count[0], count[1], count[2]); event_name(counter), count[0], count[1], count[2]);
} }
/* /*
......
...@@ -146,7 +146,7 @@ static int test__vmlinux_matches_kallsyms(void) ...@@ -146,7 +146,7 @@ static int test__vmlinux_matches_kallsyms(void)
if (llabs(skew) < page_size) if (llabs(skew) < page_size)
continue; continue;
pr_debug("%#Lx: diff end addr for %s v: %#Lx k: %#Lx\n", pr_debug("%#" PRIx64 ": diff end addr for %s v: %#" PRIx64 " k: %#" PRIx64 "\n",
sym->start, sym->name, sym->end, pair->end); sym->start, sym->name, sym->end, pair->end);
} else { } else {
struct rb_node *nnd; struct rb_node *nnd;
...@@ -168,11 +168,11 @@ static int test__vmlinux_matches_kallsyms(void) ...@@ -168,11 +168,11 @@ static int test__vmlinux_matches_kallsyms(void)
goto detour; goto detour;
} }
pr_debug("%#Lx: diff name v: %s k: %s\n", pr_debug("%#" PRIx64 ": diff name v: %s k: %s\n",
sym->start, sym->name, pair->name); sym->start, sym->name, pair->name);
} }
} else } else
pr_debug("%#Lx: %s not on kallsyms\n", sym->start, sym->name); pr_debug("%#" PRIx64 ": %s not on kallsyms\n", sym->start, sym->name);
err = -1; err = -1;
} }
...@@ -211,10 +211,10 @@ static int test__vmlinux_matches_kallsyms(void) ...@@ -211,10 +211,10 @@ static int test__vmlinux_matches_kallsyms(void)
if (pair->start == pos->start) { if (pair->start == pos->start) {
pair->priv = 1; pair->priv = 1;
pr_info(" %Lx-%Lx %Lx %s in kallsyms as", pr_info(" %" PRIx64 "-%" PRIx64 " %" PRIx64 " %s in kallsyms as",
pos->start, pos->end, pos->pgoff, pos->dso->name); pos->start, pos->end, pos->pgoff, pos->dso->name);
if (pos->pgoff != pair->pgoff || pos->end != pair->end) if (pos->pgoff != pair->pgoff || pos->end != pair->end)
pr_info(": \n*%Lx-%Lx %Lx", pr_info(": \n*%" PRIx64 "-%" PRIx64 " %" PRIx64 "",
pair->start, pair->end, pair->pgoff); pair->start, pair->end, pair->pgoff);
pr_info(" %s\n", pair->dso->name); pr_info(" %s\n", pair->dso->name);
pair->priv = 1; pair->priv = 1;
...@@ -307,7 +307,7 @@ static int test__open_syscall_event(void) ...@@ -307,7 +307,7 @@ static int test__open_syscall_event(void)
} }
if (evsel->counts->cpu[0].val != nr_open_calls) { if (evsel->counts->cpu[0].val != nr_open_calls) {
pr_debug("perf_evsel__read_on_cpu: expected to intercept %d calls, got %Ld\n", pr_debug("perf_evsel__read_on_cpu: expected to intercept %d calls, got %" PRIu64 "\n",
nr_open_calls, evsel->counts->cpu[0].val); nr_open_calls, evsel->counts->cpu[0].val);
goto out_close_fd; goto out_close_fd;
} }
...@@ -332,8 +332,7 @@ static int test__open_syscall_event_on_all_cpus(void) ...@@ -332,8 +332,7 @@ static int test__open_syscall_event_on_all_cpus(void)
struct perf_evsel *evsel; struct perf_evsel *evsel;
struct perf_event_attr attr; struct perf_event_attr attr;
unsigned int nr_open_calls = 111, i; unsigned int nr_open_calls = 111, i;
cpu_set_t *cpu_set; cpu_set_t cpu_set;
size_t cpu_set_size;
int id = trace_event__id("sys_enter_open"); int id = trace_event__id("sys_enter_open");
if (id < 0) { if (id < 0) {
...@@ -353,13 +352,8 @@ static int test__open_syscall_event_on_all_cpus(void) ...@@ -353,13 +352,8 @@ static int test__open_syscall_event_on_all_cpus(void)
return -1; return -1;
} }
cpu_set = CPU_ALLOC(cpus->nr);
if (cpu_set == NULL) CPU_ZERO(&cpu_set);
goto out_thread_map_delete;
cpu_set_size = CPU_ALLOC_SIZE(cpus->nr);
CPU_ZERO_S(cpu_set_size, cpu_set);
memset(&attr, 0, sizeof(attr)); memset(&attr, 0, sizeof(attr));
attr.type = PERF_TYPE_TRACEPOINT; attr.type = PERF_TYPE_TRACEPOINT;
...@@ -367,7 +361,7 @@ static int test__open_syscall_event_on_all_cpus(void) ...@@ -367,7 +361,7 @@ static int test__open_syscall_event_on_all_cpus(void)
evsel = perf_evsel__new(&attr, 0); evsel = perf_evsel__new(&attr, 0);
if (evsel == NULL) { if (evsel == NULL) {
pr_debug("perf_evsel__new\n"); pr_debug("perf_evsel__new\n");
goto out_cpu_free; goto out_thread_map_delete;
} }
if (perf_evsel__open(evsel, cpus, threads) < 0) { if (perf_evsel__open(evsel, cpus, threads) < 0) {
...@@ -379,14 +373,29 @@ static int test__open_syscall_event_on_all_cpus(void) ...@@ -379,14 +373,29 @@ static int test__open_syscall_event_on_all_cpus(void)
for (cpu = 0; cpu < cpus->nr; ++cpu) { for (cpu = 0; cpu < cpus->nr; ++cpu) {
unsigned int ncalls = nr_open_calls + cpu; unsigned int ncalls = nr_open_calls + cpu;
/*
* XXX eventually lift this restriction in a way that
* keeps perf building on older glibc installations
* without CPU_ALLOC. 1024 cpus in 2010 still seems
* a reasonable upper limit tho :-)
*/
if (cpus->map[cpu] >= CPU_SETSIZE) {
pr_debug("Ignoring CPU %d\n", cpus->map[cpu]);
continue;
}
CPU_SET(cpu, cpu_set); CPU_SET(cpus->map[cpu], &cpu_set);
sched_setaffinity(0, cpu_set_size, cpu_set); if (sched_setaffinity(0, sizeof(cpu_set), &cpu_set) < 0) {
pr_debug("sched_setaffinity() failed on CPU %d: %s ",
cpus->map[cpu],
strerror(errno));
goto out_close_fd;
}
for (i = 0; i < ncalls; ++i) { for (i = 0; i < ncalls; ++i) {
fd = open("/etc/passwd", O_RDONLY); fd = open("/etc/passwd", O_RDONLY);
close(fd); close(fd);
} }
CPU_CLR(cpu, cpu_set); CPU_CLR(cpus->map[cpu], &cpu_set);
} }
/* /*
...@@ -402,6 +411,9 @@ static int test__open_syscall_event_on_all_cpus(void) ...@@ -402,6 +411,9 @@ static int test__open_syscall_event_on_all_cpus(void)
for (cpu = 0; cpu < cpus->nr; ++cpu) { for (cpu = 0; cpu < cpus->nr; ++cpu) {
unsigned int expected; unsigned int expected;
if (cpus->map[cpu] >= CPU_SETSIZE)
continue;
if (perf_evsel__read_on_cpu(evsel, cpu, 0) < 0) { if (perf_evsel__read_on_cpu(evsel, cpu, 0) < 0) {
pr_debug("perf_evsel__open_read_on_cpu\n"); pr_debug("perf_evsel__open_read_on_cpu\n");
goto out_close_fd; goto out_close_fd;
...@@ -409,8 +421,8 @@ static int test__open_syscall_event_on_all_cpus(void) ...@@ -409,8 +421,8 @@ static int test__open_syscall_event_on_all_cpus(void)
expected = nr_open_calls + cpu; expected = nr_open_calls + cpu;
if (evsel->counts->cpu[cpu].val != expected) { if (evsel->counts->cpu[cpu].val != expected) {
pr_debug("perf_evsel__read_on_cpu: expected to intercept %d calls on cpu %d, got %Ld\n", pr_debug("perf_evsel__read_on_cpu: expected to intercept %d calls on cpu %d, got %" PRIu64 "\n",
expected, cpu, evsel->counts->cpu[cpu].val); expected, cpus->map[cpu], evsel->counts->cpu[cpu].val);
goto out_close_fd; goto out_close_fd;
} }
} }
...@@ -420,8 +432,6 @@ static int test__open_syscall_event_on_all_cpus(void) ...@@ -420,8 +432,6 @@ static int test__open_syscall_event_on_all_cpus(void)
perf_evsel__close_fd(evsel, 1, threads->nr); perf_evsel__close_fd(evsel, 1, threads->nr);
out_evsel_delete: out_evsel_delete:
perf_evsel__delete(evsel); perf_evsel__delete(evsel);
out_cpu_free:
CPU_FREE(cpu_set);
out_thread_map_delete: out_thread_map_delete:
thread_map__delete(threads); thread_map__delete(threads);
return err; return err;
......
...@@ -40,6 +40,7 @@ ...@@ -40,6 +40,7 @@
#include <stdio.h> #include <stdio.h>
#include <termios.h> #include <termios.h>
#include <unistd.h> #include <unistd.h>
#include <inttypes.h>
#include <errno.h> #include <errno.h>
#include <time.h> #include <time.h>
...@@ -214,7 +215,7 @@ static int parse_source(struct sym_entry *syme) ...@@ -214,7 +215,7 @@ static int parse_source(struct sym_entry *syme)
len = sym->end - sym->start; len = sym->end - sym->start;
sprintf(command, sprintf(command,
"objdump --start-address=%#0*Lx --stop-address=%#0*Lx -dS %s", "objdump --start-address=%#0*" PRIx64 " --stop-address=%#0*" PRIx64 " -dS %s",
BITS_PER_LONG / 4, map__rip_2objdump(map, sym->start), BITS_PER_LONG / 4, map__rip_2objdump(map, sym->start),
BITS_PER_LONG / 4, map__rip_2objdump(map, sym->end), path); BITS_PER_LONG / 4, map__rip_2objdump(map, sym->end), path);
...@@ -308,7 +309,7 @@ static void lookup_sym_source(struct sym_entry *syme) ...@@ -308,7 +309,7 @@ static void lookup_sym_source(struct sym_entry *syme)
struct source_line *line; struct source_line *line;
char pattern[PATTERN_LEN + 1]; char pattern[PATTERN_LEN + 1];
sprintf(pattern, "%0*Lx <", BITS_PER_LONG / 4, sprintf(pattern, "%0*" PRIx64 " <", BITS_PER_LONG / 4,
map__rip_2objdump(syme->map, symbol->start)); map__rip_2objdump(syme->map, symbol->start));
pthread_mutex_lock(&syme->src->lock); pthread_mutex_lock(&syme->src->lock);
...@@ -537,7 +538,7 @@ static void print_sym_table(void) ...@@ -537,7 +538,7 @@ static void print_sym_table(void)
if (nr_counters == 1 || !display_weighted) { if (nr_counters == 1 || !display_weighted) {
struct perf_evsel *first; struct perf_evsel *first;
first = list_entry(evsel_list.next, struct perf_evsel, node); first = list_entry(evsel_list.next, struct perf_evsel, node);
printf("%Ld", first->attr.sample_period); printf("%" PRIu64, (uint64_t)first->attr.sample_period);
if (freq) if (freq)
printf("Hz "); printf("Hz ");
else else
...@@ -640,7 +641,7 @@ static void print_sym_table(void) ...@@ -640,7 +641,7 @@ static void print_sym_table(void)
percent_color_fprintf(stdout, "%4.1f%%", pcnt); percent_color_fprintf(stdout, "%4.1f%%", pcnt);
if (verbose) if (verbose)
printf(" %016llx", sym->start); printf(" %016" PRIx64, sym->start);
printf(" %-*.*s", sym_width, sym_width, sym->name); printf(" %-*.*s", sym_width, sym_width, sym->name);
printf(" %-*.*s\n", dso_width, dso_width, printf(" %-*.*s\n", dso_width, dso_width,
dso_width >= syme->map->dso->long_name_len ? dso_width >= syme->map->dso->long_name_len ?
......
...@@ -459,7 +459,8 @@ int event__process_comm(event_t *self, struct sample_data *sample __used, ...@@ -459,7 +459,8 @@ int event__process_comm(event_t *self, struct sample_data *sample __used,
int event__process_lost(event_t *self, struct sample_data *sample __used, int event__process_lost(event_t *self, struct sample_data *sample __used,
struct perf_session *session) struct perf_session *session)
{ {
dump_printf(": id:%Ld: lost:%Ld\n", self->lost.id, self->lost.lost); dump_printf(": id:%" PRIu64 ": lost:%" PRIu64 "\n",
self->lost.id, self->lost.lost);
session->hists.stats.total_lost += self->lost.lost; session->hists.stats.total_lost += self->lost.lost;
return 0; return 0;
} }
...@@ -575,7 +576,7 @@ int event__process_mmap(event_t *self, struct sample_data *sample __used, ...@@ -575,7 +576,7 @@ int event__process_mmap(event_t *self, struct sample_data *sample __used,
u8 cpumode = self->header.misc & PERF_RECORD_MISC_CPUMODE_MASK; u8 cpumode = self->header.misc & PERF_RECORD_MISC_CPUMODE_MASK;
int ret = 0; int ret = 0;
dump_printf(" %d/%d: [%#Lx(%#Lx) @ %#Lx]: %s\n", dump_printf(" %d/%d: [%#" PRIx64 "(%#" PRIx64 ") @ %#" PRIx64 "]: %s\n",
self->mmap.pid, self->mmap.tid, self->mmap.start, self->mmap.pid, self->mmap.tid, self->mmap.start,
self->mmap.len, self->mmap.pgoff, self->mmap.filename); self->mmap.len, self->mmap.pgoff, self->mmap.filename);
......
...@@ -798,8 +798,8 @@ static int perf_file_section__process(struct perf_file_section *self, ...@@ -798,8 +798,8 @@ static int perf_file_section__process(struct perf_file_section *self,
int feat, int fd) int feat, int fd)
{ {
if (lseek(fd, self->offset, SEEK_SET) == (off_t)-1) { if (lseek(fd, self->offset, SEEK_SET) == (off_t)-1) {
pr_debug("Failed to lseek to %Ld offset for feature %d, " pr_debug("Failed to lseek to %" PRIu64 " offset for feature "
"continuing...\n", self->offset, feat); "%d, continuing...\n", self->offset, feat);
return 0; return 0;
} }
......
...@@ -636,13 +636,13 @@ int hist_entry__snprintf(struct hist_entry *self, char *s, size_t size, ...@@ -636,13 +636,13 @@ int hist_entry__snprintf(struct hist_entry *self, char *s, size_t size,
} }
} }
} else } else
ret = snprintf(s, size, sep ? "%lld" : "%12lld ", period); ret = snprintf(s, size, sep ? "%" PRIu64 : "%12" PRIu64 " ", period);
if (symbol_conf.show_nr_samples) { if (symbol_conf.show_nr_samples) {
if (sep) if (sep)
ret += snprintf(s + ret, size - ret, "%c%lld", *sep, period); ret += snprintf(s + ret, size - ret, "%c%" PRIu64, *sep, period);
else else
ret += snprintf(s + ret, size - ret, "%11lld", period); ret += snprintf(s + ret, size - ret, "%11" PRIu64, period);
} }
if (pair_hists) { if (pair_hists) {
...@@ -971,7 +971,7 @@ int hist_entry__inc_addr_samples(struct hist_entry *self, u64 ip) ...@@ -971,7 +971,7 @@ int hist_entry__inc_addr_samples(struct hist_entry *self, u64 ip)
sym_size = sym->end - sym->start; sym_size = sym->end - sym->start;
offset = ip - sym->start; offset = ip - sym->start;
pr_debug3("%s: ip=%#Lx\n", __func__, self->ms.map->unmap_ip(self->ms.map, ip)); pr_debug3("%s: ip=%#" PRIx64 "\n", __func__, self->ms.map->unmap_ip(self->ms.map, ip));
if (offset >= sym_size) if (offset >= sym_size)
return 0; return 0;
...@@ -980,8 +980,9 @@ int hist_entry__inc_addr_samples(struct hist_entry *self, u64 ip) ...@@ -980,8 +980,9 @@ int hist_entry__inc_addr_samples(struct hist_entry *self, u64 ip)
h->sum++; h->sum++;
h->ip[offset]++; h->ip[offset]++;
pr_debug3("%#Lx %s: period++ [ip: %#Lx, %#Lx] => %Ld\n", self->ms.sym->start, pr_debug3("%#" PRIx64 " %s: period++ [ip: %#" PRIx64 ", %#" PRIx64
self->ms.sym->name, ip, ip - self->ms.sym->start, h->ip[offset]); "] => %" PRIu64 "\n", self->ms.sym->start, self->ms.sym->name,
ip, ip - self->ms.sym->start, h->ip[offset]);
return 0; return 0;
} }
...@@ -1132,7 +1133,7 @@ int hist_entry__annotate(struct hist_entry *self, struct list_head *head, ...@@ -1132,7 +1133,7 @@ int hist_entry__annotate(struct hist_entry *self, struct list_head *head,
goto out_free_filename; goto out_free_filename;
} }
pr_debug("%s: filename=%s, sym=%s, start=%#Lx, end=%#Lx\n", __func__, pr_debug("%s: filename=%s, sym=%s, start=%#" PRIx64 ", end=%#" PRIx64 "\n", __func__,
filename, sym->name, map->unmap_ip(map, sym->start), filename, sym->name, map->unmap_ip(map, sym->start),
map->unmap_ip(map, sym->end)); map->unmap_ip(map, sym->end));
...@@ -1142,7 +1143,7 @@ int hist_entry__annotate(struct hist_entry *self, struct list_head *head, ...@@ -1142,7 +1143,7 @@ int hist_entry__annotate(struct hist_entry *self, struct list_head *head,
dso, dso->long_name, sym, sym->name); dso, dso->long_name, sym, sym->name);
snprintf(command, sizeof(command), snprintf(command, sizeof(command),
"objdump --start-address=0x%016Lx --stop-address=0x%016Lx -dS -C %s|grep -v %s|expand", "objdump --start-address=0x%016" PRIx64 " --stop-address=0x%016" PRIx64 " -dS -C %s|grep -v %s|expand",
map__rip_2objdump(map, sym->start), map__rip_2objdump(map, sym->start),
map__rip_2objdump(map, sym->end), map__rip_2objdump(map, sym->end),
symfs_filename, filename); symfs_filename, filename);
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
#define _PERF_LINUX_BITOPS_H_ #define _PERF_LINUX_BITOPS_H_
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/compiler.h>
#include <asm/hweight.h> #include <asm/hweight.h>
#define BITS_PER_LONG __WORDSIZE #define BITS_PER_LONG __WORDSIZE
......
#include "symbol.h" #include "symbol.h"
#include <errno.h> #include <errno.h>
#include <inttypes.h>
#include <limits.h> #include <limits.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
...@@ -195,7 +196,7 @@ int map__overlap(struct map *l, struct map *r) ...@@ -195,7 +196,7 @@ int map__overlap(struct map *l, struct map *r)
size_t map__fprintf(struct map *self, FILE *fp) size_t map__fprintf(struct map *self, FILE *fp)
{ {
return fprintf(fp, " %Lx-%Lx %Lx %s\n", return fprintf(fp, " %" PRIx64 "-%" PRIx64 " %" PRIx64 " %s\n",
self->start, self->end, self->pgoff, self->dso->name); self->start, self->end, self->pgoff, self->dso->name);
} }
......
...@@ -279,7 +279,7 @@ const char *__event_name(int type, u64 config) ...@@ -279,7 +279,7 @@ const char *__event_name(int type, u64 config)
static char buf[32]; static char buf[32];
if (type == PERF_TYPE_RAW) { if (type == PERF_TYPE_RAW) {
sprintf(buf, "raw 0x%llx", config); sprintf(buf, "raw 0x%" PRIx64, config);
return buf; return buf;
} }
......
...@@ -23,7 +23,7 @@ struct tracepoint_path { ...@@ -23,7 +23,7 @@ struct tracepoint_path {
}; };
extern struct tracepoint_path *tracepoint_id_to_path(u64 config); extern struct tracepoint_path *tracepoint_id_to_path(u64 config);
extern bool have_tracepoints(struct list_head *evsel_list); extern bool have_tracepoints(struct list_head *evlist);
extern int nr_counters; extern int nr_counters;
......
...@@ -172,7 +172,7 @@ static int kprobe_convert_to_perf_probe(struct probe_trace_point *tp, ...@@ -172,7 +172,7 @@ static int kprobe_convert_to_perf_probe(struct probe_trace_point *tp,
sym = __find_kernel_function_by_name(tp->symbol, &map); sym = __find_kernel_function_by_name(tp->symbol, &map);
if (sym) { if (sym) {
addr = map->unmap_ip(map, sym->start + tp->offset); addr = map->unmap_ip(map, sym->start + tp->offset);
pr_debug("try to find %s+%ld@%llx\n", tp->symbol, pr_debug("try to find %s+%ld@%" PRIx64 "\n", tp->symbol,
tp->offset, addr); tp->offset, addr);
ret = find_perf_probe_point((unsigned long)addr, pp); ret = find_perf_probe_point((unsigned long)addr, pp);
} }
......
...@@ -652,10 +652,11 @@ static void callchain__printf(struct sample_data *sample) ...@@ -652,10 +652,11 @@ static void callchain__printf(struct sample_data *sample)
{ {
unsigned int i; unsigned int i;
printf("... chain: nr:%Lu\n", sample->callchain->nr); printf("... chain: nr:%" PRIu64 "\n", sample->callchain->nr);
for (i = 0; i < sample->callchain->nr; i++) for (i = 0; i < sample->callchain->nr; i++)
printf("..... %2d: %016Lx\n", i, sample->callchain->ips[i]); printf("..... %2d: %016" PRIx64 "\n",
i, sample->callchain->ips[i]);
} }
static void perf_session__print_tstamp(struct perf_session *session, static void perf_session__print_tstamp(struct perf_session *session,
...@@ -672,7 +673,7 @@ static void perf_session__print_tstamp(struct perf_session *session, ...@@ -672,7 +673,7 @@ static void perf_session__print_tstamp(struct perf_session *session,
printf("%u ", sample->cpu); printf("%u ", sample->cpu);
if (session->sample_type & PERF_SAMPLE_TIME) if (session->sample_type & PERF_SAMPLE_TIME)
printf("%Lu ", sample->time); printf("%" PRIu64 " ", sample->time);
} }
static void dump_event(struct perf_session *session, event_t *event, static void dump_event(struct perf_session *session, event_t *event,
...@@ -681,16 +682,16 @@ static void dump_event(struct perf_session *session, event_t *event, ...@@ -681,16 +682,16 @@ static void dump_event(struct perf_session *session, event_t *event,
if (!dump_trace) if (!dump_trace)
return; return;
printf("\n%#Lx [%#x]: event: %d\n", file_offset, event->header.size, printf("\n%#" PRIx64 " [%#x]: event: %d\n",
event->header.type); file_offset, event->header.size, event->header.type);
trace_event(event); trace_event(event);
if (sample) if (sample)
perf_session__print_tstamp(session, event, sample); perf_session__print_tstamp(session, event, sample);
printf("%#Lx [%#x]: PERF_RECORD_%s", file_offset, event->header.size, printf("%#" PRIx64 " [%#x]: PERF_RECORD_%s", file_offset,
event__get_event_name(event->header.type)); event->header.size, event__get_event_name(event->header.type));
} }
static void dump_sample(struct perf_session *session, event_t *event, static void dump_sample(struct perf_session *session, event_t *event,
...@@ -699,8 +700,9 @@ static void dump_sample(struct perf_session *session, event_t *event, ...@@ -699,8 +700,9 @@ static void dump_sample(struct perf_session *session, event_t *event,
if (!dump_trace) if (!dump_trace)
return; return;
printf("(IP, %d): %d/%d: %#Lx period: %Ld\n", event->header.misc, printf("(IP, %d): %d/%d: %#" PRIx64 " period: %" PRIu64 "\n",
sample->pid, sample->tid, sample->ip, sample->period); event->header.misc, sample->pid, sample->tid, sample->ip,
sample->period);
if (session->sample_type & PERF_SAMPLE_CALLCHAIN) if (session->sample_type & PERF_SAMPLE_CALLCHAIN)
callchain__printf(sample); callchain__printf(sample);
...@@ -843,8 +845,8 @@ static void perf_session__warn_about_errors(const struct perf_session *session, ...@@ -843,8 +845,8 @@ static void perf_session__warn_about_errors(const struct perf_session *session,
{ {
if (ops->lost == event__process_lost && if (ops->lost == event__process_lost &&
session->hists.stats.total_lost != 0) { session->hists.stats.total_lost != 0) {
ui__warning("Processed %Lu events and LOST %Lu!\n\n" ui__warning("Processed %" PRIu64 " events and LOST %" PRIu64
"Check IO/CPU overload!\n\n", "!\n\nCheck IO/CPU overload!\n\n",
session->hists.stats.total_period, session->hists.stats.total_period,
session->hists.stats.total_lost); session->hists.stats.total_lost);
} }
...@@ -918,7 +920,7 @@ static int __perf_session__process_pipe_events(struct perf_session *self, ...@@ -918,7 +920,7 @@ static int __perf_session__process_pipe_events(struct perf_session *self,
if (size == 0 || if (size == 0 ||
(skip = perf_session__process_event(self, &event, ops, head)) < 0) { (skip = perf_session__process_event(self, &event, ops, head)) < 0) {
dump_printf("%#Lx [%#x]: skipping unknown header type: %d\n", dump_printf("%#" PRIx64 " [%#x]: skipping unknown header type: %d\n",
head, event.header.size, event.header.type); head, event.header.size, event.header.type);
/* /*
* assume we lost track of the stream, check alignment, and * assume we lost track of the stream, check alignment, and
...@@ -1023,7 +1025,7 @@ int __perf_session__process_events(struct perf_session *session, ...@@ -1023,7 +1025,7 @@ int __perf_session__process_events(struct perf_session *session,
if (size == 0 || if (size == 0 ||
perf_session__process_event(session, event, ops, file_pos) < 0) { perf_session__process_event(session, event, ops, file_pos) < 0) {
dump_printf("%#Lx [%#x]: skipping unknown header type: %d\n", dump_printf("%#" PRIx64 " [%#x]: skipping unknown header type: %d\n",
file_offset + head, event->header.size, file_offset + head, event->header.size,
event->header.type); event->header.type);
/* /*
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
* of the License. * of the License.
*/ */
#include <inttypes.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h> #include <unistd.h>
...@@ -43,11 +44,11 @@ static double cpu2y(int cpu) ...@@ -43,11 +44,11 @@ static double cpu2y(int cpu)
return cpu2slot(cpu) * SLOT_MULT; return cpu2slot(cpu) * SLOT_MULT;
} }
static double time2pixels(u64 time) static double time2pixels(u64 __time)
{ {
double X; double X;
X = 1.0 * svg_page_width * (time - first_time) / (last_time - first_time); X = 1.0 * svg_page_width * (__time - first_time) / (last_time - first_time);
return X; return X;
} }
...@@ -94,7 +95,7 @@ void open_svg(const char *filename, int cpus, int rows, u64 start, u64 end) ...@@ -94,7 +95,7 @@ void open_svg(const char *filename, int cpus, int rows, u64 start, u64 end)
total_height = (1 + rows + cpu2slot(cpus)) * SLOT_MULT; total_height = (1 + rows + cpu2slot(cpus)) * SLOT_MULT;
fprintf(svgfile, "<?xml version=\"1.0\" standalone=\"no\"?> \n"); fprintf(svgfile, "<?xml version=\"1.0\" standalone=\"no\"?> \n");
fprintf(svgfile, "<svg width=\"%i\" height=\"%llu\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\n", svg_page_width, total_height); fprintf(svgfile, "<svg width=\"%i\" height=\"%" PRIu64 "\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\n", svg_page_width, total_height);
fprintf(svgfile, "<defs>\n <style type=\"text/css\">\n <![CDATA[\n"); fprintf(svgfile, "<defs>\n <style type=\"text/css\">\n <![CDATA[\n");
...@@ -483,7 +484,7 @@ void svg_time_grid(void) ...@@ -483,7 +484,7 @@ void svg_time_grid(void)
color = 128; color = 128;
} }
fprintf(svgfile, "<line x1=\"%4.8f\" y1=\"%4.2f\" x2=\"%4.8f\" y2=\"%llu\" style=\"stroke:rgb(%i,%i,%i);stroke-width:%1.3f\"/>\n", fprintf(svgfile, "<line x1=\"%4.8f\" y1=\"%4.2f\" x2=\"%4.8f\" y2=\"%" PRIu64 "\" style=\"stroke:rgb(%i,%i,%i);stroke-width:%1.3f\"/>\n",
time2pixels(i), SLOT_MULT/2, time2pixels(i), total_height, color, color, color, thickness); time2pixels(i), SLOT_MULT/2, time2pixels(i), total_height, color, color, color, thickness);
i += 10000000; i += 10000000;
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include <sys/param.h> #include <sys/param.h>
#include <fcntl.h> #include <fcntl.h>
#include <unistd.h> #include <unistd.h>
#include <inttypes.h>
#include "build-id.h" #include "build-id.h"
#include "debug.h" #include "debug.h"
#include "symbol.h" #include "symbol.h"
...@@ -153,7 +154,7 @@ static struct symbol *symbol__new(u64 start, u64 len, u8 binding, ...@@ -153,7 +154,7 @@ static struct symbol *symbol__new(u64 start, u64 len, u8 binding,
self->binding = binding; self->binding = binding;
self->namelen = namelen - 1; self->namelen = namelen - 1;
pr_debug4("%s: %s %#Lx-%#Lx\n", __func__, name, start, self->end); pr_debug4("%s: %s %#" PRIx64 "-%#" PRIx64 "\n", __func__, name, start, self->end);
memcpy(self->name, name, namelen); memcpy(self->name, name, namelen);
...@@ -167,7 +168,7 @@ void symbol__delete(struct symbol *self) ...@@ -167,7 +168,7 @@ void symbol__delete(struct symbol *self)
static size_t symbol__fprintf(struct symbol *self, FILE *fp) static size_t symbol__fprintf(struct symbol *self, FILE *fp)
{ {
return fprintf(fp, " %llx-%llx %c %s\n", return fprintf(fp, " %" PRIx64 "-%" PRIx64 " %c %s\n",
self->start, self->end, self->start, self->end,
self->binding == STB_GLOBAL ? 'g' : self->binding == STB_GLOBAL ? 'g' :
self->binding == STB_LOCAL ? 'l' : 'w', self->binding == STB_LOCAL ? 'l' : 'w',
...@@ -1161,6 +1162,13 @@ static int dso__load_sym(struct dso *self, struct map *map, const char *name, ...@@ -1161,6 +1162,13 @@ static int dso__load_sym(struct dso *self, struct map *map, const char *name,
section_name = elf_sec__name(&shdr, secstrs); section_name = elf_sec__name(&shdr, secstrs);
/* On ARM, symbols for thumb functions have 1 added to
* the symbol address as a flag - remove it */
if ((ehdr.e_machine == EM_ARM) &&
(map->type == MAP__FUNCTION) &&
(sym.st_value & 1))
--sym.st_value;
if (self->kernel != DSO_TYPE_USER || kmodule) { if (self->kernel != DSO_TYPE_USER || kmodule) {
char dso_name[PATH_MAX]; char dso_name[PATH_MAX];
...@@ -1208,8 +1216,8 @@ static int dso__load_sym(struct dso *self, struct map *map, const char *name, ...@@ -1208,8 +1216,8 @@ static int dso__load_sym(struct dso *self, struct map *map, const char *name,
} }
if (curr_dso->adjust_symbols) { if (curr_dso->adjust_symbols) {
pr_debug4("%s: adjusting symbol: st_value: %#Lx " pr_debug4("%s: adjusting symbol: st_value: %#" PRIx64 " "
"sh_addr: %#Lx sh_offset: %#Lx\n", __func__, "sh_addr: %#" PRIx64 " sh_offset: %#" PRIx64 "\n", __func__,
(u64)sym.st_value, (u64)shdr.sh_addr, (u64)sym.st_value, (u64)shdr.sh_addr,
(u64)shdr.sh_offset); (u64)shdr.sh_offset);
sym.st_value -= shdr.sh_addr - shdr.sh_offset; sym.st_value -= shdr.sh_addr - shdr.sh_offset;
......
#ifndef __PERF_TYPES_H #ifndef __PERF_TYPES_H
#define __PERF_TYPES_H #define __PERF_TYPES_H
#include <stdint.h>
/* /*
* We define u64 as unsigned long long for every architecture * We define u64 as uint64_t for every architecture
* so that we can print it with %Lx without getting warnings. * so that we can print it with "%"PRIx64 without getting warnings.
*/ */
typedef unsigned long long u64; typedef uint64_t u64;
typedef signed long long s64; typedef int64_t s64;
typedef unsigned int u32; typedef unsigned int u32;
typedef signed int s32; typedef signed int s32;
typedef unsigned short u16; typedef unsigned short u16;
......
...@@ -350,7 +350,7 @@ static char *callchain_list__sym_name(struct callchain_list *self, ...@@ -350,7 +350,7 @@ static char *callchain_list__sym_name(struct callchain_list *self,
if (self->ms.sym) if (self->ms.sym)
return self->ms.sym->name; return self->ms.sym->name;
snprintf(bf, bfsize, "%#Lx", self->ip); snprintf(bf, bfsize, "%#" PRIx64, self->ip);
return bf; return bf;
} }
......
#include "../libslang.h" #include "../libslang.h"
#include <elf.h> #include <elf.h>
#include <inttypes.h>
#include <sys/ttydefaults.h> #include <sys/ttydefaults.h>
#include <ctype.h> #include <ctype.h>
#include <string.h> #include <string.h>
...@@ -57,7 +58,7 @@ static void map_browser__write(struct ui_browser *self, void *nd, int row) ...@@ -57,7 +58,7 @@ static void map_browser__write(struct ui_browser *self, void *nd, int row)
int width; int width;
ui_browser__set_percent_color(self, 0, current_entry); ui_browser__set_percent_color(self, 0, current_entry);
slsmg_printf("%*llx %*llx %c ", slsmg_printf("%*" PRIx64 " %*" PRIx64 " %c ",
mb->addrlen, sym->start, mb->addrlen, sym->end, mb->addrlen, sym->start, mb->addrlen, sym->end,
sym->binding == STB_GLOBAL ? 'g' : sym->binding == STB_GLOBAL ? 'g' :
sym->binding == STB_LOCAL ? 'l' : 'w'); sym->binding == STB_LOCAL ? 'l' : 'w');
...@@ -150,6 +151,6 @@ int map__browse(struct map *self) ...@@ -150,6 +151,6 @@ int map__browse(struct map *self)
++mb.b.nr_entries; ++mb.b.nr_entries;
} }
mb.addrlen = snprintf(tmp, sizeof(tmp), "%llx", maxaddr); mb.addrlen = snprintf(tmp, sizeof(tmp), "%" PRIx64, maxaddr);
return map_browser__run(&mb); return map_browser__run(&mb);
} }
...@@ -150,7 +150,7 @@ static void perf_read_values__display_pretty(FILE *fp, ...@@ -150,7 +150,7 @@ static void perf_read_values__display_pretty(FILE *fp,
if (width > tidwidth) if (width > tidwidth)
tidwidth = width; tidwidth = width;
for (j = 0; j < values->counters; j++) { for (j = 0; j < values->counters; j++) {
width = snprintf(NULL, 0, "%Lu", values->value[i][j]); width = snprintf(NULL, 0, "%" PRIu64, values->value[i][j]);
if (width > counterwidth[j]) if (width > counterwidth[j])
counterwidth[j] = width; counterwidth[j] = width;
} }
...@@ -165,7 +165,7 @@ static void perf_read_values__display_pretty(FILE *fp, ...@@ -165,7 +165,7 @@ static void perf_read_values__display_pretty(FILE *fp,
fprintf(fp, " %*d %*d", pidwidth, values->pid[i], fprintf(fp, " %*d %*d", pidwidth, values->pid[i],
tidwidth, values->tid[i]); tidwidth, values->tid[i]);
for (j = 0; j < values->counters; j++) for (j = 0; j < values->counters; j++)
fprintf(fp, " %*Lu", fprintf(fp, " %*" PRIu64,
counterwidth[j], values->value[i][j]); counterwidth[j], values->value[i][j]);
fprintf(fp, "\n"); fprintf(fp, "\n");
} }
...@@ -196,13 +196,13 @@ static void perf_read_values__display_raw(FILE *fp, ...@@ -196,13 +196,13 @@ static void perf_read_values__display_raw(FILE *fp,
width = strlen(values->countername[j]); width = strlen(values->countername[j]);
if (width > namewidth) if (width > namewidth)
namewidth = width; namewidth = width;
width = snprintf(NULL, 0, "%llx", values->counterrawid[j]); width = snprintf(NULL, 0, "%" PRIx64, values->counterrawid[j]);
if (width > rawwidth) if (width > rawwidth)
rawwidth = width; rawwidth = width;
} }
for (i = 0; i < values->threads; i++) { for (i = 0; i < values->threads; i++) {
for (j = 0; j < values->counters; j++) { for (j = 0; j < values->counters; j++) {
width = snprintf(NULL, 0, "%Lu", values->value[i][j]); width = snprintf(NULL, 0, "%" PRIu64, values->value[i][j]);
if (width > countwidth) if (width > countwidth)
countwidth = width; countwidth = width;
} }
...@@ -214,7 +214,7 @@ static void perf_read_values__display_raw(FILE *fp, ...@@ -214,7 +214,7 @@ static void perf_read_values__display_raw(FILE *fp,
countwidth, "Count"); countwidth, "Count");
for (i = 0; i < values->threads; i++) for (i = 0; i < values->threads; i++)
for (j = 0; j < values->counters; j++) for (j = 0; j < values->counters; j++)
fprintf(fp, " %*d %*d %*s %*llx %*Lu\n", fprintf(fp, " %*d %*d %*s %*" PRIx64 " %*" PRIu64,
pidwidth, values->pid[i], pidwidth, values->pid[i],
tidwidth, values->tid[i], tidwidth, values->tid[i],
namewidth, values->countername[j], namewidth, values->countername[j],
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment