Skip to content

Commit

Permalink
Merge tag 'perf-core-for-mingo' of git://git.kernel.org/pub/scm/linux…
Browse files Browse the repository at this point in the history
…/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 <[email protected]>
Signed-off-by: Ingo Molnar <[email protected]>
  • Loading branch information
Ingo Molnar committed Jan 23, 2014
2 parents 15c8102 + 578c03c commit bb236de
Show file tree
Hide file tree
Showing 10 changed files with 47 additions and 15 deletions.
3 changes: 3 additions & 0 deletions tools/perf/builtin-timechart.c
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
7 changes: 7 additions & 0 deletions tools/perf/perf.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
7 changes: 5 additions & 2 deletions tools/perf/util/evlist.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
1 change: 0 additions & 1 deletion tools/perf/util/evsel.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
2 changes: 1 addition & 1 deletion tools/perf/util/header.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
4 changes: 2 additions & 2 deletions tools/perf/util/map.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand All @@ -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);
}
}
Expand Down
2 changes: 1 addition & 1 deletion tools/perf/util/parse-events.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
24 changes: 20 additions & 4 deletions tools/perf/util/pmu.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down Expand Up @@ -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
Expand All @@ -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);
Expand All @@ -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;
}

Expand Down
2 changes: 1 addition & 1 deletion tools/perf/util/pmu.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
10 changes: 7 additions & 3 deletions tools/perf/util/session.c
Original file line number Diff line number Diff line change
Expand Up @@ -1573,7 +1573,7 @@ void perf_evsel__print_ip(struct perf_evsel *evsel, struct perf_sample *sample,
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) {
Expand Down Expand Up @@ -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,
Expand Down

0 comments on commit bb236de

Please sign in to comment.