perf/core fixes:
. Fix JIT symbol resolution on heap (Namhyung Kim) . Fix wrong SVG height in 'timechart' (Stanislav Fomichev) . Free temp cpu_map in perf_session__cpu_bitmap (Stanislav Fomichev) . Fix NULL pointer reference bug with event unit in 'stat' (Stephane Eranian) . Fix memory corruption of xyarray when cpumask is used (Stephane Eranian) . Ensure sscanf does not overrun the "mem" field (Alan Cox) . Add support for the xtensa architecture (Baruch Siach) Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.15 (GNU/Linux) iQIcBAABAgAGBQJS3tr7AAoJENZQFvNTUqpAzFQP/RuXc7jkctPMQxxD6MycUZIz CjcX0/RM8/LlnAF5LBR5R5zRgU2QdnrAI6VzbttpNOCyBLRa4pw4q//B0wyI+IHa Ln9glr6jXt56Rc9WmPDfQWVKUdf2U/da4cYiMO5r7NSMiUcnuxPCzdxlJsCc8BYI hI1VaP9lL+thb5SOaCVival/u5H/05yARb73wtiMH1teAilBfghJE8HHMiPqOSbB W6G6nh1L6zEGCtL4DuP21761ciLSLRwC2ldy0H1NcflAsct1YOjiCYhiomGhnHIS 7/iXApOcX9tXpU2xVdFu/dZ6mjZNai/HUoaG+8hH4Tn8PhsSIyLSIRs7FBWTkBvS MZQGEGrnFRNK7a8jm/J+ea41ggefKw8Jyb4uqmYe7niAfBlgCBmwdQAvGzJcWWGU 5Mr4ZQ77fhT2b0BniCvnSX5V/gmXLo9KftPktsTm/WUuZFraNlzhRKbV51Zcbxqx nSK+f2Bige5dZvlj38b1nlrSm97QDzht3g25lODlE4ZKNBCTW6lAYaavjLJqctEC 78TQuMQHOiGCLpTDLqGZT0T/ffAcT2OyVGrVKxmYiP3Lajxk4DtIjloxJBFGS8bm o20hyXSFzbras1M785eeYqJfCdIXP+/eXNfW09dgOG0ouzxi/m+X9I0CkYBK1Cdn joAswmXP7JhhBpIzL6Dk =8s1p -----END PGP SIGNATURE----- Merge tag 'perf-core-for-mingo' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/urgent Pull perf tooling fixes and updates from Arnaldo Carvalho de Melo: * Fix JIT symbol resolution on heap (Namhyung Kim) * Fix wrong SVG height in 'timechart' (Stanislav Fomichev) * Free temp cpu_map in perf_session__cpu_bitmap (Stanislav Fomichev) * Fix NULL pointer reference bug with event unit in 'stat' (Stephane Eranian) * Fix memory corruption of xyarray when cpumask is used (Stephane Eranian) * Ensure sscanf does not overrun the "mem" field (Alan Cox) * Add support for the xtensa architecture (Baruch Siach) Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
commit
bb236de5d9
|
@ -1045,6 +1045,9 @@ static void write_svg_file(struct timechart *tchart, const char *filename)
|
|||
thresh /= 10;
|
||||
} while (!process_filter && thresh && count < tchart->proc_num);
|
||||
|
||||
if (!tchart->proc_num)
|
||||
count = 0;
|
||||
|
||||
open_svg(filename, tchart->numcpus, count, tchart->first_time, tchart->last_time);
|
||||
|
||||
svg_time_grid();
|
||||
|
|
|
@ -132,6 +132,13 @@
|
|||
#define CPUINFO_PROC "CPU"
|
||||
#endif
|
||||
|
||||
#ifdef __xtensa__
|
||||
#define mb() asm volatile("memw" ::: "memory")
|
||||
#define wmb() asm volatile("memw" ::: "memory")
|
||||
#define rmb() asm volatile("" ::: "memory")
|
||||
#define CPUINFO_PROC "core ID"
|
||||
#endif
|
||||
|
||||
#define barrier() asm volatile ("" ::: "memory")
|
||||
|
||||
#ifndef cpu_relax
|
||||
|
|
|
@ -1003,9 +1003,12 @@ void perf_evlist__close(struct perf_evlist *evlist)
|
|||
struct perf_evsel *evsel;
|
||||
int ncpus = cpu_map__nr(evlist->cpus);
|
||||
int nthreads = thread_map__nr(evlist->threads);
|
||||
int n;
|
||||
|
||||
evlist__for_each_reverse(evlist, evsel)
|
||||
perf_evsel__close(evsel, ncpus, nthreads);
|
||||
evlist__for_each_reverse(evlist, evsel) {
|
||||
n = evsel->cpus ? evsel->cpus->nr : ncpus;
|
||||
perf_evsel__close(evsel, n, nthreads);
|
||||
}
|
||||
}
|
||||
|
||||
int perf_evlist__open(struct perf_evlist *evlist)
|
||||
|
|
|
@ -1081,7 +1081,6 @@ void perf_evsel__close(struct perf_evsel *evsel, int ncpus, int nthreads)
|
|||
|
||||
perf_evsel__close_fd(evsel, ncpus, nthreads);
|
||||
perf_evsel__free_fd(evsel);
|
||||
evsel->fd = NULL;
|
||||
}
|
||||
|
||||
static struct {
|
||||
|
|
|
@ -930,7 +930,7 @@ static int write_topo_node(int fd, int node)
|
|||
/* skip over invalid lines */
|
||||
if (!strchr(buf, ':'))
|
||||
continue;
|
||||
if (sscanf(buf, "%*s %*d %s %"PRIu64, field, &mem) != 2)
|
||||
if (sscanf(buf, "%*s %*d %31s %"PRIu64, field, &mem) != 2)
|
||||
goto done;
|
||||
if (!strcmp(field, "MemTotal:"))
|
||||
mem_total = mem;
|
||||
|
|
|
@ -69,7 +69,7 @@ struct map *map__new(struct list_head *dsos__list, u64 start, u64 len,
|
|||
map->ino = ino;
|
||||
map->ino_generation = ino_gen;
|
||||
|
||||
if (anon) {
|
||||
if ((anon || no_dso) && type == MAP__FUNCTION) {
|
||||
snprintf(newfilename, sizeof(newfilename), "/tmp/perf-%d.map", pid);
|
||||
filename = newfilename;
|
||||
}
|
||||
|
@ -93,7 +93,7 @@ struct map *map__new(struct list_head *dsos__list, u64 start, u64 len,
|
|||
* functions still return NULL, and we avoid the
|
||||
* unnecessary map__load warning.
|
||||
*/
|
||||
if (no_dso)
|
||||
if (type != MAP__FUNCTION)
|
||||
dso__set_loaded(dso, map->type);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -635,7 +635,7 @@ int parse_events_add_pmu(struct list_head *list, int *idx,
|
|||
struct perf_event_attr attr;
|
||||
struct perf_pmu *pmu;
|
||||
struct perf_evsel *evsel;
|
||||
char *unit;
|
||||
const char *unit;
|
||||
double scale;
|
||||
|
||||
pmu = perf_pmu__find(name);
|
||||
|
|
|
@ -105,7 +105,7 @@ static int perf_pmu__parse_scale(struct perf_pmu_alias *alias, char *dir, char *
|
|||
char scale[128];
|
||||
int fd, ret = -1;
|
||||
char path[PATH_MAX];
|
||||
char *lc;
|
||||
const char *lc;
|
||||
|
||||
snprintf(path, PATH_MAX, "%s/%s.scale", dir, name);
|
||||
|
||||
|
@ -609,7 +609,7 @@ static struct perf_pmu_alias *pmu_find_alias(struct perf_pmu *pmu,
|
|||
|
||||
|
||||
static int check_unit_scale(struct perf_pmu_alias *alias,
|
||||
char **unit, double *scale)
|
||||
const char **unit, double *scale)
|
||||
{
|
||||
/*
|
||||
* Only one term in event definition can
|
||||
|
@ -634,14 +634,18 @@ static int check_unit_scale(struct perf_pmu_alias *alias,
|
|||
* defined for the alias
|
||||
*/
|
||||
int perf_pmu__check_alias(struct perf_pmu *pmu, struct list_head *head_terms,
|
||||
char **unit, double *scale)
|
||||
const char **unit, double *scale)
|
||||
{
|
||||
struct parse_events_term *term, *h;
|
||||
struct perf_pmu_alias *alias;
|
||||
int ret;
|
||||
|
||||
/*
|
||||
* Mark unit and scale as not set
|
||||
* (different from default values, see below)
|
||||
*/
|
||||
*unit = NULL;
|
||||
*scale = 0;
|
||||
*scale = 0.0;
|
||||
|
||||
list_for_each_entry_safe(term, h, head_terms, list) {
|
||||
alias = pmu_find_alias(pmu, term);
|
||||
|
@ -658,6 +662,18 @@ int perf_pmu__check_alias(struct perf_pmu *pmu, struct list_head *head_terms,
|
|||
list_del(&term->list);
|
||||
free(term);
|
||||
}
|
||||
|
||||
/*
|
||||
* if no unit or scale foundin aliases, then
|
||||
* set defaults as for evsel
|
||||
* unit cannot left to NULL
|
||||
*/
|
||||
if (*unit == NULL)
|
||||
*unit = "";
|
||||
|
||||
if (*scale == 0.0)
|
||||
*scale = 1.0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -29,7 +29,7 @@ int perf_pmu__config_terms(struct list_head *formats,
|
|||
struct perf_event_attr *attr,
|
||||
struct list_head *head_terms);
|
||||
int perf_pmu__check_alias(struct perf_pmu *pmu, struct list_head *head_terms,
|
||||
char **unit, double *scale);
|
||||
const char **unit, double *scale);
|
||||
struct list_head *perf_pmu__alias(struct perf_pmu *pmu,
|
||||
struct list_head *head_terms);
|
||||
int perf_pmu_wrap(void);
|
||||
|
|
|
@ -1573,7 +1573,7 @@ next:
|
|||
int perf_session__cpu_bitmap(struct perf_session *session,
|
||||
const char *cpu_list, unsigned long *cpu_bitmap)
|
||||
{
|
||||
int i;
|
||||
int i, err = -1;
|
||||
struct cpu_map *map;
|
||||
|
||||
for (i = 0; i < PERF_TYPE_MAX; ++i) {
|
||||
|
@ -1602,13 +1602,17 @@ int perf_session__cpu_bitmap(struct perf_session *session,
|
|||
if (cpu >= MAX_NR_CPUS) {
|
||||
pr_err("Requested CPU %d too large. "
|
||||
"Consider raising MAX_NR_CPUS\n", cpu);
|
||||
return -1;
|
||||
goto out_delete_map;
|
||||
}
|
||||
|
||||
set_bit(cpu, cpu_bitmap);
|
||||
}
|
||||
|
||||
return 0;
|
||||
err = 0;
|
||||
|
||||
out_delete_map:
|
||||
cpu_map__delete(map);
|
||||
return err;
|
||||
}
|
||||
|
||||
void perf_session__fprintf_info(struct perf_session *session, FILE *fp,
|
||||
|
|
Loading…
Reference in New Issue