提交 4b49cce2 编写于 作者: J Jiri Olsa 提交者: Arnaldo Carvalho de Melo

libperf: Add perf_thread_map__new_dummy() function

Moving the following functions:

  thread_map__new_dummy()
  thread_map__realloc()
  thread_map__set_pid()

to libperf with the following names:

  perf_thread_map__new_dummy()
  perf_thread_map__realloc()
  perf_thread_map__set_pid()

the other 2 functions are dependencies of the
perf_thread_map__new_dummy() function.

The perf_thread_map__realloc() function is not exported.
Signed-off-by: NJiri Olsa <jolsa@kernel.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Alexey Budankov <alexey.budankov@linux.intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Michael Petlan <mpetlan@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/20190721112506.12306-33-jolsa@kernel.orgSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
上级 07acd226
...@@ -18,4 +18,6 @@ struct perf_thread_map { ...@@ -18,4 +18,6 @@ struct perf_thread_map {
struct thread_map_data map[]; struct thread_map_data map[];
}; };
struct perf_thread_map *perf_thread_map__realloc(struct perf_thread_map *map, int nr);
#endif /* __LIBPERF_INTERNAL_THREADMAP_H */ #endif /* __LIBPERF_INTERNAL_THREADMAP_H */
...@@ -2,6 +2,13 @@ ...@@ -2,6 +2,13 @@
#ifndef __LIBPERF_THREADMAP_H #ifndef __LIBPERF_THREADMAP_H
#define __LIBPERF_THREADMAP_H #define __LIBPERF_THREADMAP_H
#include <perf/core.h>
#include <sys/types.h>
struct perf_thread_map; struct perf_thread_map;
LIBPERF_API struct perf_thread_map *perf_thread_map__new_dummy(void);
LIBPERF_API void perf_thread_map__set_pid(struct perf_thread_map *map, int thread, pid_t pid);
#endif /* __LIBPERF_THREADMAP_H */ #endif /* __LIBPERF_THREADMAP_H */
...@@ -4,6 +4,8 @@ LIBPERF_0.0.1 { ...@@ -4,6 +4,8 @@ LIBPERF_0.0.1 {
perf_cpu_map__dummy_new; perf_cpu_map__dummy_new;
perf_cpu_map__get; perf_cpu_map__get;
perf_cpu_map__put; perf_cpu_map__put;
perf_thread_map__new_dummy;
perf_thread_map__set_pid;
local: local:
*; *;
}; };
...@@ -3,3 +3,46 @@ ...@@ -3,3 +3,46 @@
#include <stdlib.h> #include <stdlib.h>
#include <linux/refcount.h> #include <linux/refcount.h>
#include <internal/threadmap.h> #include <internal/threadmap.h>
#include <string.h>
static void perf_thread_map__reset(struct perf_thread_map *map, int start, int nr)
{
size_t size = (nr - start) * sizeof(map->map[0]);
memset(&map->map[start], 0, size);
map->err_thread = -1;
}
struct perf_thread_map *perf_thread_map__realloc(struct perf_thread_map *map, int nr)
{
size_t size = sizeof(*map) + sizeof(map->map[0]) * nr;
int start = map ? map->nr : 0;
map = realloc(map, size);
/*
* We only realloc to add more items, let's reset new items.
*/
if (map)
perf_thread_map__reset(map, start, nr);
return map;
}
#define thread_map__alloc(__nr) perf_thread_map__realloc(NULL, __nr)
void perf_thread_map__set_pid(struct perf_thread_map *map, int thread, pid_t pid)
{
map->map[thread].pid = pid;
}
struct perf_thread_map *perf_thread_map__new_dummy(void)
{
struct perf_thread_map *threads = thread_map__alloc(1);
if (threads != NULL) {
perf_thread_map__set_pid(threads, 0, -1);
threads->nr = 1;
refcount_set(&threads->refcnt, 1);
}
return threads;
}
...@@ -58,7 +58,7 @@ int test__syscall_openat_tp_fields(struct test *test __maybe_unused, int subtest ...@@ -58,7 +58,7 @@ int test__syscall_openat_tp_fields(struct test *test __maybe_unused, int subtest
perf_evsel__config(evsel, &opts, NULL); perf_evsel__config(evsel, &opts, NULL);
thread_map__set_pid(evlist->threads, 0, getpid()); perf_thread_map__set_pid(evlist->threads, 0, getpid());
err = evlist__open(evlist); err = evlist__open(evlist);
if (err < 0) { if (err < 0) {
......
...@@ -35,7 +35,7 @@ int test__thread_map(struct test *test __maybe_unused, int subtest __maybe_unuse ...@@ -35,7 +35,7 @@ int test__thread_map(struct test *test __maybe_unused, int subtest __maybe_unuse
thread_map__put(map); thread_map__put(map);
/* test dummy pid */ /* test dummy pid */
map = thread_map__new_dummy(); map = perf_thread_map__new_dummy();
TEST_ASSERT_VAL("failed to alloc map", map); TEST_ASSERT_VAL("failed to alloc map", map);
thread_map__read_comms(map); thread_map__read_comms(map);
......
...@@ -1375,7 +1375,7 @@ static int perf_evlist__create_syswide_maps(struct evlist *evlist) ...@@ -1375,7 +1375,7 @@ static int perf_evlist__create_syswide_maps(struct evlist *evlist)
if (!cpus) if (!cpus)
goto out; goto out;
threads = thread_map__new_dummy(); threads = perf_thread_map__new_dummy();
if (!threads) if (!threads)
goto out_put; goto out_put;
...@@ -1504,7 +1504,7 @@ int perf_evlist__prepare_workload(struct evlist *evlist, struct target *target, ...@@ -1504,7 +1504,7 @@ int perf_evlist__prepare_workload(struct evlist *evlist, struct target *target,
__func__, __LINE__); __func__, __LINE__);
goto out_close_pipes; goto out_close_pipes;
} }
thread_map__set_pid(evlist->threads, 0, evlist->workload.pid); perf_thread_map__set_pid(evlist->threads, 0, evlist->workload.pid);
} }
close(child_ready_pipe[1]); close(child_ready_pipe[1]);
......
...@@ -28,30 +28,7 @@ static int filter(const struct dirent *dir) ...@@ -28,30 +28,7 @@ static int filter(const struct dirent *dir)
return 1; return 1;
} }
static void thread_map__reset(struct perf_thread_map *map, int start, int nr) #define thread_map__alloc(__nr) perf_thread_map__realloc(NULL, __nr)
{
size_t size = (nr - start) * sizeof(map->map[0]);
memset(&map->map[start], 0, size);
map->err_thread = -1;
}
static struct perf_thread_map *thread_map__realloc(struct perf_thread_map *map, int nr)
{
size_t size = sizeof(*map) + sizeof(map->map[0]) * nr;
int start = map ? map->nr : 0;
map = realloc(map, size);
/*
* We only realloc to add more items, let's reset new items.
*/
if (map)
thread_map__reset(map, start, nr);
return map;
}
#define thread_map__alloc(__nr) thread_map__realloc(NULL, __nr)
struct perf_thread_map *thread_map__new_by_pid(pid_t pid) struct perf_thread_map *thread_map__new_by_pid(pid_t pid)
{ {
...@@ -69,7 +46,7 @@ struct perf_thread_map *thread_map__new_by_pid(pid_t pid) ...@@ -69,7 +46,7 @@ struct perf_thread_map *thread_map__new_by_pid(pid_t pid)
threads = thread_map__alloc(items); threads = thread_map__alloc(items);
if (threads != NULL) { if (threads != NULL) {
for (i = 0; i < items; i++) for (i = 0; i < items; i++)
thread_map__set_pid(threads, i, atoi(namelist[i]->d_name)); perf_thread_map__set_pid(threads, i, atoi(namelist[i]->d_name));
threads->nr = items; threads->nr = items;
refcount_set(&threads->refcnt, 1); refcount_set(&threads->refcnt, 1);
} }
...@@ -86,7 +63,7 @@ struct perf_thread_map *thread_map__new_by_tid(pid_t tid) ...@@ -86,7 +63,7 @@ struct perf_thread_map *thread_map__new_by_tid(pid_t tid)
struct perf_thread_map *threads = thread_map__alloc(1); struct perf_thread_map *threads = thread_map__alloc(1);
if (threads != NULL) { if (threads != NULL) {
thread_map__set_pid(threads, 0, tid); perf_thread_map__set_pid(threads, 0, tid);
threads->nr = 1; threads->nr = 1;
refcount_set(&threads->refcnt, 1); refcount_set(&threads->refcnt, 1);
} }
...@@ -142,7 +119,7 @@ static struct perf_thread_map *__thread_map__new_all_cpus(uid_t uid) ...@@ -142,7 +119,7 @@ static struct perf_thread_map *__thread_map__new_all_cpus(uid_t uid)
if (grow) { if (grow) {
struct perf_thread_map *tmp; struct perf_thread_map *tmp;
tmp = thread_map__realloc(threads, max_threads); tmp = perf_thread_map__realloc(threads, max_threads);
if (tmp == NULL) if (tmp == NULL)
goto out_free_namelist; goto out_free_namelist;
...@@ -150,8 +127,8 @@ static struct perf_thread_map *__thread_map__new_all_cpus(uid_t uid) ...@@ -150,8 +127,8 @@ static struct perf_thread_map *__thread_map__new_all_cpus(uid_t uid)
} }
for (i = 0; i < items; i++) { for (i = 0; i < items; i++) {
thread_map__set_pid(threads, threads->nr + i, perf_thread_map__set_pid(threads, threads->nr + i,
atoi(namelist[i]->d_name)); atoi(namelist[i]->d_name));
} }
for (i = 0; i < items; i++) for (i = 0; i < items; i++)
...@@ -233,14 +210,14 @@ static struct perf_thread_map *thread_map__new_by_pid_str(const char *pid_str) ...@@ -233,14 +210,14 @@ static struct perf_thread_map *thread_map__new_by_pid_str(const char *pid_str)
goto out_free_threads; goto out_free_threads;
total_tasks += items; total_tasks += items;
nt = thread_map__realloc(threads, total_tasks); nt = perf_thread_map__realloc(threads, total_tasks);
if (nt == NULL) if (nt == NULL)
goto out_free_namelist; goto out_free_namelist;
threads = nt; threads = nt;
for (i = 0; i < items; i++) { for (i = 0; i < items; i++) {
thread_map__set_pid(threads, j++, atoi(namelist[i]->d_name)); perf_thread_map__set_pid(threads, j++, atoi(namelist[i]->d_name));
zfree(&namelist[i]); zfree(&namelist[i]);
} }
threads->nr = total_tasks; threads->nr = total_tasks;
...@@ -263,18 +240,6 @@ static struct perf_thread_map *thread_map__new_by_pid_str(const char *pid_str) ...@@ -263,18 +240,6 @@ static struct perf_thread_map *thread_map__new_by_pid_str(const char *pid_str)
goto out; goto out;
} }
struct perf_thread_map *thread_map__new_dummy(void)
{
struct perf_thread_map *threads = thread_map__alloc(1);
if (threads != NULL) {
thread_map__set_pid(threads, 0, -1);
threads->nr = 1;
refcount_set(&threads->refcnt, 1);
}
return threads;
}
struct perf_thread_map *thread_map__new_by_tid_str(const char *tid_str) struct perf_thread_map *thread_map__new_by_tid_str(const char *tid_str)
{ {
struct perf_thread_map *threads = NULL, *nt; struct perf_thread_map *threads = NULL, *nt;
...@@ -287,7 +252,7 @@ struct perf_thread_map *thread_map__new_by_tid_str(const char *tid_str) ...@@ -287,7 +252,7 @@ struct perf_thread_map *thread_map__new_by_tid_str(const char *tid_str)
/* perf-stat expects threads to be generated even if tid not given */ /* perf-stat expects threads to be generated even if tid not given */
if (!tid_str) if (!tid_str)
return thread_map__new_dummy(); return perf_thread_map__new_dummy();
slist = strlist__new(tid_str, &slist_config); slist = strlist__new(tid_str, &slist_config);
if (!slist) if (!slist)
...@@ -304,13 +269,13 @@ struct perf_thread_map *thread_map__new_by_tid_str(const char *tid_str) ...@@ -304,13 +269,13 @@ struct perf_thread_map *thread_map__new_by_tid_str(const char *tid_str)
continue; continue;
ntasks++; ntasks++;
nt = thread_map__realloc(threads, ntasks); nt = perf_thread_map__realloc(threads, ntasks);
if (nt == NULL) if (nt == NULL)
goto out_free_threads; goto out_free_threads;
threads = nt; threads = nt;
thread_map__set_pid(threads, ntasks - 1, tid); perf_thread_map__set_pid(threads, ntasks - 1, tid);
threads->nr = ntasks; threads->nr = ntasks;
} }
out: out:
...@@ -437,7 +402,7 @@ static void thread_map__copy_event(struct perf_thread_map *threads, ...@@ -437,7 +402,7 @@ static void thread_map__copy_event(struct perf_thread_map *threads,
threads->nr = (int) event->nr; threads->nr = (int) event->nr;
for (i = 0; i < event->nr; i++) { for (i = 0; i < event->nr; i++) {
thread_map__set_pid(threads, i, (pid_t) event->entries[i].pid); perf_thread_map__set_pid(threads, i, (pid_t) event->entries[i].pid);
threads->map[i].comm = strndup(event->entries[i].comm, 16); threads->map[i].comm = strndup(event->entries[i].comm, 16);
} }
......
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
#include <stdio.h> #include <stdio.h>
#include <linux/refcount.h> #include <linux/refcount.h>
#include <internal/threadmap.h> #include <internal/threadmap.h>
#include <perf/threadmap.h>
struct thread_map_event; struct thread_map_event;
...@@ -37,12 +38,6 @@ static inline pid_t thread_map__pid(struct perf_thread_map *map, int thread) ...@@ -37,12 +38,6 @@ static inline pid_t thread_map__pid(struct perf_thread_map *map, int thread)
return map->map[thread].pid; return map->map[thread].pid;
} }
static inline void
thread_map__set_pid(struct perf_thread_map *map, int thread, pid_t pid)
{
map->map[thread].pid = pid;
}
static inline char *thread_map__comm(struct perf_thread_map *map, int thread) static inline char *thread_map__comm(struct perf_thread_map *map, int thread)
{ {
return map->map[thread].comm; return map->map[thread].comm;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册