Commit 96ee0499 authored by Linus Torvalds's avatar Linus Torvalds

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

Pull perf fixes from Ingo Molnar.

* 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  perf tools, x86: Build perf on older user-space as well
  perf tools: Use scnprintf where applicable
  perf tools: Incorrect use of snprintf results in SEGV
parents cb1ecf25 89c5bd08
...@@ -249,6 +249,8 @@ LIB_H += util/include/asm/uaccess.h ...@@ -249,6 +249,8 @@ LIB_H += util/include/asm/uaccess.h
LIB_H += util/include/dwarf-regs.h LIB_H += util/include/dwarf-regs.h
LIB_H += util/include/asm/dwarf2.h LIB_H += util/include/asm/dwarf2.h
LIB_H += util/include/asm/cpufeature.h LIB_H += util/include/asm/cpufeature.h
LIB_H += util/include/asm/unistd_32.h
LIB_H += util/include/asm/unistd_64.h
LIB_H += perf.h LIB_H += perf.h
LIB_H += util/annotate.h LIB_H += util/annotate.h
LIB_H += util/cache.h LIB_H += util/cache.h
......
...@@ -25,7 +25,7 @@ get_cpuid(char *buffer, size_t sz) ...@@ -25,7 +25,7 @@ get_cpuid(char *buffer, size_t sz)
pvr = mfspr(SPRN_PVR); pvr = mfspr(SPRN_PVR);
nb = snprintf(buffer, sz, "%lu,%lu$", PVR_VER(pvr), PVR_REV(pvr)); nb = scnprintf(buffer, sz, "%lu,%lu$", PVR_VER(pvr), PVR_REV(pvr));
/* look for end marker to ensure the entire data fit */ /* look for end marker to ensure the entire data fit */
if (strchr(buffer, '$')) { if (strchr(buffer, '$')) {
......
...@@ -48,7 +48,7 @@ get_cpuid(char *buffer, size_t sz) ...@@ -48,7 +48,7 @@ get_cpuid(char *buffer, size_t sz)
if (family >= 0x6) if (family >= 0x6)
model += ((a >> 16) & 0xf) << 4; model += ((a >> 16) & 0xf) << 4;
} }
nb = snprintf(buffer, sz, "%s,%u,%u,%u$", vendor, family, model, step); nb = scnprintf(buffer, sz, "%s,%u,%u,%u$", vendor, family, model, step);
/* look for end marker to ensure the entire data fit */ /* look for end marker to ensure the entire data fit */
if (strchr(buffer, '$')) { if (strchr(buffer, '$')) {
......
...@@ -10,6 +10,9 @@ void get_term_dimensions(struct winsize *ws); ...@@ -10,6 +10,9 @@ void get_term_dimensions(struct winsize *ws);
#define rmb() asm volatile("lock; addl $0,0(%%esp)" ::: "memory") #define rmb() asm volatile("lock; addl $0,0(%%esp)" ::: "memory")
#define cpu_relax() asm volatile("rep; nop" ::: "memory"); #define cpu_relax() asm volatile("rep; nop" ::: "memory");
#define CPUINFO_PROC "model name" #define CPUINFO_PROC "model name"
#ifndef __NR_perf_event_open
# define __NR_perf_event_open 336
#endif
#endif #endif
#if defined(__x86_64__) #if defined(__x86_64__)
...@@ -17,6 +20,9 @@ void get_term_dimensions(struct winsize *ws); ...@@ -17,6 +20,9 @@ void get_term_dimensions(struct winsize *ws);
#define rmb() asm volatile("lfence" ::: "memory") #define rmb() asm volatile("lfence" ::: "memory")
#define cpu_relax() asm volatile("rep; nop" ::: "memory"); #define cpu_relax() asm volatile("rep; nop" ::: "memory");
#define CPUINFO_PROC "model name" #define CPUINFO_PROC "model name"
#ifndef __NR_perf_event_open
# define __NR_perf_event_open 298
#endif
#endif #endif
#ifdef __powerpc__ #ifdef __powerpc__
......
#include <linux/kernel.h>
#include "cache.h" #include "cache.h"
#include "color.h" #include "color.h"
...@@ -182,12 +183,12 @@ static int __color_vsnprintf(char *bf, size_t size, const char *color, ...@@ -182,12 +183,12 @@ static int __color_vsnprintf(char *bf, size_t size, const char *color,
} }
if (perf_use_color_default && *color) if (perf_use_color_default && *color)
r += snprintf(bf, size, "%s", color); r += scnprintf(bf, size, "%s", color);
r += vsnprintf(bf + r, size - r, fmt, args); r += vscnprintf(bf + r, size - r, fmt, args);
if (perf_use_color_default && *color) if (perf_use_color_default && *color)
r += snprintf(bf + r, size - r, "%s", PERF_COLOR_RESET); r += scnprintf(bf + r, size - r, "%s", PERF_COLOR_RESET);
if (trail) if (trail)
r += snprintf(bf + r, size - r, "%s", trail); r += scnprintf(bf + r, size - r, "%s", trail);
return r; return r;
} }
......
...@@ -280,7 +280,7 @@ int build_id_cache__add_s(const char *sbuild_id, const char *debugdir, ...@@ -280,7 +280,7 @@ int build_id_cache__add_s(const char *sbuild_id, const char *debugdir,
if (realname == NULL || filename == NULL || linkname == NULL) if (realname == NULL || filename == NULL || linkname == NULL)
goto out_free; goto out_free;
len = snprintf(filename, size, "%s%s%s", len = scnprintf(filename, size, "%s%s%s",
debugdir, is_kallsyms ? "/" : "", realname); debugdir, is_kallsyms ? "/" : "", realname);
if (mkdir_p(filename, 0755)) if (mkdir_p(filename, 0755))
goto out_free; goto out_free;
...@@ -295,7 +295,7 @@ int build_id_cache__add_s(const char *sbuild_id, const char *debugdir, ...@@ -295,7 +295,7 @@ int build_id_cache__add_s(const char *sbuild_id, const char *debugdir,
goto out_free; goto out_free;
} }
len = snprintf(linkname, size, "%s/.build-id/%.2s", len = scnprintf(linkname, size, "%s/.build-id/%.2s",
debugdir, sbuild_id); debugdir, sbuild_id);
if (access(linkname, X_OK) && mkdir_p(linkname, 0755)) if (access(linkname, X_OK) && mkdir_p(linkname, 0755))
......
...@@ -768,7 +768,7 @@ static int hist_entry__pcnt_snprintf(struct hist_entry *he, char *s, ...@@ -768,7 +768,7 @@ static int hist_entry__pcnt_snprintf(struct hist_entry *he, char *s,
sep ? "%.2f" : " %6.2f%%", sep ? "%.2f" : " %6.2f%%",
(period * 100.0) / total); (period * 100.0) / total);
else else
ret = snprintf(s, size, sep ? "%.2f" : " %6.2f%%", ret = scnprintf(s, size, sep ? "%.2f" : " %6.2f%%",
(period * 100.0) / total); (period * 100.0) / total);
if (symbol_conf.show_cpu_utilization) { if (symbol_conf.show_cpu_utilization) {
ret += percent_color_snprintf(s + ret, size - ret, ret += percent_color_snprintf(s + ret, size - ret,
...@@ -791,20 +791,20 @@ static int hist_entry__pcnt_snprintf(struct hist_entry *he, char *s, ...@@ -791,20 +791,20 @@ static int hist_entry__pcnt_snprintf(struct hist_entry *he, char *s,
} }
} }
} else } else
ret = snprintf(s, size, sep ? "%" PRIu64 : "%12" PRIu64 " ", period); ret = scnprintf(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%" PRIu64, *sep, nr_events); ret += scnprintf(s + ret, size - ret, "%c%" PRIu64, *sep, nr_events);
else else
ret += snprintf(s + ret, size - ret, "%11" PRIu64, nr_events); ret += scnprintf(s + ret, size - ret, "%11" PRIu64, nr_events);
} }
if (symbol_conf.show_total_period) { if (symbol_conf.show_total_period) {
if (sep) if (sep)
ret += snprintf(s + ret, size - ret, "%c%" PRIu64, *sep, period); ret += scnprintf(s + ret, size - ret, "%c%" PRIu64, *sep, period);
else else
ret += snprintf(s + ret, size - ret, " %12" PRIu64, period); ret += scnprintf(s + ret, size - ret, " %12" PRIu64, period);
} }
if (pair_hists) { if (pair_hists) {
...@@ -819,25 +819,25 @@ static int hist_entry__pcnt_snprintf(struct hist_entry *he, char *s, ...@@ -819,25 +819,25 @@ static int hist_entry__pcnt_snprintf(struct hist_entry *he, char *s,
diff = new_percent - old_percent; diff = new_percent - old_percent;
if (fabs(diff) >= 0.01) if (fabs(diff) >= 0.01)
snprintf(bf, sizeof(bf), "%+4.2F%%", diff); ret += scnprintf(bf, sizeof(bf), "%+4.2F%%", diff);
else else
snprintf(bf, sizeof(bf), " "); ret += scnprintf(bf, sizeof(bf), " ");
if (sep) if (sep)
ret += snprintf(s + ret, size - ret, "%c%s", *sep, bf); ret += scnprintf(s + ret, size - ret, "%c%s", *sep, bf);
else else
ret += snprintf(s + ret, size - ret, "%11.11s", bf); ret += scnprintf(s + ret, size - ret, "%11.11s", bf);
if (show_displacement) { if (show_displacement) {
if (displacement) if (displacement)
snprintf(bf, sizeof(bf), "%+4ld", displacement); ret += scnprintf(bf, sizeof(bf), "%+4ld", displacement);
else else
snprintf(bf, sizeof(bf), " "); ret += scnprintf(bf, sizeof(bf), " ");
if (sep) if (sep)
ret += snprintf(s + ret, size - ret, "%c%s", *sep, bf); ret += scnprintf(s + ret, size - ret, "%c%s", *sep, bf);
else else
ret += snprintf(s + ret, size - ret, "%6.6s", bf); ret += scnprintf(s + ret, size - ret, "%6.6s", bf);
} }
} }
...@@ -855,7 +855,7 @@ int hist_entry__snprintf(struct hist_entry *he, char *s, size_t size, ...@@ -855,7 +855,7 @@ int hist_entry__snprintf(struct hist_entry *he, char *s, size_t size,
if (se->elide) if (se->elide)
continue; continue;
ret += snprintf(s + ret, size - ret, "%s", sep ?: " "); ret += scnprintf(s + ret, size - ret, "%s", sep ?: " ");
ret += se->se_snprintf(he, s + ret, size - ret, ret += se->se_snprintf(he, s + ret, size - ret,
hists__col_len(hists, se->se_width_idx)); hists__col_len(hists, se->se_width_idx));
} }
......
...@@ -33,6 +33,9 @@ static int repsep_snprintf(char *bf, size_t size, const char *fmt, ...) ...@@ -33,6 +33,9 @@ static int repsep_snprintf(char *bf, size_t size, const char *fmt, ...)
} }
} }
va_end(ap); va_end(ap);
if (n >= (int)size)
return size - 1;
return n; return n;
} }
......
#include "cache.h" #include "cache.h"
#include <linux/kernel.h>
int prefixcmp(const char *str, const char *prefix) int prefixcmp(const char *str, const char *prefix)
{ {
...@@ -89,14 +90,14 @@ void strbuf_addf(struct strbuf *sb, const char *fmt, ...) ...@@ -89,14 +90,14 @@ void strbuf_addf(struct strbuf *sb, const char *fmt, ...)
if (!strbuf_avail(sb)) if (!strbuf_avail(sb))
strbuf_grow(sb, 64); strbuf_grow(sb, 64);
va_start(ap, fmt); va_start(ap, fmt);
len = vsnprintf(sb->buf + sb->len, sb->alloc - sb->len, fmt, ap); len = vscnprintf(sb->buf + sb->len, sb->alloc - sb->len, fmt, ap);
va_end(ap); va_end(ap);
if (len < 0) if (len < 0)
die("your vsnprintf is broken"); die("your vscnprintf is broken");
if (len > strbuf_avail(sb)) { if (len > strbuf_avail(sb)) {
strbuf_grow(sb, len); strbuf_grow(sb, len);
va_start(ap, fmt); va_start(ap, fmt);
len = vsnprintf(sb->buf + sb->len, sb->alloc - sb->len, fmt, ap); len = vscnprintf(sb->buf + sb->len, sb->alloc - sb->len, fmt, ap);
va_end(ap); va_end(ap);
if (len > strbuf_avail(sb)) { if (len > strbuf_avail(sb)) {
die("this should not happen, your snprintf is broken"); die("this should not happen, your snprintf is broken");
......
...@@ -837,15 +837,15 @@ static int hists__browser_title(struct hists *self, char *bf, size_t size, ...@@ -837,15 +837,15 @@ static int hists__browser_title(struct hists *self, char *bf, size_t size,
unsigned long nr_events = self->stats.nr_events[PERF_RECORD_SAMPLE]; unsigned long nr_events = self->stats.nr_events[PERF_RECORD_SAMPLE];
nr_events = convert_unit(nr_events, &unit); nr_events = convert_unit(nr_events, &unit);
printed = snprintf(bf, size, "Events: %lu%c %s", nr_events, unit, ev_name); printed = scnprintf(bf, size, "Events: %lu%c %s", nr_events, unit, ev_name);
if (thread) if (thread)
printed += snprintf(bf + printed, size - printed, printed += scnprintf(bf + printed, size - printed,
", Thread: %s(%d)", ", Thread: %s(%d)",
(thread->comm_set ? thread->comm : ""), (thread->comm_set ? thread->comm : ""),
thread->pid); thread->pid);
if (dso) if (dso)
printed += snprintf(bf + printed, size - printed, printed += scnprintf(bf + printed, size - printed,
", DSO: %s", dso->short_name); ", DSO: %s", dso->short_name);
return printed; return printed;
} }
...@@ -1095,7 +1095,7 @@ static void perf_evsel_menu__write(struct ui_browser *browser, ...@@ -1095,7 +1095,7 @@ static void perf_evsel_menu__write(struct ui_browser *browser,
HE_COLORSET_NORMAL); HE_COLORSET_NORMAL);
nr_events = convert_unit(nr_events, &unit); nr_events = convert_unit(nr_events, &unit);
printed = snprintf(bf, sizeof(bf), "%lu%c%s%s", nr_events, printed = scnprintf(bf, sizeof(bf), "%lu%c%s%s", nr_events,
unit, unit == ' ' ? "" : " ", ev_name); unit, unit == ' ' ? "" : " ", ev_name);
slsmg_printf("%s", bf); slsmg_printf("%s", bf);
...@@ -1105,8 +1105,8 @@ static void perf_evsel_menu__write(struct ui_browser *browser, ...@@ -1105,8 +1105,8 @@ static void perf_evsel_menu__write(struct ui_browser *browser,
if (!current_entry) if (!current_entry)
ui_browser__set_color(browser, HE_COLORSET_TOP); ui_browser__set_color(browser, HE_COLORSET_TOP);
nr_events = convert_unit(nr_events, &unit); nr_events = convert_unit(nr_events, &unit);
snprintf(bf, sizeof(bf), ": %ld%c%schunks LOST!", nr_events, printed += scnprintf(bf, sizeof(bf), ": %ld%c%schunks LOST!",
unit, unit == ' ' ? "" : " "); nr_events, unit, unit == ' ' ? "" : " ");
warn = bf; warn = bf;
} }
......
...@@ -64,7 +64,7 @@ int ui_helpline__show_help(const char *format, va_list ap) ...@@ -64,7 +64,7 @@ int ui_helpline__show_help(const char *format, va_list ap)
static int backlog; static int backlog;
pthread_mutex_lock(&ui__lock); pthread_mutex_lock(&ui__lock);
ret = vsnprintf(ui_helpline__last_msg + backlog, ret = vscnprintf(ui_helpline__last_msg + backlog,
sizeof(ui_helpline__last_msg) - backlog, format, ap); sizeof(ui_helpline__last_msg) - backlog, format, ap);
backlog += ret; backlog += ret;
......
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