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
This commit is contained in:
@@ -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)
|
|||||||
|
|
||||||
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)
|
|||||||
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);
|
|||||||
#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);
|
|||||||
#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__
|
||||||
|
@@ -1,3 +1,4 @@
|
|||||||
|
#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,
|
|||||||
}
|
}
|
||||||
|
|
||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} 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,
|
|||||||
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,
|
|||||||
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));
|
||||||
}
|
}
|
||||||
|
1
tools/perf/util/include/asm/unistd_32.h
Normal file
1
tools/perf/util/include/asm/unistd_32.h
Normal file
@@ -0,0 +1 @@
|
|||||||
|
|
1
tools/perf/util/include/asm/unistd_64.h
Normal file
1
tools/perf/util/include/asm/unistd_64.h
Normal file
@@ -0,0 +1 @@
|
|||||||
|
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
#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, ...)
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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)
|
|||||||
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;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user