Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1170233 > unrolled thread
| Started by | Jiri Olsa <jolsa@kernel.org> |
|---|---|
| First post | 2015-06-23 00:40 +0200 |
| Last post | 2015-06-23 01:10 +0200 |
| Articles | 8 on this page of 28 — 2 participants |
Back to article view | Back to linux.kernel
[PATCHv4 00/27] perf stat: Introduce --per-thread option Jiri Olsa <jolsa@kernel.org> - 2015-06-23 00:40 +0200
[PATCH 14/27] perf stat: Move perf_evsel__(alloc|free|reset)_stat_priv into stat object Jiri Olsa <jolsa@kernel.org> - 2015-06-23 00:40 +0200
[PATCH 17/27] perf stat: Introduce perf_evsel__alloc_stats function Jiri Olsa <jolsa@kernel.org> - 2015-06-23 00:40 +0200
[PATCH 07/27] perf tools: Make perf_evsel__(nr_)cpus generic Jiri Olsa <jolsa@kernel.org> - 2015-06-23 00:40 +0200
[PATCH 04/27] perf tools: Add reference counting for thread_map object Jiri Olsa <jolsa@kernel.org> - 2015-06-23 00:40 +0200
[PATCH 25/27] perf stat: Using init_stats instead of memset Jiri Olsa <jolsa@kernel.org> - 2015-06-23 00:40 +0200
[PATCH 23/27] perf stat: Remove perf_evsel__read_cb function Jiri Olsa <jolsa@kernel.org> - 2015-06-23 00:40 +0200
[PATCH 18/27] perf stat: Introduce perf_evsel__read function Jiri Olsa <jolsa@kernel.org> - 2015-06-23 00:40 +0200
[PATCH 15/27] perf stat: Move perf_evsel__(alloc|free)_prev_raw_counts into stat object Jiri Olsa <jolsa@kernel.org> - 2015-06-23 00:40 +0200
[PATCH 02/27] perf tools: Add comm string into struct thread_map Jiri Olsa <jolsa@kernel.org> - 2015-06-23 00:40 +0200
[PATCH 21/27] perf stat: Move zero_per_pkg into counter process code Jiri Olsa <jolsa@kernel.org> - 2015-06-23 00:40 +0200
[PATCH 27/27] perf stat: Introduce --per-thread option Jiri Olsa <jolsa@kernel.org> - 2015-06-23 00:40 +0200
[PATCH 11/27] perf stat: Make stats work over the thread dimension Jiri Olsa <jolsa@kernel.org> - 2015-06-23 00:40 +0200
[PATCH 13/27] perf stat: Introduce perf_evlist__reset_stats Jiri Olsa <jolsa@kernel.org> - 2015-06-23 00:40 +0200
[PATCH 06/27] perf tools: Propagate thread maps through the evlist Jiri Olsa <jolsa@kernel.org> - 2015-06-23 00:40 +0200
[PATCH 05/27] perf tools: Propagate cpu maps through the evlist Jiri Olsa <jolsa@kernel.org> - 2015-06-23 00:40 +0200
[PATCH 20/27] perf stat: Separate counters reading and processing Jiri Olsa <jolsa@kernel.org> - 2015-06-23 00:50 +0200
[PATCH 24/27] perf stat: Rename print_interval to process_interval Jiri Olsa <jolsa@kernel.org> - 2015-06-23 00:50 +0200
[PATCH 22/27] perf stat: Move perf_stat initialization counter process code Jiri Olsa <jolsa@kernel.org> - 2015-06-23 00:50 +0200
[PATCH 19/27] perf stat: Introduce read_counters function Jiri Olsa <jolsa@kernel.org> - 2015-06-23 00:50 +0200
[PATCH 08/27] perf tests: Add thread_map object tests Jiri Olsa <jolsa@kernel.org> - 2015-06-23 00:50 +0200
[PATCH 26/27] perf stat: Introduce print_counters function Jiri Olsa <jolsa@kernel.org> - 2015-06-23 00:50 +0200
[PATCH 09/27] perf stat: Introduce perf_counts function Jiri Olsa <jolsa@kernel.org> - 2015-06-23 00:50 +0200
[PATCH 10/27] perf stat: Use xyarray for cpu evsel counts Jiri Olsa <jolsa@kernel.org> - 2015-06-23 00:50 +0200
[PATCH 16/27] perf stat: Move perf_evlist__(alloc|free|reset)_stats into stat object Jiri Olsa <jolsa@kernel.org> - 2015-06-23 00:50 +0200
[PATCH 12/27] perf stat: Rename struct perf_counts::cpu member to values Jiri Olsa <jolsa@kernel.org> - 2015-06-23 00:50 +0200
[PATCH 03/27] perf tools: Add reference counting for cpu_map object Jiri Olsa <jolsa@kernel.org> - 2015-06-23 00:50 +0200
Re: [PATCHv4 00/27] perf stat: Introduce --per-thread option Arnaldo Carvalho de Melo <acme@kernel.org> - 2015-06-23 01:10 +0200
Page 2 of 2 — ← Prev page 1 [2]
| From | Jiri Olsa <jolsa@kernel.org> |
|---|---|
| Date | 2015-06-23 00:50 +0200 |
| Subject | [PATCH 08/27] perf tests: Add thread_map object tests |
| Message-ID | <pEiHn-MJ-13@gated-at.bofh.it> |
| In reply to | #1170233 |
Adding thread_map object tests for comm name values.
Link: http://lkml.kernel.org/n/tip-opjrl8os3je8wl93ujkm8sbh@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
tools/perf/tests/Build | 1 +
tools/perf/tests/builtin-test.c | 4 ++++
tools/perf/tests/tests.h | 1 +
tools/perf/tests/thread-map.c | 28 ++++++++++++++++++++++++++++
4 files changed, 34 insertions(+)
create mode 100644 tools/perf/tests/thread-map.c
diff --git a/tools/perf/tests/Build b/tools/perf/tests/Build
index ee41e705b2eb..d20d6e6ab65b 100644
--- a/tools/perf/tests/Build
+++ b/tools/perf/tests/Build
@@ -31,6 +31,7 @@ perf-y += code-reading.o
perf-y += sample-parsing.o
perf-y += parse-no-sample-id-all.o
perf-y += kmod-path.o
+perf-y += thread-map.o
perf-$(CONFIG_X86) += perf-time-to-tsc.o
diff --git a/tools/perf/tests/builtin-test.c b/tools/perf/tests/builtin-test.c
index 87b9961646e4..c1dde733c3a6 100644
--- a/tools/perf/tests/builtin-test.c
+++ b/tools/perf/tests/builtin-test.c
@@ -171,6 +171,10 @@ static struct test {
.func = test__kmod_path__parse,
},
{
+ .desc = "Test thread map",
+ .func = test__thread_map,
+ },
+ {
.func = NULL,
},
};
diff --git a/tools/perf/tests/tests.h b/tools/perf/tests/tests.h
index 8e5038b48ba8..ebb47d96bc0b 100644
--- a/tools/perf/tests/tests.h
+++ b/tools/perf/tests/tests.h
@@ -61,6 +61,7 @@ int test__switch_tracking(void);
int test__fdarray__filter(void);
int test__fdarray__add(void);
int test__kmod_path__parse(void);
+int test__thread_map(void);
#if defined(__x86_64__) || defined(__i386__) || defined(__arm__) || defined(__aarch64__)
#ifdef HAVE_DWARF_UNWIND_SUPPORT
diff --git a/tools/perf/tests/thread-map.c b/tools/perf/tests/thread-map.c
new file mode 100644
index 000000000000..faf22f64b8af
--- /dev/null
+++ b/tools/perf/tests/thread-map.c
@@ -0,0 +1,28 @@
+#include <sys/types.h>
+#include <unistd.h>
+#include "tests.h"
+#include "thread_map.h"
+#include "debug.h"
+
+int test__thread_map(void)
+{
+ struct thread_map *map;
+
+ /* test map on current pid */
+ map = thread_map__new_by_pid(getpid());
+ TEST_ASSERT_VAL("wrong nr", map->nr == 1);
+ TEST_ASSERT_VAL("wrong pid",
+ thread_map__pid(map, 0) == getpid());
+ TEST_ASSERT_VAL("wrong pid",
+ !strcmp(thread_map__comm(map, 0), "perf"));
+ thread_map__put(map);
+
+ /* test dummy pid */
+ map = thread_map__new_dummy();
+ TEST_ASSERT_VAL("wrong nr", map->nr == 1);
+ TEST_ASSERT_VAL("wrong pid", thread_map__pid(map, 0) == -1);
+ TEST_ASSERT_VAL("wrong pid",
+ !strcmp(thread_map__comm(map, 0), "dummy"));
+ thread_map__put(map);
+ return 0;
+}
--
1.9.3
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Jiri Olsa <jolsa@kernel.org> |
|---|---|
| Date | 2015-06-23 00:50 +0200 |
| Subject | [PATCH 26/27] perf stat: Introduce print_counters function |
| Message-ID | <pEiHn-MJ-15@gated-at.bofh.it> |
| In reply to | #1170233 |
Centralize counters print code into single
print_counters function.
Link: http://lkml.kernel.org/n/tip-1vae9jeuab2db5wxq820sb9v@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
tools/perf/builtin-stat.c | 127 +++++++++++++++++++++++-----------------------
1 file changed, 64 insertions(+), 63 deletions(-)
diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
index 39a97ade2cf3..56dc8881cb05 100644
--- a/tools/perf/builtin-stat.c
+++ b/tools/perf/builtin-stat.c
@@ -67,10 +67,7 @@
#define CNTR_NOT_SUPPORTED "<not supported>"
#define CNTR_NOT_COUNTED "<not counted>"
-static void print_stat(int argc, const char **argv);
-static void print_counter_aggr(struct perf_evsel *counter, char *prefix);
-static void print_counter(struct perf_evsel *counter, char *prefix);
-static void print_aggr(char *prefix);
+static void print_counters(struct timespec *ts, int argc, const char **argv);
/* Default events used for perf stat -T */
static const char *transaction_attrs = {
@@ -365,53 +362,14 @@ static void read_counters(bool close)
static void process_interval(void)
{
- static int num_print_interval;
- struct perf_evsel *counter;
struct timespec ts, rs;
- char prefix[64];
read_counters(false);
clock_gettime(CLOCK_MONOTONIC, &ts);
diff_timespec(&rs, &ts, &ref_time);
- sprintf(prefix, "%6lu.%09lu%s", rs.tv_sec, rs.tv_nsec, csv_sep);
-
- if (num_print_interval == 0 && !csv_output) {
- switch (aggr_mode) {
- case AGGR_SOCKET:
- fprintf(output, "# time socket cpus counts %*s events\n", unit_width, "unit");
- break;
- case AGGR_CORE:
- fprintf(output, "# time core cpus counts %*s events\n", unit_width, "unit");
- break;
- case AGGR_NONE:
- fprintf(output, "# time CPU counts %*s events\n", unit_width, "unit");
- break;
- case AGGR_GLOBAL:
- default:
- fprintf(output, "# time counts %*s events\n", unit_width, "unit");
- }
- }
-
- if (++num_print_interval == 25)
- num_print_interval = 0;
- switch (aggr_mode) {
- case AGGR_CORE:
- case AGGR_SOCKET:
- print_aggr(prefix);
- break;
- case AGGR_NONE:
- evlist__for_each(evsel_list, counter)
- print_counter(counter, prefix);
- break;
- case AGGR_GLOBAL:
- default:
- evlist__for_each(evsel_list, counter)
- print_counter_aggr(counter, prefix);
- }
-
- fflush(output);
+ print_counters(&rs, 0, NULL);
}
static void handle_initial_delay(void)
@@ -901,9 +859,35 @@ static void print_counter(struct perf_evsel *counter, char *prefix)
}
}
-static void print_stat(int argc, const char **argv)
+static void print_interval(char *prefix, struct timespec *ts)
+{
+ static int num_print_interval;
+
+ sprintf(prefix, "%6lu.%09lu%s", ts->tv_sec, ts->tv_nsec, csv_sep);
+
+ if (num_print_interval == 0 && !csv_output) {
+ switch (aggr_mode) {
+ case AGGR_SOCKET:
+ fprintf(output, "# time socket cpus counts %*s events\n", unit_width, "unit");
+ break;
+ case AGGR_CORE:
+ fprintf(output, "# time core cpus counts %*s events\n", unit_width, "unit");
+ break;
+ case AGGR_NONE:
+ fprintf(output, "# time CPU counts %*s events\n", unit_width, "unit");
+ break;
+ case AGGR_GLOBAL:
+ default:
+ fprintf(output, "# time counts %*s events\n", unit_width, "unit");
+ }
+ }
+
+ if (++num_print_interval == 25)
+ num_print_interval = 0;
+}
+
+static void print_header(int argc, const char **argv)
{
- struct perf_evsel *counter;
int i;
fflush(stdout);
@@ -929,36 +913,53 @@ static void print_stat(int argc, const char **argv)
fprintf(output, " (%d runs)", run_count);
fprintf(output, ":\n\n");
}
+}
+
+static void print_footer(void)
+{
+ if (!null_run)
+ fprintf(output, "\n");
+ fprintf(output, " %17.9f seconds time elapsed",
+ avg_stats(&walltime_nsecs_stats)/1e9);
+ if (run_count > 1) {
+ fprintf(output, " ");
+ print_noise_pct(stddev_stats(&walltime_nsecs_stats),
+ avg_stats(&walltime_nsecs_stats));
+ }
+ fprintf(output, "\n\n");
+}
+
+static void print_counters(struct timespec *ts, int argc, const char **argv)
+{
+ struct perf_evsel *counter;
+ char buf[64], *prefix = NULL;
+
+ if (interval)
+ print_interval(prefix = buf, ts);
+ else
+ print_header(argc, argv);
switch (aggr_mode) {
case AGGR_CORE:
case AGGR_SOCKET:
- print_aggr(NULL);
+ print_aggr(prefix);
break;
case AGGR_GLOBAL:
evlist__for_each(evsel_list, counter)
- print_counter_aggr(counter, NULL);
+ print_counter_aggr(counter, prefix);
break;
case AGGR_NONE:
evlist__for_each(evsel_list, counter)
- print_counter(counter, NULL);
+ print_counter(counter, prefix);
break;
default:
break;
}
- if (!csv_output) {
- if (!null_run)
- fprintf(output, "\n");
- fprintf(output, " %17.9f seconds time elapsed",
- avg_stats(&walltime_nsecs_stats)/1e9);
- if (run_count > 1) {
- fprintf(output, " ");
- print_noise_pct(stddev_stats(&walltime_nsecs_stats),
- avg_stats(&walltime_nsecs_stats));
- }
- fprintf(output, "\n\n");
- }
+ if (!interval && !csv_output)
+ print_footer();
+
+ fflush(output);
}
static volatile int signr = -1;
@@ -1407,13 +1408,13 @@ int cmd_stat(int argc, const char **argv, const char *prefix __maybe_unused)
status = run_perf_stat(argc, argv);
if (forever && status != -1) {
- print_stat(argc, argv);
+ print_counters(NULL, argc, argv);
perf_stat__reset_stats();
}
}
if (!forever && status != -1 && !interval)
- print_stat(argc, argv);
+ print_counters(NULL, argc, argv);
perf_evlist__free_stats(evsel_list);
out:
--
1.9.3
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Jiri Olsa <jolsa@kernel.org> |
|---|---|
| Date | 2015-06-23 00:50 +0200 |
| Subject | [PATCH 09/27] perf stat: Introduce perf_counts function |
| Message-ID | <pEiHn-MJ-17@gated-at.bofh.it> |
| In reply to | #1170233 |
Introducing perf_counts function, that returns
'struct perf_counts_values' pointer for given cpu.
Also moving perf_counts* structures into stat.h.
Link: http://lkml.kernel.org/n/tip-qu64zmm5zbpbkuybusnkg4gl@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
tools/perf/builtin-stat.c | 14 +++++++-------
tools/perf/tests/openat-syscall-all-cpus.c | 4 ++--
tools/perf/tests/openat-syscall.c | 2 +-
tools/perf/util/evsel.c | 6 +++---
tools/perf/util/evsel.h | 18 +-----------------
tools/perf/util/stat.h | 23 +++++++++++++++++++++++
6 files changed, 37 insertions(+), 30 deletions(-)
diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
index 3e1636cae76b..49b90374232c 100644
--- a/tools/perf/builtin-stat.c
+++ b/tools/perf/builtin-stat.c
@@ -316,7 +316,7 @@ static int read_cb(struct perf_evsel *evsel, int cpu, int thread __maybe_unused,
if (!evsel->snapshot)
perf_evsel__compute_deltas(evsel, cpu, count);
perf_counts_values__scale(count, scale, NULL);
- evsel->counts->cpu[cpu] = *count;
+ *perf_counts(evsel->counts, cpu) = *count;
if (aggr_mode == AGGR_NONE)
perf_stat__update_shadow_stats(evsel, count->values, cpu);
break;
@@ -805,9 +805,9 @@ static void print_aggr(char *prefix)
s2 = aggr_get_id(evsel_list->cpus, cpu2);
if (s2 != id)
continue;
- val += counter->counts->cpu[cpu].val;
- ena += counter->counts->cpu[cpu].ena;
- run += counter->counts->cpu[cpu].run;
+ val += perf_counts(counter->counts, cpu)->val;
+ ena += perf_counts(counter->counts, cpu)->ena;
+ run += perf_counts(counter->counts, cpu)->run;
nr++;
}
if (prefix)
@@ -915,9 +915,9 @@ static void print_counter(struct perf_evsel *counter, char *prefix)
int cpu;
for (cpu = 0; cpu < perf_evsel__nr_cpus(counter); cpu++) {
- val = counter->counts->cpu[cpu].val;
- ena = counter->counts->cpu[cpu].ena;
- run = counter->counts->cpu[cpu].run;
+ val = perf_counts(counter->counts, cpu)->val;
+ ena = perf_counts(counter->counts, cpu)->ena;
+ run = perf_counts(counter->counts, cpu)->run;
if (prefix)
fprintf(output, "%s", prefix);
diff --git a/tools/perf/tests/openat-syscall-all-cpus.c b/tools/perf/tests/openat-syscall-all-cpus.c
index b8d552b13950..e8d944fe1bd0 100644
--- a/tools/perf/tests/openat-syscall-all-cpus.c
+++ b/tools/perf/tests/openat-syscall-all-cpus.c
@@ -98,9 +98,9 @@ int test__openat_syscall_event_on_all_cpus(void)
}
expected = nr_openat_calls + cpu;
- if (evsel->counts->cpu[cpu].val != expected) {
+ if (perf_counts(evsel->counts, cpu)->val != expected) {
pr_debug("perf_evsel__read_on_cpu: expected to intercept %d calls on cpu %d, got %" PRIu64 "\n",
- expected, cpus->map[cpu], evsel->counts->cpu[cpu].val);
+ expected, cpus->map[cpu], perf_counts(evsel->counts, cpu)->val);
err = -1;
}
}
diff --git a/tools/perf/tests/openat-syscall.c b/tools/perf/tests/openat-syscall.c
index bdfa1f446681..e86fc477a74f 100644
--- a/tools/perf/tests/openat-syscall.c
+++ b/tools/perf/tests/openat-syscall.c
@@ -44,7 +44,7 @@ int test__openat_syscall_event(void)
goto out_close_fd;
}
- if (evsel->counts->cpu[0].val != nr_openat_calls) {
+ if (perf_counts(evsel->counts, 0)->val != nr_openat_calls) {
pr_debug("perf_evsel__read_on_cpu: expected to intercept %d calls, got %" PRIu64 "\n",
nr_openat_calls, evsel->counts->cpu[0].val);
goto out_close_fd;
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
index 1b2f480a3e82..8401b042b9d4 100644
--- a/tools/perf/util/evsel.c
+++ b/tools/perf/util/evsel.c
@@ -910,8 +910,8 @@ void perf_evsel__compute_deltas(struct perf_evsel *evsel, int cpu,
tmp = evsel->prev_raw_counts->aggr;
evsel->prev_raw_counts->aggr = *count;
} else {
- tmp = evsel->prev_raw_counts->cpu[cpu];
- evsel->prev_raw_counts->cpu[cpu] = *count;
+ tmp = *perf_counts(evsel->prev_raw_counts, cpu);
+ *perf_counts(evsel->prev_raw_counts, cpu) = *count;
}
count->val = count->val - tmp.val;
@@ -972,7 +972,7 @@ int __perf_evsel__read_on_cpu(struct perf_evsel *evsel,
perf_evsel__compute_deltas(evsel, cpu, &count);
perf_counts_values__scale(&count, scale, NULL);
- evsel->counts->cpu[cpu] = count;
+ *perf_counts(evsel->counts, cpu) = count;
return 0;
}
diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h
index 4dbf32d94dfb..b420f8f5fc5d 100644
--- a/tools/perf/util/evsel.h
+++ b/tools/perf/util/evsel.h
@@ -9,23 +9,7 @@
#include "xyarray.h"
#include "symbol.h"
#include "cpumap.h"
-
-struct perf_counts_values {
- union {
- struct {
- u64 val;
- u64 ena;
- u64 run;
- };
- u64 values[3];
- };
-};
-
-struct perf_counts {
- s8 scaled;
- struct perf_counts_values aggr;
- struct perf_counts_values cpu[];
-};
+#include "stat.h"
struct perf_evsel;
diff --git a/tools/perf/util/stat.h b/tools/perf/util/stat.h
index 093dc3cb28dd..5e43348836a6 100644
--- a/tools/perf/util/stat.h
+++ b/tools/perf/util/stat.h
@@ -31,6 +31,29 @@ enum aggr_mode {
AGGR_CORE,
};
+struct perf_counts_values {
+ union {
+ struct {
+ u64 val;
+ u64 ena;
+ u64 run;
+ };
+ u64 values[3];
+ };
+};
+
+struct perf_counts {
+ s8 scaled;
+ struct perf_counts_values aggr;
+ struct perf_counts_values cpu[];
+};
+
+static inline struct perf_counts_values*
+perf_counts(struct perf_counts *counts, int cpu)
+{
+ return &counts->cpu[cpu];
+}
+
void update_stats(struct stats *stats, u64 val);
double avg_stats(struct stats *stats);
double stddev_stats(struct stats *stats);
--
1.9.3
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Jiri Olsa <jolsa@kernel.org> |
|---|---|
| Date | 2015-06-23 00:50 +0200 |
| Subject | [PATCH 10/27] perf stat: Use xyarray for cpu evsel counts |
| Message-ID | <pEiHo-MJ-35@gated-at.bofh.it> |
| In reply to | #1170233 |
Switching single dimensional array of 'struct perf_counts_values'
with xyarray object, so we could store thread dimension counts.
Link: http://lkml.kernel.org/n/tip-t1wefzwb3z78sjlpzt95lw61@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
tools/perf/builtin-stat.c | 2 +-
tools/perf/tests/openat-syscall.c | 2 +-
tools/perf/util/stat.c | 31 ++++++++++++++++++++++---------
tools/perf/util/stat.h | 7 ++++---
4 files changed, 28 insertions(+), 14 deletions(-)
diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
index 49b90374232c..055ce83dd6f2 100644
--- a/tools/perf/builtin-stat.c
+++ b/tools/perf/builtin-stat.c
@@ -218,7 +218,7 @@ static void perf_stat__reset_stats(struct perf_evlist *evlist)
evlist__for_each(evlist, evsel) {
perf_evsel__reset_stat_priv(evsel);
- perf_evsel__reset_counts(evsel, perf_evsel__nr_cpus(evsel));
+ perf_evsel__reset_counts(evsel);
}
perf_stat__reset_shadow_stats();
diff --git a/tools/perf/tests/openat-syscall.c b/tools/perf/tests/openat-syscall.c
index e86fc477a74f..bd882f09ebbc 100644
--- a/tools/perf/tests/openat-syscall.c
+++ b/tools/perf/tests/openat-syscall.c
@@ -46,7 +46,7 @@ int test__openat_syscall_event(void)
if (perf_counts(evsel->counts, 0)->val != nr_openat_calls) {
pr_debug("perf_evsel__read_on_cpu: expected to intercept %d calls, got %" PRIu64 "\n",
- nr_openat_calls, evsel->counts->cpu[0].val);
+ nr_openat_calls, perf_counts(evsel->counts, 0)->val);
goto out_close_fd;
}
diff --git a/tools/perf/util/stat.c b/tools/perf/util/stat.c
index 4014b709f956..453480aa7650 100644
--- a/tools/perf/util/stat.c
+++ b/tools/perf/util/stat.c
@@ -97,26 +97,39 @@ void perf_stat_evsel_id_init(struct perf_evsel *evsel)
struct perf_counts *perf_counts__new(int ncpus)
{
- int size = sizeof(struct perf_counts) +
- ncpus * sizeof(struct perf_counts_values);
+ struct perf_counts *counts = zalloc(sizeof(*counts));
- return zalloc(size);
+ if (counts) {
+ struct xyarray *cpu;
+
+ cpu = xyarray__new(ncpus, 1, sizeof(struct perf_counts_values));
+ if (!cpu) {
+ free(counts);
+ return NULL;
+ }
+
+ counts->cpu = cpu;
+ }
+
+ return counts;
}
void perf_counts__delete(struct perf_counts *counts)
{
- free(counts);
+ if (counts) {
+ xyarray__delete(counts->cpu);
+ free(counts);
+ }
}
-static void perf_counts__reset(struct perf_counts *counts, int ncpus)
+static void perf_counts__reset(struct perf_counts *counts)
{
- memset(counts, 0, (sizeof(*counts) +
- (ncpus * sizeof(struct perf_counts_values))));
+ xyarray__reset(counts->cpu);
}
-void perf_evsel__reset_counts(struct perf_evsel *evsel, int ncpus)
+void perf_evsel__reset_counts(struct perf_evsel *evsel)
{
- perf_counts__reset(evsel->counts, ncpus);
+ perf_counts__reset(evsel->counts);
}
int perf_evsel__alloc_counts(struct perf_evsel *evsel, int ncpus)
diff --git a/tools/perf/util/stat.h b/tools/perf/util/stat.h
index 5e43348836a6..6d07612545e0 100644
--- a/tools/perf/util/stat.h
+++ b/tools/perf/util/stat.h
@@ -3,6 +3,7 @@
#include <linux/types.h>
#include <stdio.h>
+#include "xyarray.h"
struct stats
{
@@ -45,13 +46,13 @@ struct perf_counts_values {
struct perf_counts {
s8 scaled;
struct perf_counts_values aggr;
- struct perf_counts_values cpu[];
+ struct xyarray *cpu;
};
static inline struct perf_counts_values*
perf_counts(struct perf_counts *counts, int cpu)
{
- return &counts->cpu[cpu];
+ return xyarray__entry(counts->cpu, cpu, 0);
}
void update_stats(struct stats *stats, u64 val);
@@ -88,7 +89,7 @@ void perf_stat__print_shadow_stats(FILE *out, struct perf_evsel *evsel,
struct perf_counts *perf_counts__new(int ncpus);
void perf_counts__delete(struct perf_counts *counts);
-void perf_evsel__reset_counts(struct perf_evsel *evsel, int ncpus);
+void perf_evsel__reset_counts(struct perf_evsel *evsel);
int perf_evsel__alloc_counts(struct perf_evsel *evsel, int ncpus);
void perf_evsel__free_counts(struct perf_evsel *evsel);
#endif
--
1.9.3
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Jiri Olsa <jolsa@kernel.org> |
|---|---|
| Date | 2015-06-23 00:50 +0200 |
| Subject | [PATCH 16/27] perf stat: Move perf_evlist__(alloc|free|reset)_stats into stat object |
| Message-ID | <pEiHo-MJ-31@gated-at.bofh.it> |
| In reply to | #1170233 |
Moving perf_evlist__(alloc|free|reset)_stats into stat object,
so it could be used in following patches.
Link: http://lkml.kernel.org/n/tip-8dwmf838kipxabe0vay8h0zn@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
tools/perf/builtin-stat.c | 42 ------------------------------------------
tools/perf/util/evlist.h | 1 -
tools/perf/util/stat.c | 44 ++++++++++++++++++++++++++++++++++++++++++++
tools/perf/util/stat.h | 6 ++++++
4 files changed, 50 insertions(+), 43 deletions(-)
diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
index 0ccba5c6b61d..3e385f9f12ee 100644
--- a/tools/perf/builtin-stat.c
+++ b/tools/perf/builtin-stat.c
@@ -141,48 +141,6 @@ static inline void diff_timespec(struct timespec *r, struct timespec *a,
}
}
-static void perf_evlist__free_stats(struct perf_evlist *evlist)
-{
- struct perf_evsel *evsel;
-
- evlist__for_each(evlist, evsel) {
- perf_evsel__free_stat_priv(evsel);
- perf_evsel__free_counts(evsel);
- perf_evsel__free_prev_raw_counts(evsel);
- }
-}
-
-static int perf_evlist__alloc_stats(struct perf_evlist *evlist, bool alloc_raw)
-{
- struct perf_evsel *evsel;
- int nthreads = thread_map__nr(evsel_list->threads);
-
- evlist__for_each(evlist, evsel) {
- int ncpus = perf_evsel__nr_cpus(evsel);
-
- if (perf_evsel__alloc_stat_priv(evsel) < 0 ||
- perf_evsel__alloc_counts(evsel, ncpus, nthreads) < 0 ||
- (alloc_raw && perf_evsel__alloc_prev_raw_counts(evsel, ncpus, nthreads) < 0))
- goto out_free;
- }
-
- return 0;
-
-out_free:
- perf_evlist__free_stats(evlist);
- return -1;
-}
-
-static void perf_evlist__reset_stats(struct perf_evlist *evlist)
-{
- struct perf_evsel *evsel;
-
- evlist__for_each(evlist, evsel) {
- perf_evsel__reset_stat_priv(evsel);
- perf_evsel__reset_counts(evsel);
- }
-}
-
static void perf_stat__reset_stats(void)
{
perf_evlist__reset_stats(evsel_list);
diff --git a/tools/perf/util/evlist.h b/tools/perf/util/evlist.h
index a8489b9d2812..037633c1da9d 100644
--- a/tools/perf/util/evlist.h
+++ b/tools/perf/util/evlist.h
@@ -289,5 +289,4 @@ void perf_evlist__to_front(struct perf_evlist *evlist,
void perf_evlist__set_tracking_event(struct perf_evlist *evlist,
struct perf_evsel *tracking_evsel);
-
#endif /* __PERF_EVLIST_H */
diff --git a/tools/perf/util/stat.c b/tools/perf/util/stat.c
index 6221c3898397..818cb022fcb6 100644
--- a/tools/perf/util/stat.c
+++ b/tools/perf/util/stat.c
@@ -1,6 +1,8 @@
#include <math.h>
#include "stat.h"
+#include "evlist.h"
#include "evsel.h"
+#include "thread_map.h"
void update_stats(struct stats *stats, u64 val)
{
@@ -186,3 +188,45 @@ void perf_evsel__free_prev_raw_counts(struct perf_evsel *evsel)
perf_counts__delete(evsel->prev_raw_counts);
evsel->prev_raw_counts = NULL;
}
+
+int perf_evlist__alloc_stats(struct perf_evlist *evlist, bool alloc_raw)
+{
+ struct perf_evsel *evsel;
+ int nthreads = thread_map__nr(evlist->threads);
+
+ evlist__for_each(evlist, evsel) {
+ int ncpus = perf_evsel__nr_cpus(evsel);
+
+ if (perf_evsel__alloc_stat_priv(evsel) < 0 ||
+ perf_evsel__alloc_counts(evsel, ncpus, nthreads) < 0 ||
+ (alloc_raw && perf_evsel__alloc_prev_raw_counts(evsel, ncpus, nthreads) < 0))
+ goto out_free;
+ }
+
+ return 0;
+
+out_free:
+ perf_evlist__free_stats(evlist);
+ return -1;
+}
+
+void perf_evlist__free_stats(struct perf_evlist *evlist)
+{
+ struct perf_evsel *evsel;
+
+ evlist__for_each(evlist, evsel) {
+ perf_evsel__free_stat_priv(evsel);
+ perf_evsel__free_counts(evsel);
+ perf_evsel__free_prev_raw_counts(evsel);
+ }
+}
+
+void perf_evlist__reset_stats(struct perf_evlist *evlist)
+{
+ struct perf_evsel *evsel;
+
+ evlist__for_each(evlist, evsel) {
+ perf_evsel__reset_stat_priv(evsel);
+ perf_evsel__reset_counts(evsel);
+ }
+}
diff --git a/tools/perf/util/stat.h b/tools/perf/util/stat.h
index 454b26875aef..5f62db2472c7 100644
--- a/tools/perf/util/stat.h
+++ b/tools/perf/util/stat.h
@@ -70,6 +70,8 @@ static inline void init_stats(struct stats *stats)
}
struct perf_evsel;
+struct perf_evlist;
+
bool __perf_evsel_stat__is(struct perf_evsel *evsel,
enum perf_stat_evsel_id id);
@@ -100,4 +102,8 @@ void perf_evsel__free_stat_priv(struct perf_evsel *evsel);
int perf_evsel__alloc_prev_raw_counts(struct perf_evsel *evsel,
int ncpus, int nthreads);
void perf_evsel__free_prev_raw_counts(struct perf_evsel *evsel);
+
+int perf_evlist__alloc_stats(struct perf_evlist *evlist, bool alloc_raw);
+void perf_evlist__free_stats(struct perf_evlist *evlist);
+void perf_evlist__reset_stats(struct perf_evlist *evlist);
#endif
--
1.9.3
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Jiri Olsa <jolsa@kernel.org> |
|---|---|
| Date | 2015-06-23 00:50 +0200 |
| Subject | [PATCH 12/27] perf stat: Rename struct perf_counts::cpu member to values |
| Message-ID | <pEiHo-MJ-39@gated-at.bofh.it> |
| In reply to | #1170233 |
Renaming 'struct xyarray *cpu' pointer to more fitting/generic
values, because now we store both cpu and thread values.
Link: http://lkml.kernel.org/n/tip-fee055ta61vlnjfjzurmy6qi@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
tools/perf/util/stat.c | 12 ++++++------
tools/perf/util/stat.h | 4 ++--
2 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/tools/perf/util/stat.c b/tools/perf/util/stat.c
index 7bcc19b62dd1..197a2db5f2c4 100644
--- a/tools/perf/util/stat.c
+++ b/tools/perf/util/stat.c
@@ -100,15 +100,15 @@ struct perf_counts *perf_counts__new(int ncpus, int nthreads)
struct perf_counts *counts = zalloc(sizeof(*counts));
if (counts) {
- struct xyarray *cpu;
+ struct xyarray *values;
- cpu = xyarray__new(ncpus, nthreads, sizeof(struct perf_counts_values));
- if (!cpu) {
+ values = xyarray__new(ncpus, nthreads, sizeof(struct perf_counts_values));
+ if (!values) {
free(counts);
return NULL;
}
- counts->cpu = cpu;
+ counts->values = values;
}
return counts;
@@ -117,14 +117,14 @@ struct perf_counts *perf_counts__new(int ncpus, int nthreads)
void perf_counts__delete(struct perf_counts *counts)
{
if (counts) {
- xyarray__delete(counts->cpu);
+ xyarray__delete(counts->values);
free(counts);
}
}
static void perf_counts__reset(struct perf_counts *counts)
{
- xyarray__reset(counts->cpu);
+ xyarray__reset(counts->values);
}
void perf_evsel__reset_counts(struct perf_evsel *evsel)
diff --git a/tools/perf/util/stat.h b/tools/perf/util/stat.h
index e0b8dc50fbb6..295d1e29d3d6 100644
--- a/tools/perf/util/stat.h
+++ b/tools/perf/util/stat.h
@@ -46,13 +46,13 @@ struct perf_counts_values {
struct perf_counts {
s8 scaled;
struct perf_counts_values aggr;
- struct xyarray *cpu;
+ struct xyarray *values;
};
static inline struct perf_counts_values*
perf_counts(struct perf_counts *counts, int cpu, int thread)
{
- return xyarray__entry(counts->cpu, cpu, thread);
+ return xyarray__entry(counts->values, cpu, thread);
}
void update_stats(struct stats *stats, u64 val);
--
1.9.3
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Jiri Olsa <jolsa@kernel.org> |
|---|---|
| Date | 2015-06-23 00:50 +0200 |
| Subject | [PATCH 03/27] perf tools: Add reference counting for cpu_map object |
| Message-ID | <pEiHo-MJ-41@gated-at.bofh.it> |
| In reply to | #1170233 |
Adding refference counting for cpu_map object, so
it could be easily shared among other objects.
Using cpu_map__put instead cpu_map__delete and making
cpu_map__delete static.
Link: http://lkml.kernel.org/n/tip-gwy96ohuwhjz603bnf70af6i@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
tools/perf/tests/code-reading.c | 2 +-
tools/perf/tests/keep-tracking.c | 2 +-
tools/perf/tests/mmap-basic.c | 2 +-
tools/perf/tests/switch-tracking.c | 2 +-
tools/perf/util/cpumap.c | 26 ++++++++++++++++++++++++--
tools/perf/util/cpumap.h | 6 +++++-
tools/perf/util/evlist.c | 4 ++--
tools/perf/util/evsel.c | 1 +
tools/perf/util/parse-events.c | 5 ++++-
tools/perf/util/python.c | 2 +-
tools/perf/util/record.c | 4 ++--
tools/perf/util/session.c | 2 +-
tools/perf/util/svghelper.c | 2 +-
13 files changed, 45 insertions(+), 15 deletions(-)
diff --git a/tools/perf/tests/code-reading.c b/tools/perf/tests/code-reading.c
index 22f8a00446e1..6b3250f54240 100644
--- a/tools/perf/tests/code-reading.c
+++ b/tools/perf/tests/code-reading.c
@@ -545,7 +545,7 @@ out_err:
if (evlist) {
perf_evlist__delete(evlist);
} else {
- cpu_map__delete(cpus);
+ cpu_map__put(cpus);
thread_map__delete(threads);
}
machines__destroy_kernel_maps(&machines);
diff --git a/tools/perf/tests/keep-tracking.c b/tools/perf/tests/keep-tracking.c
index 5b171d1e338b..a330235cefc0 100644
--- a/tools/perf/tests/keep-tracking.c
+++ b/tools/perf/tests/keep-tracking.c
@@ -144,7 +144,7 @@ out_err:
perf_evlist__disable(evlist);
perf_evlist__delete(evlist);
} else {
- cpu_map__delete(cpus);
+ cpu_map__put(cpus);
thread_map__delete(threads);
}
diff --git a/tools/perf/tests/mmap-basic.c b/tools/perf/tests/mmap-basic.c
index 5855cf471210..5a9ef5833452 100644
--- a/tools/perf/tests/mmap-basic.c
+++ b/tools/perf/tests/mmap-basic.c
@@ -140,7 +140,7 @@ out_delete_evlist:
cpus = NULL;
threads = NULL;
out_free_cpus:
- cpu_map__delete(cpus);
+ cpu_map__put(cpus);
out_free_threads:
thread_map__delete(threads);
return err;
diff --git a/tools/perf/tests/switch-tracking.c b/tools/perf/tests/switch-tracking.c
index 0d31403ea593..1b06122beb76 100644
--- a/tools/perf/tests/switch-tracking.c
+++ b/tools/perf/tests/switch-tracking.c
@@ -560,7 +560,7 @@ out:
perf_evlist__disable(evlist);
perf_evlist__delete(evlist);
} else {
- cpu_map__delete(cpus);
+ cpu_map__put(cpus);
thread_map__delete(threads);
}
diff --git a/tools/perf/util/cpumap.c b/tools/perf/util/cpumap.c
index c4e55b71010c..d2662d0e7d2e 100644
--- a/tools/perf/util/cpumap.c
+++ b/tools/perf/util/cpumap.c
@@ -5,6 +5,7 @@
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
+#include "asm/bug.h"
static struct cpu_map *cpu_map__default_new(void)
{
@@ -22,6 +23,7 @@ static struct cpu_map *cpu_map__default_new(void)
cpus->map[i] = i;
cpus->nr = nr_cpus;
+ atomic_set(&cpus->refcnt, 1);
}
return cpus;
@@ -35,6 +37,7 @@ static struct cpu_map *cpu_map__trim_new(int nr_cpus, int *tmp_cpus)
if (cpus != NULL) {
cpus->nr = nr_cpus;
memcpy(cpus->map, tmp_cpus, payload_size);
+ atomic_set(&cpus->refcnt, 1);
}
return cpus;
@@ -194,14 +197,32 @@ struct cpu_map *cpu_map__dummy_new(void)
if (cpus != NULL) {
cpus->nr = 1;
cpus->map[0] = -1;
+ atomic_set(&cpus->refcnt, 1);
}
return cpus;
}
-void cpu_map__delete(struct cpu_map *map)
+static void cpu_map__delete(struct cpu_map *map)
{
- free(map);
+ if (map) {
+ WARN_ONCE(atomic_read(&map->refcnt) != 0,
+ "cpu map refcnt disbalanced\n");
+ free(map);
+ }
+}
+
+struct cpu_map *cpu_map__get(struct cpu_map *map)
+{
+ if (map)
+ atomic_inc(&map->refcnt);
+ return map;
+}
+
+void cpu_map__put(struct cpu_map *map)
+{
+ if (map && atomic_dec_and_test(&map->refcnt))
+ cpu_map__delete(map);
}
int cpu_map__get_socket(struct cpu_map *map, int idx)
@@ -263,6 +284,7 @@ static int cpu_map__build_map(struct cpu_map *cpus, struct cpu_map **res,
/* ensure we process id in increasing order */
qsort(c->map, c->nr, sizeof(int), cmp_ids);
+ atomic_set(&cpus->refcnt, 1);
*res = c;
return 0;
}
diff --git a/tools/perf/util/cpumap.h b/tools/perf/util/cpumap.h
index 61a654849002..0af9cecb4c51 100644
--- a/tools/perf/util/cpumap.h
+++ b/tools/perf/util/cpumap.h
@@ -3,18 +3,19 @@
#include <stdio.h>
#include <stdbool.h>
+#include <linux/atomic.h>
#include "perf.h"
#include "util/debug.h"
struct cpu_map {
+ atomic_t refcnt;
int nr;
int map[];
};
struct cpu_map *cpu_map__new(const char *cpu_list);
struct cpu_map *cpu_map__dummy_new(void);
-void cpu_map__delete(struct cpu_map *map);
struct cpu_map *cpu_map__read(FILE *file);
size_t cpu_map__fprintf(struct cpu_map *map, FILE *fp);
int cpu_map__get_socket(struct cpu_map *map, int idx);
@@ -22,6 +23,9 @@ int cpu_map__get_core(struct cpu_map *map, int idx);
int cpu_map__build_socket_map(struct cpu_map *cpus, struct cpu_map **sockp);
int cpu_map__build_core_map(struct cpu_map *cpus, struct cpu_map **corep);
+struct cpu_map *cpu_map__get(struct cpu_map *map);
+void cpu_map__put(struct cpu_map *map);
+
static inline int cpu_map__socket(struct cpu_map *sock, int s)
{
if (!sock || s > sock->nr || s < 0)
diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c
index d29df901be3e..59498f7b3e9b 100644
--- a/tools/perf/util/evlist.c
+++ b/tools/perf/util/evlist.c
@@ -114,7 +114,7 @@ void perf_evlist__delete(struct perf_evlist *evlist)
{
perf_evlist__munmap(evlist);
perf_evlist__close(evlist);
- cpu_map__delete(evlist->cpus);
+ cpu_map__put(evlist->cpus);
thread_map__delete(evlist->threads);
evlist->cpus = NULL;
evlist->threads = NULL;
@@ -1353,7 +1353,7 @@ static int perf_evlist__create_syswide_maps(struct perf_evlist *evlist)
out:
return err;
out_free_cpus:
- cpu_map__delete(evlist->cpus);
+ cpu_map__put(evlist->cpus);
evlist->cpus = NULL;
goto out;
}
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
index 1b56047af96b..31b0afb68825 100644
--- a/tools/perf/util/evsel.c
+++ b/tools/perf/util/evsel.c
@@ -885,6 +885,7 @@ void perf_evsel__exit(struct perf_evsel *evsel)
perf_evsel__free_fd(evsel);
perf_evsel__free_id(evsel);
close_cgroup(evsel->cgrp);
+ cpu_map__put(evsel->cpus);
zfree(&evsel->group_name);
zfree(&evsel->name);
perf_evsel__object.fini(evsel);
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index 2a4d1ec02846..09f8d2357108 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -17,6 +17,7 @@
#include "parse-events-flex.h"
#include "pmu.h"
#include "thread_map.h"
+#include "cpumap.h"
#include "asm/bug.h"
#define MAX_NAME_LEN 100
@@ -285,7 +286,9 @@ __add_event(struct list_head *list, int *idx,
if (!evsel)
return NULL;
- evsel->cpus = cpus;
+ if (cpus)
+ evsel->cpus = cpu_map__get(cpus);
+
if (name)
evsel->name = strdup(name);
list_add_tail(&evsel->node, list);
diff --git a/tools/perf/util/python.c b/tools/perf/util/python.c
index d906d0ad5d40..b106d56df240 100644
--- a/tools/perf/util/python.c
+++ b/tools/perf/util/python.c
@@ -384,7 +384,7 @@ static int pyrf_cpu_map__init(struct pyrf_cpu_map *pcpus,
static void pyrf_cpu_map__delete(struct pyrf_cpu_map *pcpus)
{
- cpu_map__delete(pcpus->cpus);
+ cpu_map__put(pcpus->cpus);
pcpus->ob_type->tp_free((PyObject*)pcpus);
}
diff --git a/tools/perf/util/record.c b/tools/perf/util/record.c
index d457c523a33d..1f7becbe5e18 100644
--- a/tools/perf/util/record.c
+++ b/tools/perf/util/record.c
@@ -64,7 +64,7 @@ static bool perf_probe_api(setup_probe_fn_t fn)
if (!cpus)
return false;
cpu = cpus->map[0];
- cpu_map__delete(cpus);
+ cpu_map__put(cpus);
do {
ret = perf_do_probe_api(fn, cpu, try[i++]);
@@ -226,7 +226,7 @@ bool perf_evlist__can_select_event(struct perf_evlist *evlist, const char *str)
struct cpu_map *cpus = cpu_map__new(NULL);
cpu = cpus ? cpus->map[0] : 0;
- cpu_map__delete(cpus);
+ cpu_map__put(cpus);
} else {
cpu = evlist->cpus->map[0];
}
diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
index aa482c10469d..5cdd0b165f33 100644
--- a/tools/perf/util/session.c
+++ b/tools/perf/util/session.c
@@ -1893,7 +1893,7 @@ int perf_session__cpu_bitmap(struct perf_session *session,
err = 0;
out_delete_map:
- cpu_map__delete(map);
+ cpu_map__put(map);
return err;
}
diff --git a/tools/perf/util/svghelper.c b/tools/perf/util/svghelper.c
index 283d3e73e2f2..eec6c1149f44 100644
--- a/tools/perf/util/svghelper.c
+++ b/tools/perf/util/svghelper.c
@@ -748,7 +748,7 @@ static int str_to_bitmap(char *s, cpumask_t *b)
set_bit(c, cpumask_bits(b));
}
- cpu_map__delete(m);
+ cpu_map__put(m);
return ret;
}
--
1.9.3
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Arnaldo Carvalho de Melo <acme@kernel.org> |
|---|---|
| Date | 2015-06-23 01:10 +0200 |
| Message-ID | <pEj0K-1oI-23@gated-at.bofh.it> |
| In reply to | #1170233 |
Em Tue, Jun 23, 2015 at 12:36:01AM +0200, Jiri Olsa escreveu: > hi, > adding the possibility to display stat data per thread. > > Allowing following commands and output: > > $ perf stat -e cycles,instructions --per-thread -p 30190,30242 While testing Adrian's Intel PT patchkit I realised we have --per-thread in 'record', wonder if using a long option with the exact same name but different meanings for 'stat' and 'record' would cause confusion... - Arnaldo > ^C > Performance counter stats for process id '30190,30242': > > cat-30190 0 cycles > yes-30242 3,842,525,421 cycles > cat-30190 0 instructions > yes-30242 10,370,817,010 instructions > > 1.143155657 seconds time elapsed > > > Also works under interval mode: > > $ perf stat -e cycles,instructions --per-thread -p 30190,30242 -I 1000 > # time comm-pid counts unit events > 1.000073435 cat-30190 89,058 cycles > 1.000073435 yes-30242 3,360,786,902 cycles (100.00%) > 1.000073435 cat-30190 14,066 instructions > 1.000073435 yes-30242 9,069,937,462 instructions > 2.000204830 cat-30190 0 cycles > 2.000204830 yes-30242 3,351,667,626 cycles > 2.000204830 cat-30190 0 instructions > 2.000204830 yes-30242 9,045,796,885 instructions > ^C 2.771286639 cat-30190 0 cycles > 2.771286639 yes-30242 2,593,884,166 cycles > 2.771286639 cat-30190 0 instructions > 2.771286639 yes-30242 7,001,171,191 instructions > > > Available in here: > git://git.kernel.org/pub/scm/linux/kernel/git/jolsa/perf.git > perf/per_thread > > v4 changes: > - add thread_map__set_(pid|comm) interface > - several fixes for task comm string reading > - added perf_evlist__reset_stats function > > v3 changes: > - some patches already pulled in, rebased on latest acme's perf/core > - fixed cpu_map__get/thread_map__get to accept NULL map > - renamed propagate_maps to perf_evlist__propagate_maps > - renamed --per-task option to --per-thread > - changed 'task-pid' header output to 'comm-pid' > > v2 changes: > - renamed xyarray__zero to xyarray__reset > - using atomic_t for cpu_map/thread_map refcnt > - moving all stat functions into stat object > - using init_stats to initialize 'struct stats*' > - change TASK-$pid output into $comm-$pid > - updated doc with --per-task option > > > thanks, > jirka > --- > Jiri Olsa (27): > perf tools: Change thread_map::map into struct > perf tools: Add comm string into struct thread_map > perf tools: Add reference counting for cpu_map object > perf tools: Add reference counting for thread_map object > perf tools: Propagate cpu maps through the evlist > perf tools: Propagate thread maps through the evlist > perf tools: Make perf_evsel__(nr_)cpus generic > perf tests: Add thread_map object tests > perf stat: Introduce perf_counts function > perf stat: Use xyarray for cpu evsel counts > perf stat: Make stats work over the thread dimension > perf stat: Rename struct perf_counts::cpu member to values > perf stat: Introduce perf_evlist__reset_stats > perf stat: Move perf_evsel__(alloc|free|reset)_stat_priv into stat object > perf stat: Move perf_evsel__(alloc|free)_prev_raw_counts into stat object > perf stat: Move perf_evlist__(alloc|free|reset)_stats into stat object > perf stat: Introduce perf_evsel__alloc_stats function > perf stat: Introduce perf_evsel__read function > perf stat: Introduce read_counters function > perf stat: Separate counters reading and processing > perf stat: Move zero_per_pkg into counter process code > perf stat: Move perf_stat initialization counter process code > perf stat: Remove perf_evsel__read_cb function > perf stat: Rename print_interval to process_interval > perf stat: Using init_stats instead of memset > perf stat: Introduce print_counters function > perf stat: Introduce --per-thread option > > tools/perf/Documentation/perf-stat.txt | 4 + > tools/perf/builtin-stat.c | 404 ++++++++++++++-------------- > tools/perf/builtin-trace.c | 4 +- > tools/perf/tests/Build | 1 + > tools/perf/tests/builtin-test.c | 4 + > tools/perf/tests/code-reading.c | 4 +- > tools/perf/tests/keep-tracking.c | 4 +- > tools/perf/tests/mmap-basic.c | 4 +- > tools/perf/tests/mmap-thread-lookup.c | 2 +- > tools/perf/tests/openat-syscall-all-cpus.c | 8 +- > tools/perf/tests/openat-syscall-tp-fields.c | 2 +- > tools/perf/tests/openat-syscall.c | 6 +- > tools/perf/tests/switch-tracking.c | 4 +- > tools/perf/tests/tests.h | 1 + > tools/perf/tests/thread-map.c | 28 ++ > tools/perf/util/auxtrace.c | 4 +- > tools/perf/util/cpumap.c | 26 +- > tools/perf/util/cpumap.h | 6 +- > tools/perf/util/event.c | 6 +- > tools/perf/util/evlist.c | 39 ++- > tools/perf/util/evlist.h | 1 - > tools/perf/util/evsel.c | 28 +- > tools/perf/util/evsel.h | 40 ++- > tools/perf/util/parse-events.c | 5 +- > tools/perf/util/python-ext-sources | 1 + > tools/perf/util/python.c | 4 +- > tools/perf/util/record.c | 4 +- > tools/perf/util/session.c | 2 +- > tools/perf/util/stat.c | 132 ++++++++- > tools/perf/util/stat.h | 47 +++- > tools/perf/util/svghelper.c | 2 +- > tools/perf/util/thread_map.c | 118 ++++++-- > tools/perf/util/thread_map.h | 35 ++- > 33 files changed, 661 insertions(+), 319 deletions(-) > create mode 100644 tools/perf/tests/thread-map.c -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [standalone]
Page 2 of 2 — ← Prev page 1 [2]
Back to top | Article view | linux.kernel
csiph-web