2015-06-26 09:29:08 +00:00
|
|
|
#include <sys/types.h>
|
|
|
|
#include <unistd.h>
|
2016-06-28 11:29:03 +00:00
|
|
|
#include <sys/prctl.h>
|
2015-06-26 09:29:08 +00:00
|
|
|
#include "tests.h"
|
|
|
|
#include "thread_map.h"
|
|
|
|
#include "debug.h"
|
|
|
|
|
2016-06-28 11:29:03 +00:00
|
|
|
#define NAME (const char *) "perf"
|
|
|
|
#define NAMEUL (unsigned long) NAME
|
|
|
|
|
perf tests: Pass the subtest index to each test routine
Some tests have sub-tests we want to run, so allow passing this.
Wang tried to avoid having to touch all tests, but then, having the
test.func in an anonymous union makes the build fail on older compilers,
like the one in RHEL6, where:
test a = {
.func = foo,
};
fails.
To fix it leave the func pointer in the main structure and pass the subtest
index to all tests, end result function is the same, but we have just one
function pointer, not two, with and without the subtest index as an argument.
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Wang Nan <wangnan0@huawei.com>
Link: http://lkml.kernel.org/n/tip-5genj0ficwdmelpoqlds0u4y@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2015-11-19 15:01:48 +00:00
|
|
|
int test__thread_map(int subtest __maybe_unused)
|
2015-06-26 09:29:08 +00:00
|
|
|
{
|
|
|
|
struct thread_map *map;
|
|
|
|
|
2016-06-28 11:29:03 +00:00
|
|
|
TEST_ASSERT_VAL("failed to set process name",
|
|
|
|
!prctl(PR_SET_NAME, NAMEUL, 0, 0, 0));
|
|
|
|
|
2015-06-26 09:29:08 +00:00
|
|
|
/* test map on current pid */
|
|
|
|
map = thread_map__new_by_pid(getpid());
|
|
|
|
TEST_ASSERT_VAL("failed to alloc map", map);
|
|
|
|
|
|
|
|
thread_map__read_comms(map);
|
|
|
|
|
|
|
|
TEST_ASSERT_VAL("wrong nr", map->nr == 1);
|
|
|
|
TEST_ASSERT_VAL("wrong pid",
|
|
|
|
thread_map__pid(map, 0) == getpid());
|
|
|
|
TEST_ASSERT_VAL("wrong comm",
|
|
|
|
thread_map__comm(map, 0) &&
|
2016-06-28 11:29:03 +00:00
|
|
|
!strcmp(thread_map__comm(map, 0), NAME));
|
2015-07-21 12:31:21 +00:00
|
|
|
TEST_ASSERT_VAL("wrong refcnt",
|
|
|
|
atomic_read(&map->refcnt) == 1);
|
2015-06-26 09:29:08 +00:00
|
|
|
thread_map__put(map);
|
|
|
|
|
|
|
|
/* test dummy pid */
|
|
|
|
map = thread_map__new_dummy();
|
|
|
|
TEST_ASSERT_VAL("failed to alloc map", map);
|
|
|
|
|
|
|
|
thread_map__read_comms(map);
|
|
|
|
|
|
|
|
TEST_ASSERT_VAL("wrong nr", map->nr == 1);
|
|
|
|
TEST_ASSERT_VAL("wrong pid", thread_map__pid(map, 0) == -1);
|
|
|
|
TEST_ASSERT_VAL("wrong comm",
|
|
|
|
thread_map__comm(map, 0) &&
|
|
|
|
!strcmp(thread_map__comm(map, 0), "dummy"));
|
2015-07-21 12:31:21 +00:00
|
|
|
TEST_ASSERT_VAL("wrong refcnt",
|
|
|
|
atomic_read(&map->refcnt) == 1);
|
2015-06-26 09:29:08 +00:00
|
|
|
thread_map__put(map);
|
|
|
|
return 0;
|
|
|
|
}
|
2015-10-25 14:51:20 +00:00
|
|
|
|
|
|
|
static int process_event(struct perf_tool *tool __maybe_unused,
|
|
|
|
union perf_event *event,
|
|
|
|
struct perf_sample *sample __maybe_unused,
|
|
|
|
struct machine *machine __maybe_unused)
|
|
|
|
{
|
|
|
|
struct thread_map_event *map = &event->thread_map;
|
2015-10-25 14:51:21 +00:00
|
|
|
struct thread_map *threads;
|
2015-10-25 14:51:20 +00:00
|
|
|
|
|
|
|
TEST_ASSERT_VAL("wrong nr", map->nr == 1);
|
|
|
|
TEST_ASSERT_VAL("wrong pid", map->entries[0].pid == (u64) getpid());
|
2016-06-28 11:29:03 +00:00
|
|
|
TEST_ASSERT_VAL("wrong comm", !strcmp(map->entries[0].comm, NAME));
|
2015-10-25 14:51:21 +00:00
|
|
|
|
|
|
|
threads = thread_map__new_event(&event->thread_map);
|
|
|
|
TEST_ASSERT_VAL("failed to alloc map", threads);
|
|
|
|
|
|
|
|
TEST_ASSERT_VAL("wrong nr", threads->nr == 1);
|
|
|
|
TEST_ASSERT_VAL("wrong pid",
|
|
|
|
thread_map__pid(threads, 0) == getpid());
|
|
|
|
TEST_ASSERT_VAL("wrong comm",
|
|
|
|
thread_map__comm(threads, 0) &&
|
2016-06-28 11:29:03 +00:00
|
|
|
!strcmp(thread_map__comm(threads, 0), NAME));
|
2015-10-25 14:51:21 +00:00
|
|
|
TEST_ASSERT_VAL("wrong refcnt",
|
|
|
|
atomic_read(&threads->refcnt) == 1);
|
|
|
|
thread_map__put(threads);
|
2015-10-25 14:51:20 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int test__thread_map_synthesize(int subtest __maybe_unused)
|
|
|
|
{
|
|
|
|
struct thread_map *threads;
|
|
|
|
|
2016-06-28 11:29:03 +00:00
|
|
|
TEST_ASSERT_VAL("failed to set process name",
|
|
|
|
!prctl(PR_SET_NAME, NAMEUL, 0, 0, 0));
|
|
|
|
|
2015-10-25 14:51:20 +00:00
|
|
|
/* test map on current pid */
|
|
|
|
threads = thread_map__new_by_pid(getpid());
|
|
|
|
TEST_ASSERT_VAL("failed to alloc map", threads);
|
|
|
|
|
|
|
|
thread_map__read_comms(threads);
|
|
|
|
|
|
|
|
TEST_ASSERT_VAL("failed to synthesize map",
|
|
|
|
!perf_event__synthesize_thread_map2(NULL, threads, process_event, NULL));
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|