perf/core improvements
Subsystems (2)
Arnaldo Carvalho de Melo
maintainerHi Ingo,
Please consider pulling,
- Arnaldo
The following changes since commit 27451700dfa01a05cdb4d9d74501536165158034:
Merge tag 'perf-core-for-mingo' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/core (2015-06-25 09:28:42 +0200)
are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux.git tags/perf-core-for-mingo
for you to fetch changes up to a22e99cd74a31dee4b5241bd60a256c629c808da:
perf tools: Make perf_evsel__(nr_)cpus generic (2015-06-25 17:15:39 -0300)
----------------------------------------------------------------
perf/core improvements and refactorings:
Infrastructure:
- Reference count the cpu_map and thread_map classes. (Jiri Olsa)
- Set evsel->{cpus,threads} from the evlist, if not set, allowing the generalization of some 'perf stat' functions that previously were accessing private static evlist variable. (Jiri Olsa)
- Delete an unnecessary check before the calling
free_event_desc() (Markus Elfring)
----------------------------------------------------------------
Arnaldo Carvalho de Melo (1):
perf tools: Future-proof thread_map allocation size calculation
Jiri Olsa (5):
perf tools: Add reference counting for cpu_map object perf tools: Add reference counting for thread_map object perf evlist: Propagate cpu maps to evsels in an evlist perf evlist: Propagate thread maps through the evlist perf tools: Make perf_evsel__(nr_)cpus generic
Markus Elfring (1):
perf header: Delete an unnecessary check before the calling free_event_desc()
tools/perf/builtin-stat.c | 10 --------- 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 | 2 +- tools/perf/tests/openat-syscall.c | 2 +- tools/perf/tests/switch-tracking.c | 4 ++-- tools/perf/util/cpumap.c | 26 ++++++++++++++++++++-- tools/perf/util/cpumap.h | 6 ++++- tools/perf/util/evlist.c | 35 +++++++++++++++++++++++++----- tools/perf/util/evsel.c | 2 ++ tools/perf/util/evsel.h | 12 ++++++++++ tools/perf/util/header.c | 3 +-- tools/perf/util/parse-events.c | 5 ++++- tools/perf/util/python.c | 4 ++-- tools/perf/util/record.c | 4 ++-- tools/perf/util/session.c | 2 +- tools/perf/util/svghelper.c | 2 +- tools/perf/util/thread_map.c | 32 ++++++++++++++++++++++++--- tools/perf/util/thread_map.h | 7 ++++-- 21 files changed, 129 insertions(+), 43 deletions(-)
Arnaldo Carvalho de Melo
maintainerPATCH 1/7 perf tools: Future-proof thread_map allocation size calculation
From: Arnaldo Carvalho de Melo <[email protected]>
--- tools/perf/util/thread_map.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/util/thread_map.c +1 -1
@@ -22,7 +22,7 @@ static int filter(const struct dirent *dir)static struct thread_map *thread_map__realloc (struct thread_map *map,int nr) { -size_t size =sizeof (*map) +sizeof (pid_t) * nr; +size_t size =sizeof (*map) +sizeof (map->map[0 ]) * nr;return realloc (map, size); }
Signature · 1 line
2.1.0
Arnaldo Carvalho de Melo
maintainerPATCH 2/7 perf header: Delete an unnecessary check before the calling free_event_desc()
In reply to Arnaldo Carvalho de MeloFrom: Markus Elfring <[email protected]>
The free_event_desc() function tests whether its argument is NULL and then returns immediately. Thus the test around the call is not needed.
This issue was detected by using the Coccinelle software.
--- tools/perf/util/header.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
tools/perf/util/header.c +1 -2
@@ -1063,8 +1063,7 @@ out:free (buf);return events; error: -if (events) -free_event_desc (events); +free_event_desc (events); events =NULL ; goto out; }
Signature · 1 line
2.1.0
Arnaldo Carvalho de Melo
maintainerPATCH 3/7 perf tools: Add reference counting for cpu_map object
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
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.
--- 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(-)
tools/perf/tests/code-reading.c +1 -1
@@ -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);
tools/perf/tests/keep-tracking.c +1 -1
@@ -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); }
tools/perf/tests/mmap-basic.c +1 -1
@@ -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;
tools/perf/tests/switch-tracking.c +1 -1
@@ -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); }
tools/perf/util/cpumap.c +24 -2
@@ -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 unbalanced\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 ; }
tools/perf/util/cpumap.h +5 -1
@@ -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 )
tools/perf/util/evlist.c +2 -2
@@ -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; }
tools/perf/util/evsel.c +1 -0
@@ -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);
tools/perf/util/parse-events.c +4 -1
@@ -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);
tools/perf/util/python.c +1 -1
@@ -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); }
tools/perf/util/record.c +2 -2
@@ -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 ]; }
tools/perf/util/session.c +1 -1
@@ -1895,7 +1895,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; }
tools/perf/util/svghelper.c +1 -1
@@ -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; }
Signature · 1 line
2.1.0
Arnaldo Carvalho de Melo
maintainerPATCH 4/7 perf tools: Add reference counting for thread_map object
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
Adding reference counting for thread_map object, so it could be easily shared among other objects.
Using thread_map__put instead thread_map__delete and making thread_map__delete static.
--- tools/perf/tests/code-reading.c | 2 +- tools/perf/tests/keep-tracking.c | 2 +- tools/perf/tests/mmap-basic.c | 2 +- tools/perf/tests/mmap-thread-lookup.c | 2 +- tools/perf/tests/openat-syscall-all-cpus.c | 2 +- tools/perf/tests/openat-syscall.c | 2 +- tools/perf/tests/switch-tracking.c | 2 +- tools/perf/util/evlist.c | 4 ++-- tools/perf/util/python.c | 2 +- tools/perf/util/thread_map.c | 30 ++++++++++++++++++++++++++++-- tools/perf/util/thread_map.h | 7 +++++-- 11 files changed, 43 insertions(+), 14 deletions(-)
tools/perf/tests/code-reading.c +1 -1
@@ -546,7 +546,7 @@ out_err:perf_evlist__delete (evlist); }else {cpu_map__put (cpus); -thread_map__delete (threads); +thread_map__put (threads); }machines__destroy_kernel_maps (&machines);machine__delete_threads (machine);
tools/perf/tests/keep-tracking.c +1 -1
@@ -145,7 +145,7 @@ out_err:perf_evlist__delete (evlist); }else {cpu_map__put (cpus); -thread_map__delete (threads); +thread_map__put (threads); }return err;
tools/perf/tests/mmap-basic.c +1 -1
@@ -142,6 +142,6 @@ out_delete_evlist: out_free_cpus:cpu_map__put (cpus); out_free_threads: -thread_map__delete (threads); +thread_map__put (threads);return err; }
tools/perf/tests/mmap-thread-lookup.c +1 -1
@@ -143,7 +143,7 @@ static int synth_process(struct machine *machine) perf_event__process, machine, 0, 500); -thread_map__delete (map); +thread_map__put (map);return err; }
tools/perf/tests/openat-syscall-all-cpus.c +1 -1
@@ -111,6 +111,6 @@ out_close_fd: out_evsel_delete:perf_evsel__delete (evsel); out_thread_map_delete: -thread_map__delete (threads); +thread_map__put (threads);return err; }
tools/perf/tests/openat-syscall.c +1 -1
@@ -56,6 +56,6 @@ out_close_fd: out_evsel_delete:perf_evsel__delete (evsel); out_thread_map_delete: -thread_map__delete (threads); +thread_map__put (threads);return err; }
tools/perf/tests/switch-tracking.c +1 -1
@@ -561,7 +561,7 @@ out:perf_evlist__delete (evlist); }else {cpu_map__put (cpus); -thread_map__delete (threads); +thread_map__put (threads); }return err;
tools/perf/util/evlist.c +2 -2
@@ -115,7 +115,7 @@ void perf_evlist__delete(struct perf_evlist *evlist)perf_evlist__munmap (evlist);perf_evlist__close (evlist);cpu_map__put (evlist->cpus); -thread_map__delete (evlist->threads); +thread_map__put (evlist->threads); evlist->cpus =NULL ; evlist->threads =NULL ;perf_evlist__purge (evlist);
@@ -1120,7 +1120,7 @@ int perf_evlist__create_maps(struct perf_evlist *evlist, struct target *target)return 0 ; out_delete_threads: -thread_map__delete (evlist->threads); +thread_map__put (evlist->threads); evlist->threads =NULL ;return -1 ; }
tools/perf/util/python.c +1 -1
@@ -453,7 +453,7 @@ static int pyrf_thread_map__init(struct pyrf_thread_map *pthreads,static void pyrf_thread_map__delete (struct pyrf_thread_map *pthreads) { -thread_map__delete (pthreads->threads); +thread_map__put (pthreads->threads); pthreads->ob_type->tp_free ((PyObject *)pthreads); }
tools/perf/util/thread_map.c +28 -2
@@ -8,6 +8,7 @@#include <unistd.h> #include "strlist.h" #include <string.h> +#include "asm/bug.h" #include "thread_map.h" #include "util.h"
@@ -47,6 +48,7 @@ struct thread_map *thread_map__new_by_pid(pid_t pid)for (i =0 ; i < items; i++)thread_map__set_pid (threads, i,atoi (namelist[i]->d_name)); threads->nr = items; +atomic_set (&threads->refcnt,1 ); }for (i=0 ; i<items; i++)
@@ -63,6 +65,7 @@ struct thread_map *thread_map__new_by_tid(pid_t tid)if (threads !=NULL ) {thread_map__set_pid (threads,0 , tid); threads->nr =1 ; +atomic_set (&threads->refcnt,1 ); }return threads;
@@ -84,6 +87,7 @@ struct thread_map *thread_map__new_by_uid(uid_t uid) goto out_free_threads; threads->nr =0 ; +atomic_set (&threads->refcnt,1 );while (!readdir_r (proc, &dirent, &next) && next) {char *end;
@@ -212,6 +216,8 @@ static struct thread_map *thread_map__new_by_pid_str(const char *pid_str) out:strlist__delete (slist); +if (threads) +atomic_set (&threads->refcnt,1 );return threads; out_free_namelist:
@@ -231,6 +237,7 @@ struct thread_map *thread_map__new_dummy(void)if (threads !=NULL ) {thread_map__set_pid (threads,0 ,-1 ); threads->nr =1 ; +atomic_set (&threads->refcnt,1 ); }return threads; }
@@ -273,6 +280,8 @@ static struct thread_map *thread_map__new_by_tid_str(const char *tid_str) threads->nr = ntasks; } out: +if (threads) +atomic_set (&threads->refcnt,1 );return threads; out_free_threads:
@@ -292,9 +301,26 @@ struct thread_map *thread_map__new_str(const char *pid, const char *tid,return thread_map__new_by_tid_str (tid); } -void thread_map__delete (struct thread_map *threads) +static void thread_map__delete (struct thread_map *threads) { -free (threads); +if (threads) { +WARN_ONCE (atomic_read (&threads->refcnt) !=0 , +"thread map refcnt unbalanced\n" ); +free (threads); + } +} + +struct thread_map *thread_map__get (struct thread_map *map) +{ +if (map) +atomic_inc (&map->refcnt); +return map; +} + +void thread_map__put (struct thread_map *map) +{ +if (map &&atomic_dec_and_test (&map->refcnt)) +thread_map__delete (map); }size_t thread_map__fprintf (struct thread_map *threads,FILE *fp)
tools/perf/util/thread_map.h +5 -2
@@ -3,12 +3,14 @@#include <sys/types.h> #include <stdio.h> +#include <linux/atomic.h> struct thread_map_data {pid_t pid; };struct thread_map { +atomic_t refcnt;int nr;struct thread_map_data map[]; };
@@ -19,11 +21,12 @@ struct thread_map *thread_map__new_by_tid(pid_t tid);struct thread_map *thread_map__new_by_uid (uid_t uid);struct thread_map *thread_map__new (pid_t pid,pid_t tid,uid_t uid); +struct thread_map *thread_map__get (struct thread_map *map); +void thread_map__put (struct thread_map *map); +struct thread_map *thread_map__new_str (const char *pid,const char *tid,uid_t uid); -void thread_map__delete (struct thread_map *threads); -size_t thread_map__fprintf (struct thread_map *threads,FILE *fp);static inline int thread_map__nr (struct thread_map *threads)
Signature · 1 line
2.1.0
Arnaldo Carvalho de Melo
maintainerPATCH 5/7 perf evlist: Propagate cpu maps to evsels in an evlist
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
Propagate evlist's cpu_map object through all the evsel objects, while keeping already configured evsel->cpus.
It'll be handy to access evsel's cpus directly in following patches.
--- tools/perf/util/evlist.c | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-)
tools/perf/util/evlist.c +24 -1
@@ -1101,6 +1101,29 @@ int perf_evlist__mmap(struct perf_evlist *evlist, unsigned int pages,return perf_evlist__mmap_ex (evlist, pages, overwrite,0 , false); } +static int perf_evlist__propagate_maps (struct perf_evlist *evlist, +struct target *target) +{ +struct perf_evsel *evsel; + +evlist__for_each (evlist, evsel) { +/* +* We already have cpus for evsel (via PMU sysfs) so +* keep it, if there's no target cpu list defined. +*/ +if (evsel->cpus && target->cpu_list) +cpu_map__put (evsel->cpus); + +if (!evsel->cpus || target->cpu_list) + evsel->cpus =cpu_map__get (evlist->cpus); + +if (!evsel->cpus) +return -ENOMEM ; + } + +return 0 ; +} +int perf_evlist__create_maps (struct perf_evlist *evlist,struct target *target) { evlist->threads = thread_map__new_str(target->pid, target->tid,
@@ -1117,7 +1140,7 @@ int perf_evlist__create_maps(struct perf_evlist *evlist, struct target *target)if (evlist->cpus ==NULL ) goto out_delete_threads; -return 0 ; +return perf_evlist__propagate_maps (evlist, target); out_delete_threads:thread_map__put (evlist->threads);
Signature · 1 line
2.1.0
Arnaldo Carvalho de Melo
maintainerPATCH 6/7 perf evlist: Propagate thread maps through the evlist
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
Propagate evlist's thread_map object through all the evsel objects.
It'll be handy to access evsel's threads directly in following patches. The reason is there's no link from evsel to evlist which hold threads map now and evlist is not always available.
--- tools/perf/util/evlist.c | 4 +++- tools/perf/util/evsel.c | 1 + tools/perf/util/evsel.h | 1 + 3 files changed, 5 insertions(+), 1 deletion(-)
tools/perf/util/evlist.c +3 -1
@@ -1117,7 +1117,9 @@ static int perf_evlist__propagate_maps(struct perf_evlist *evlist,if (!evsel->cpus || target->cpu_list) evsel->cpus =cpu_map__get (evlist->cpus); -if (!evsel->cpus) + evsel->threads =thread_map__get (evlist->threads); + +if (!evsel->cpus || !evsel->threads)return -ENOMEM ; }
tools/perf/util/evsel.c +1 -0
@@ -886,6 +886,7 @@ void perf_evsel__exit(struct perf_evsel *evsel)perf_evsel__free_id (evsel);close_cgroup (evsel->cgrp);cpu_map__put (evsel->cpus); +thread_map__put (evsel->threads);zfree (&evsel->group_name);zfree (&evsel->name); perf_evsel__object.fini (evsel);
tools/perf/util/evsel.h +1 -0
@@ -82,6 +82,7 @@ struct perf_evsel {struct cgroup_sel *cgrp;void *handler;struct cpu_map *cpus; +struct thread_map *threads;unsigned int sample_size;int id_pos;int is_pos;
Signature · 1 line
2.1.0
Arnaldo Carvalho de Melo
maintainerPATCH 7/7 perf tools: Make perf_evsel__(nr_)cpus generic
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
Because we now propagate all evlist's cpu_maps and thread_map objects through all evsels, the perf_evsel__(nr_)cpus no longer need to be specific to stat object and check evlist and target objects.
--- tools/perf/builtin-stat.c | 10 ---------- tools/perf/util/evsel.h | 11 +++++++++++ 2 files changed, 11 insertions(+), 10 deletions(-)
tools/perf/builtin-stat.c +0 -10
@@ -141,16 +141,6 @@ static inline void diff_timespec(struct timespec *r, struct timespec *a, } } -static inline struct cpu_map *perf_evsel__cpus (struct perf_evsel *evsel) -{ -return (evsel->cpus && !target.cpu_list) ? evsel->cpus : evsel_list->cpus; -} - -static inline int perf_evsel__nr_cpus (struct perf_evsel *evsel) -{ -return perf_evsel__cpus (evsel)->nr; -} -static void perf_evsel__reset_stat_priv (struct perf_evsel *evsel) {int i;
tools/perf/util/evsel.h +11 -0
@@ -8,6 +8,7 @@#include <linux/types.h> #include "xyarray.h" #include "symbol.h" +#include "cpumap.h" struct perf_counts_values { union {
@@ -114,6 +115,16 @@ struct thread_map;struct perf_evlist ;struct record_opts ; +static inline struct cpu_map *perf_evsel__cpus (struct perf_evsel *evsel) +{ +return evsel->cpus; +} + +static inline int perf_evsel__nr_cpus (struct perf_evsel *evsel) +{ +return perf_evsel__cpus (evsel)->nr; +} +void perf_counts_values__scale (struct perf_counts_values *count,bool scale,s8 *pscaled);
Signature · 1 line
2.1.0
Quoted 63 lines · Arnaldo Carvalho de Melo
Hi Ingo,
Please consider pulling,
- Arnaldo
The following changes since commit
27451700dfa01a05cdb4d9d74501536165158034:Merge tag 'perf-core-for-mingo' of
git://git.kernel.org/pub/scm/linux/kernel/git/acme/linuxinto perf/core (2015-06-25 09:28:42 +0200)are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux.gittags/perf-core-for-mingofor you to fetch changes up to
a22e99cd74a31dee4b5241bd60a256c629c808da:perf tools: Make perf_evsel__(nr_)cpus generic (2015-06-25 17:15:39 -0300)
----------------------------------------------------------------
perf/core improvements and refactorings:Infrastructure:
- Reference count the
cpu_mapandthread_mapclasses. (Jiri Olsa)- Set evsel->{cpus,threads} from the evlist, if not set, allowing the generalization of some 'perf stat' functions that previously were accessing private static evlist variable. (Jiri Olsa)
- Delete an unnecessary check before the calling
free_event_desc()(Markus Elfring)Signed-off-by Arnaldo Carvalho de Melo <[email protected]>----------------------------------------------------------------
Arnaldo Carvalho de Melo (1):
perf tools: Future-proofthread_mapallocation size calculationJiri Olsa (5):
perf tools: Add reference counting forcpu_mapobject perf tools: Add reference counting forthread_mapobject perf evlist: Propagate cpu maps to evsels in an evlist perf evlist: Propagate thread maps through the evlist perf tools: Make perf_evsel__(nr_)cpus genericMarkus Elfring (1):
perf header: Delete an unnecessary check before the callingfree_event_desc()tools/perf/builtin-stat.c | 10 --------- 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 | 2 +- tools/perf/tests/openat-syscall.c | 2 +- tools/perf/tests/switch-tracking.c | 4 ++-- tools/perf/util/cpumap.c | 26 ++++++++++++++++++++-- tools/perf/util/cpumap.h | 6 ++++- tools/perf/util/evlist.c | 35 +++++++++++++++++++++++++----- tools/perf/util/evsel.c | 2 ++ tools/perf/util/evsel.h | 12 ++++++++++ tools/perf/util/header.c | 3 +--
Quoted 8 lines
tools/perf/util/parse-events.c | 5 ++++- tools/perf/util/python.c | 4 ++-- tools/perf/util/record.c | 4 ++-- tools/perf/util/session.c | 2 +- tools/perf/util/svghelper.c | 2 +- tools/perf/util/thread_map.c | 32 ++++++++++++++++++++++++--- tools/perf/util/thread_map.h | 7 ++++-- 21 files changed, 129 insertions(+), 43 deletions(-)
Pulled, thanks a lot Arnaldo!
Ingo