2012-05-21 15:12:49 +08:00
|
|
|
|
|
|
|
#include "parse-events.h"
|
|
|
|
#include "evsel.h"
|
|
|
|
#include "evlist.h"
|
2013-12-10 00:14:24 +08:00
|
|
|
#include <api/fs/fs.h>
|
2012-11-10 08:46:51 +08:00
|
|
|
#include "tests.h"
|
2014-07-15 05:46:48 +08:00
|
|
|
#include "debug.h"
|
2015-10-19 23:23:49 +08:00
|
|
|
#include "util.h"
|
2012-11-20 06:21:03 +08:00
|
|
|
#include <linux/hw_breakpoint.h>
|
2015-09-02 15:56:43 +08:00
|
|
|
#include <api/fs/fs.h>
|
2012-05-21 15:12:49 +08:00
|
|
|
|
2012-08-01 20:48:58 +08:00
|
|
|
#define PERF_TP_SAMPLE_TYPE (PERF_SAMPLE_RAW | PERF_SAMPLE_TIME | \
|
|
|
|
PERF_SAMPLE_CPU | PERF_SAMPLE_PERIOD)
|
|
|
|
|
2012-05-21 15:12:49 +08:00
|
|
|
static int test__checkevent_tracepoint(struct perf_evlist *evlist)
|
|
|
|
{
|
2012-08-15 03:42:15 +08:00
|
|
|
struct perf_evsel *evsel = perf_evlist__first(evlist);
|
2012-05-21 15:12:49 +08:00
|
|
|
|
|
|
|
TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
|
2013-01-22 17:09:30 +08:00
|
|
|
TEST_ASSERT_VAL("wrong number of groups", 0 == evlist->nr_groups);
|
2012-05-21 15:12:49 +08:00
|
|
|
TEST_ASSERT_VAL("wrong type", PERF_TYPE_TRACEPOINT == evsel->attr.type);
|
|
|
|
TEST_ASSERT_VAL("wrong sample_type",
|
2012-08-01 20:48:58 +08:00
|
|
|
PERF_TP_SAMPLE_TYPE == evsel->attr.sample_type);
|
2012-05-21 15:12:49 +08:00
|
|
|
TEST_ASSERT_VAL("wrong sample_period", 1 == evsel->attr.sample_period);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int test__checkevent_tracepoint_multi(struct perf_evlist *evlist)
|
|
|
|
{
|
|
|
|
struct perf_evsel *evsel;
|
|
|
|
|
|
|
|
TEST_ASSERT_VAL("wrong number of entries", evlist->nr_entries > 1);
|
2013-01-22 17:09:30 +08:00
|
|
|
TEST_ASSERT_VAL("wrong number of groups", 0 == evlist->nr_groups);
|
2012-05-21 15:12:49 +08:00
|
|
|
|
2014-01-10 21:37:27 +08:00
|
|
|
evlist__for_each(evlist, evsel) {
|
2012-05-21 15:12:49 +08:00
|
|
|
TEST_ASSERT_VAL("wrong type",
|
|
|
|
PERF_TYPE_TRACEPOINT == evsel->attr.type);
|
|
|
|
TEST_ASSERT_VAL("wrong sample_type",
|
2012-08-01 20:48:58 +08:00
|
|
|
PERF_TP_SAMPLE_TYPE == evsel->attr.sample_type);
|
2012-05-21 15:12:49 +08:00
|
|
|
TEST_ASSERT_VAL("wrong sample_period",
|
|
|
|
1 == evsel->attr.sample_period);
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int test__checkevent_raw(struct perf_evlist *evlist)
|
|
|
|
{
|
2012-08-15 03:42:15 +08:00
|
|
|
struct perf_evsel *evsel = perf_evlist__first(evlist);
|
2012-05-21 15:12:49 +08:00
|
|
|
|
|
|
|
TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
|
|
|
|
TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type);
|
|
|
|
TEST_ASSERT_VAL("wrong config", 0x1a == evsel->attr.config);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int test__checkevent_numeric(struct perf_evlist *evlist)
|
|
|
|
{
|
2012-08-15 03:42:15 +08:00
|
|
|
struct perf_evsel *evsel = perf_evlist__first(evlist);
|
2012-05-21 15:12:49 +08:00
|
|
|
|
|
|
|
TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
|
|
|
|
TEST_ASSERT_VAL("wrong type", 1 == evsel->attr.type);
|
|
|
|
TEST_ASSERT_VAL("wrong config", 1 == evsel->attr.config);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int test__checkevent_symbolic_name(struct perf_evlist *evlist)
|
|
|
|
{
|
2012-08-15 03:42:15 +08:00
|
|
|
struct perf_evsel *evsel = perf_evlist__first(evlist);
|
2012-05-21 15:12:49 +08:00
|
|
|
|
|
|
|
TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
|
|
|
|
TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
|
|
|
|
TEST_ASSERT_VAL("wrong config",
|
|
|
|
PERF_COUNT_HW_INSTRUCTIONS == evsel->attr.config);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int test__checkevent_symbolic_name_config(struct perf_evlist *evlist)
|
|
|
|
{
|
2012-08-15 03:42:15 +08:00
|
|
|
struct perf_evsel *evsel = perf_evlist__first(evlist);
|
2012-05-21 15:12:49 +08:00
|
|
|
|
|
|
|
TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
|
|
|
|
TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
|
|
|
|
TEST_ASSERT_VAL("wrong config",
|
|
|
|
PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
|
2015-07-29 17:42:11 +08:00
|
|
|
/*
|
|
|
|
* The period value gets configured within perf_evlist__config,
|
|
|
|
* while this test executes only parse events method.
|
|
|
|
*/
|
2012-05-21 15:12:49 +08:00
|
|
|
TEST_ASSERT_VAL("wrong period",
|
2015-07-29 17:42:11 +08:00
|
|
|
0 == evsel->attr.sample_period);
|
2012-05-21 15:12:49 +08:00
|
|
|
TEST_ASSERT_VAL("wrong config1",
|
|
|
|
0 == evsel->attr.config1);
|
|
|
|
TEST_ASSERT_VAL("wrong config2",
|
|
|
|
1 == evsel->attr.config2);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int test__checkevent_symbolic_alias(struct perf_evlist *evlist)
|
|
|
|
{
|
2012-08-15 03:42:15 +08:00
|
|
|
struct perf_evsel *evsel = perf_evlist__first(evlist);
|
2012-05-21 15:12:49 +08:00
|
|
|
|
|
|
|
TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
|
|
|
|
TEST_ASSERT_VAL("wrong type", PERF_TYPE_SOFTWARE == evsel->attr.type);
|
|
|
|
TEST_ASSERT_VAL("wrong config",
|
|
|
|
PERF_COUNT_SW_PAGE_FAULTS == evsel->attr.config);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int test__checkevent_genhw(struct perf_evlist *evlist)
|
|
|
|
{
|
2012-08-15 03:42:15 +08:00
|
|
|
struct perf_evsel *evsel = perf_evlist__first(evlist);
|
2012-05-21 15:12:49 +08:00
|
|
|
|
|
|
|
TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
|
|
|
|
TEST_ASSERT_VAL("wrong type", PERF_TYPE_HW_CACHE == evsel->attr.type);
|
|
|
|
TEST_ASSERT_VAL("wrong config", (1 << 16) == evsel->attr.config);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int test__checkevent_breakpoint(struct perf_evlist *evlist)
|
|
|
|
{
|
2012-08-15 03:42:15 +08:00
|
|
|
struct perf_evsel *evsel = perf_evlist__first(evlist);
|
2012-05-21 15:12:49 +08:00
|
|
|
|
|
|
|
TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
|
|
|
|
TEST_ASSERT_VAL("wrong type", PERF_TYPE_BREAKPOINT == evsel->attr.type);
|
|
|
|
TEST_ASSERT_VAL("wrong config", 0 == evsel->attr.config);
|
|
|
|
TEST_ASSERT_VAL("wrong bp_type", (HW_BREAKPOINT_R | HW_BREAKPOINT_W) ==
|
|
|
|
evsel->attr.bp_type);
|
|
|
|
TEST_ASSERT_VAL("wrong bp_len", HW_BREAKPOINT_LEN_4 ==
|
|
|
|
evsel->attr.bp_len);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int test__checkevent_breakpoint_x(struct perf_evlist *evlist)
|
|
|
|
{
|
2012-08-15 03:42:15 +08:00
|
|
|
struct perf_evsel *evsel = perf_evlist__first(evlist);
|
2012-05-21 15:12:49 +08:00
|
|
|
|
|
|
|
TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
|
|
|
|
TEST_ASSERT_VAL("wrong type", PERF_TYPE_BREAKPOINT == evsel->attr.type);
|
|
|
|
TEST_ASSERT_VAL("wrong config", 0 == evsel->attr.config);
|
|
|
|
TEST_ASSERT_VAL("wrong bp_type",
|
|
|
|
HW_BREAKPOINT_X == evsel->attr.bp_type);
|
|
|
|
TEST_ASSERT_VAL("wrong bp_len", sizeof(long) == evsel->attr.bp_len);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int test__checkevent_breakpoint_r(struct perf_evlist *evlist)
|
|
|
|
{
|
2012-08-15 03:42:15 +08:00
|
|
|
struct perf_evsel *evsel = perf_evlist__first(evlist);
|
2012-05-21 15:12:49 +08:00
|
|
|
|
|
|
|
TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
|
|
|
|
TEST_ASSERT_VAL("wrong type",
|
|
|
|
PERF_TYPE_BREAKPOINT == evsel->attr.type);
|
|
|
|
TEST_ASSERT_VAL("wrong config", 0 == evsel->attr.config);
|
|
|
|
TEST_ASSERT_VAL("wrong bp_type",
|
|
|
|
HW_BREAKPOINT_R == evsel->attr.bp_type);
|
|
|
|
TEST_ASSERT_VAL("wrong bp_len",
|
|
|
|
HW_BREAKPOINT_LEN_4 == evsel->attr.bp_len);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int test__checkevent_breakpoint_w(struct perf_evlist *evlist)
|
|
|
|
{
|
2012-08-15 03:42:15 +08:00
|
|
|
struct perf_evsel *evsel = perf_evlist__first(evlist);
|
2012-05-21 15:12:49 +08:00
|
|
|
|
|
|
|
TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
|
|
|
|
TEST_ASSERT_VAL("wrong type",
|
|
|
|
PERF_TYPE_BREAKPOINT == evsel->attr.type);
|
|
|
|
TEST_ASSERT_VAL("wrong config", 0 == evsel->attr.config);
|
|
|
|
TEST_ASSERT_VAL("wrong bp_type",
|
|
|
|
HW_BREAKPOINT_W == evsel->attr.bp_type);
|
|
|
|
TEST_ASSERT_VAL("wrong bp_len",
|
|
|
|
HW_BREAKPOINT_LEN_4 == evsel->attr.bp_len);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2012-06-29 15:22:54 +08:00
|
|
|
static int test__checkevent_breakpoint_rw(struct perf_evlist *evlist)
|
|
|
|
{
|
2012-08-15 03:42:15 +08:00
|
|
|
struct perf_evsel *evsel = perf_evlist__first(evlist);
|
2012-06-29 15:22:54 +08:00
|
|
|
|
|
|
|
TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
|
|
|
|
TEST_ASSERT_VAL("wrong type",
|
|
|
|
PERF_TYPE_BREAKPOINT == evsel->attr.type);
|
|
|
|
TEST_ASSERT_VAL("wrong config", 0 == evsel->attr.config);
|
|
|
|
TEST_ASSERT_VAL("wrong bp_type",
|
|
|
|
(HW_BREAKPOINT_R|HW_BREAKPOINT_W) == evsel->attr.bp_type);
|
|
|
|
TEST_ASSERT_VAL("wrong bp_len",
|
|
|
|
HW_BREAKPOINT_LEN_4 == evsel->attr.bp_len);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2012-05-21 15:12:49 +08:00
|
|
|
static int test__checkevent_tracepoint_modifier(struct perf_evlist *evlist)
|
|
|
|
{
|
2012-08-15 03:42:15 +08:00
|
|
|
struct perf_evsel *evsel = perf_evlist__first(evlist);
|
2012-05-21 15:12:49 +08:00
|
|
|
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
|
|
|
|
TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
|
|
|
|
|
|
|
|
return test__checkevent_tracepoint(evlist);
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
test__checkevent_tracepoint_multi_modifier(struct perf_evlist *evlist)
|
|
|
|
{
|
|
|
|
struct perf_evsel *evsel;
|
|
|
|
|
|
|
|
TEST_ASSERT_VAL("wrong number of entries", evlist->nr_entries > 1);
|
|
|
|
|
2014-01-10 21:37:27 +08:00
|
|
|
evlist__for_each(evlist, evsel) {
|
2012-05-21 15:12:49 +08:00
|
|
|
TEST_ASSERT_VAL("wrong exclude_user",
|
|
|
|
!evsel->attr.exclude_user);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_kernel",
|
|
|
|
evsel->attr.exclude_kernel);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
|
|
|
|
TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
|
|
|
|
}
|
|
|
|
|
|
|
|
return test__checkevent_tracepoint_multi(evlist);
|
|
|
|
}
|
|
|
|
|
|
|
|
static int test__checkevent_raw_modifier(struct perf_evlist *evlist)
|
|
|
|
{
|
2012-08-15 03:42:15 +08:00
|
|
|
struct perf_evsel *evsel = perf_evlist__first(evlist);
|
2012-05-21 15:12:49 +08:00
|
|
|
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
|
|
|
|
TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip);
|
|
|
|
|
|
|
|
return test__checkevent_raw(evlist);
|
|
|
|
}
|
|
|
|
|
|
|
|
static int test__checkevent_numeric_modifier(struct perf_evlist *evlist)
|
|
|
|
{
|
2012-08-15 03:42:15 +08:00
|
|
|
struct perf_evsel *evsel = perf_evlist__first(evlist);
|
2012-05-21 15:12:49 +08:00
|
|
|
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
|
|
|
|
TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip);
|
|
|
|
|
|
|
|
return test__checkevent_numeric(evlist);
|
|
|
|
}
|
|
|
|
|
|
|
|
static int test__checkevent_symbolic_name_modifier(struct perf_evlist *evlist)
|
|
|
|
{
|
2012-08-15 03:42:15 +08:00
|
|
|
struct perf_evsel *evsel = perf_evlist__first(evlist);
|
2012-05-21 15:12:49 +08:00
|
|
|
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
|
|
|
|
TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
|
|
|
|
|
|
|
|
return test__checkevent_symbolic_name(evlist);
|
|
|
|
}
|
|
|
|
|
|
|
|
static int test__checkevent_exclude_host_modifier(struct perf_evlist *evlist)
|
|
|
|
{
|
2012-08-15 03:42:15 +08:00
|
|
|
struct perf_evsel *evsel = perf_evlist__first(evlist);
|
2012-05-21 15:12:49 +08:00
|
|
|
|
|
|
|
TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);
|
|
|
|
|
|
|
|
return test__checkevent_symbolic_name(evlist);
|
|
|
|
}
|
|
|
|
|
|
|
|
static int test__checkevent_exclude_guest_modifier(struct perf_evlist *evlist)
|
|
|
|
{
|
2012-08-15 03:42:15 +08:00
|
|
|
struct perf_evsel *evsel = perf_evlist__first(evlist);
|
2012-05-21 15:12:49 +08:00
|
|
|
|
|
|
|
TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
|
|
|
|
|
|
|
|
return test__checkevent_symbolic_name(evlist);
|
|
|
|
}
|
|
|
|
|
|
|
|
static int test__checkevent_symbolic_alias_modifier(struct perf_evlist *evlist)
|
|
|
|
{
|
2012-08-15 03:42:15 +08:00
|
|
|
struct perf_evsel *evsel = perf_evlist__first(evlist);
|
2012-05-21 15:12:49 +08:00
|
|
|
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
|
|
|
|
TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
|
|
|
|
|
|
|
|
return test__checkevent_symbolic_alias(evlist);
|
|
|
|
}
|
|
|
|
|
|
|
|
static int test__checkevent_genhw_modifier(struct perf_evlist *evlist)
|
|
|
|
{
|
2012-08-15 03:42:15 +08:00
|
|
|
struct perf_evsel *evsel = perf_evlist__first(evlist);
|
2012-05-21 15:12:49 +08:00
|
|
|
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
|
|
|
|
TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip);
|
|
|
|
|
|
|
|
return test__checkevent_genhw(evlist);
|
|
|
|
}
|
|
|
|
|
2015-04-08 05:25:14 +08:00
|
|
|
static int test__checkevent_exclude_idle_modifier(struct perf_evlist *evlist)
|
|
|
|
{
|
|
|
|
struct perf_evsel *evsel = perf_evlist__first(evlist);
|
|
|
|
|
|
|
|
TEST_ASSERT_VAL("wrong exclude idle", evsel->attr.exclude_idle);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
|
|
|
|
TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
|
|
|
|
|
|
|
|
return test__checkevent_symbolic_name(evlist);
|
|
|
|
}
|
|
|
|
|
|
|
|
static int test__checkevent_exclude_idle_modifier_1(struct perf_evlist *evlist)
|
|
|
|
{
|
|
|
|
struct perf_evsel *evsel = perf_evlist__first(evlist);
|
|
|
|
|
|
|
|
TEST_ASSERT_VAL("wrong exclude idle", evsel->attr.exclude_idle);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
|
|
|
|
TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
|
|
|
|
|
|
|
|
return test__checkevent_symbolic_name(evlist);
|
|
|
|
}
|
|
|
|
|
2012-05-21 15:12:49 +08:00
|
|
|
static int test__checkevent_breakpoint_modifier(struct perf_evlist *evlist)
|
|
|
|
{
|
2012-08-15 03:42:15 +08:00
|
|
|
struct perf_evsel *evsel = perf_evlist__first(evlist);
|
2012-05-21 15:12:49 +08:00
|
|
|
|
|
|
|
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
|
|
|
|
TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
|
2012-06-29 05:18:49 +08:00
|
|
|
TEST_ASSERT_VAL("wrong name",
|
2012-08-17 03:10:21 +08:00
|
|
|
!strcmp(perf_evsel__name(evsel), "mem:0:u"));
|
2012-05-21 15:12:49 +08:00
|
|
|
|
|
|
|
return test__checkevent_breakpoint(evlist);
|
|
|
|
}
|
|
|
|
|
|
|
|
static int test__checkevent_breakpoint_x_modifier(struct perf_evlist *evlist)
|
|
|
|
{
|
2012-08-15 03:42:15 +08:00
|
|
|
struct perf_evsel *evsel = perf_evlist__first(evlist);
|
2012-05-21 15:12:49 +08:00
|
|
|
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
|
|
|
|
TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
|
2012-06-29 05:18:49 +08:00
|
|
|
TEST_ASSERT_VAL("wrong name",
|
2012-08-17 03:10:21 +08:00
|
|
|
!strcmp(perf_evsel__name(evsel), "mem:0:x:k"));
|
2012-05-21 15:12:49 +08:00
|
|
|
|
|
|
|
return test__checkevent_breakpoint_x(evlist);
|
|
|
|
}
|
|
|
|
|
|
|
|
static int test__checkevent_breakpoint_r_modifier(struct perf_evlist *evlist)
|
|
|
|
{
|
2012-08-15 03:42:15 +08:00
|
|
|
struct perf_evsel *evsel = perf_evlist__first(evlist);
|
2012-05-21 15:12:49 +08:00
|
|
|
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
|
|
|
|
TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip);
|
2012-06-29 05:18:49 +08:00
|
|
|
TEST_ASSERT_VAL("wrong name",
|
2012-08-17 03:10:21 +08:00
|
|
|
!strcmp(perf_evsel__name(evsel), "mem:0:r:hp"));
|
2012-05-21 15:12:49 +08:00
|
|
|
|
|
|
|
return test__checkevent_breakpoint_r(evlist);
|
|
|
|
}
|
|
|
|
|
|
|
|
static int test__checkevent_breakpoint_w_modifier(struct perf_evlist *evlist)
|
|
|
|
{
|
2012-08-15 03:42:15 +08:00
|
|
|
struct perf_evsel *evsel = perf_evlist__first(evlist);
|
2012-05-21 15:12:49 +08:00
|
|
|
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
|
|
|
|
TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip);
|
2012-06-29 05:18:49 +08:00
|
|
|
TEST_ASSERT_VAL("wrong name",
|
2012-08-17 03:10:21 +08:00
|
|
|
!strcmp(perf_evsel__name(evsel), "mem:0:w:up"));
|
2012-05-21 15:12:49 +08:00
|
|
|
|
|
|
|
return test__checkevent_breakpoint_w(evlist);
|
|
|
|
}
|
|
|
|
|
2012-06-29 15:22:54 +08:00
|
|
|
static int test__checkevent_breakpoint_rw_modifier(struct perf_evlist *evlist)
|
|
|
|
{
|
2012-08-15 03:42:15 +08:00
|
|
|
struct perf_evsel *evsel = perf_evlist__first(evlist);
|
2012-06-29 15:22:54 +08:00
|
|
|
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
|
|
|
|
TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip);
|
2012-06-29 05:18:49 +08:00
|
|
|
TEST_ASSERT_VAL("wrong name",
|
2012-08-17 03:10:21 +08:00
|
|
|
!strcmp(perf_evsel__name(evsel), "mem:0:rw:kp"));
|
2012-06-29 15:22:54 +08:00
|
|
|
|
|
|
|
return test__checkevent_breakpoint_rw(evlist);
|
|
|
|
}
|
|
|
|
|
2012-05-21 15:12:49 +08:00
|
|
|
static int test__checkevent_pmu(struct perf_evlist *evlist)
|
|
|
|
{
|
|
|
|
|
2012-08-15 03:42:15 +08:00
|
|
|
struct perf_evsel *evsel = perf_evlist__first(evlist);
|
2012-05-21 15:12:49 +08:00
|
|
|
|
|
|
|
TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
|
|
|
|
TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type);
|
|
|
|
TEST_ASSERT_VAL("wrong config", 10 == evsel->attr.config);
|
|
|
|
TEST_ASSERT_VAL("wrong config1", 1 == evsel->attr.config1);
|
|
|
|
TEST_ASSERT_VAL("wrong config2", 3 == evsel->attr.config2);
|
2015-07-29 17:42:11 +08:00
|
|
|
/*
|
|
|
|
* The period value gets configured within perf_evlist__config,
|
|
|
|
* while this test executes only parse events method.
|
|
|
|
*/
|
|
|
|
TEST_ASSERT_VAL("wrong period", 0 == evsel->attr.sample_period);
|
2012-05-21 15:12:49 +08:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int test__checkevent_list(struct perf_evlist *evlist)
|
|
|
|
{
|
2012-08-15 03:42:15 +08:00
|
|
|
struct perf_evsel *evsel = perf_evlist__first(evlist);
|
2012-05-21 15:12:49 +08:00
|
|
|
|
|
|
|
TEST_ASSERT_VAL("wrong number of entries", 3 == evlist->nr_entries);
|
|
|
|
|
|
|
|
/* r1 */
|
|
|
|
TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type);
|
|
|
|
TEST_ASSERT_VAL("wrong config", 1 == evsel->attr.config);
|
|
|
|
TEST_ASSERT_VAL("wrong config1", 0 == evsel->attr.config1);
|
|
|
|
TEST_ASSERT_VAL("wrong config2", 0 == evsel->attr.config2);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
|
|
|
|
TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
|
|
|
|
|
2015-04-16 21:52:53 +08:00
|
|
|
/* syscalls:sys_enter_openat:k */
|
2012-08-15 03:42:15 +08:00
|
|
|
evsel = perf_evsel__next(evsel);
|
2012-05-21 15:12:49 +08:00
|
|
|
TEST_ASSERT_VAL("wrong type", PERF_TYPE_TRACEPOINT == evsel->attr.type);
|
|
|
|
TEST_ASSERT_VAL("wrong sample_type",
|
2012-08-01 20:48:58 +08:00
|
|
|
PERF_TP_SAMPLE_TYPE == evsel->attr.sample_type);
|
2012-05-21 15:12:49 +08:00
|
|
|
TEST_ASSERT_VAL("wrong sample_period", 1 == evsel->attr.sample_period);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
|
|
|
|
TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
|
|
|
|
|
|
|
|
/* 1:1:hp */
|
2012-08-15 03:42:15 +08:00
|
|
|
evsel = perf_evsel__next(evsel);
|
2012-05-21 15:12:49 +08:00
|
|
|
TEST_ASSERT_VAL("wrong type", 1 == evsel->attr.type);
|
|
|
|
TEST_ASSERT_VAL("wrong config", 1 == evsel->attr.config);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
|
|
|
|
TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2012-05-21 15:12:53 +08:00
|
|
|
static int test__checkevent_pmu_name(struct perf_evlist *evlist)
|
|
|
|
{
|
2012-08-15 03:42:15 +08:00
|
|
|
struct perf_evsel *evsel = perf_evlist__first(evlist);
|
2012-05-21 15:12:53 +08:00
|
|
|
|
2012-06-21 18:25:16 +08:00
|
|
|
/* cpu/config=1,name=krava/u */
|
2012-05-21 15:12:53 +08:00
|
|
|
TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries);
|
|
|
|
TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type);
|
|
|
|
TEST_ASSERT_VAL("wrong config", 1 == evsel->attr.config);
|
2012-06-13 00:55:13 +08:00
|
|
|
TEST_ASSERT_VAL("wrong name", !strcmp(perf_evsel__name(evsel), "krava"));
|
2012-05-21 15:12:53 +08:00
|
|
|
|
2012-06-21 18:25:16 +08:00
|
|
|
/* cpu/config=2/u" */
|
2012-08-15 03:42:15 +08:00
|
|
|
evsel = perf_evsel__next(evsel);
|
2012-05-21 15:12:53 +08:00
|
|
|
TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries);
|
|
|
|
TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type);
|
|
|
|
TEST_ASSERT_VAL("wrong config", 2 == evsel->attr.config);
|
2012-06-21 18:25:16 +08:00
|
|
|
TEST_ASSERT_VAL("wrong name",
|
2012-08-17 03:10:21 +08:00
|
|
|
!strcmp(perf_evsel__name(evsel), "cpu/config=2/u"));
|
2012-05-21 15:12:53 +08:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2015-08-11 18:30:50 +08:00
|
|
|
static int test__checkevent_pmu_partial_time_callgraph(struct perf_evlist *evlist)
|
|
|
|
{
|
|
|
|
struct perf_evsel *evsel = perf_evlist__first(evlist);
|
|
|
|
|
|
|
|
/* cpu/config=1,call-graph=fp,time,period=100000/ */
|
|
|
|
TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries);
|
|
|
|
TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type);
|
|
|
|
TEST_ASSERT_VAL("wrong config", 1 == evsel->attr.config);
|
|
|
|
/*
|
|
|
|
* The period, time and callgraph value gets configured
|
|
|
|
* within perf_evlist__config,
|
|
|
|
* while this test executes only parse events method.
|
|
|
|
*/
|
|
|
|
TEST_ASSERT_VAL("wrong period", 0 == evsel->attr.sample_period);
|
|
|
|
TEST_ASSERT_VAL("wrong callgraph", !(PERF_SAMPLE_CALLCHAIN & evsel->attr.sample_type));
|
|
|
|
TEST_ASSERT_VAL("wrong time", !(PERF_SAMPLE_TIME & evsel->attr.sample_type));
|
|
|
|
|
|
|
|
/* cpu/config=2,call-graph=no,time=0,period=2000/ */
|
|
|
|
evsel = perf_evsel__next(evsel);
|
|
|
|
TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type);
|
|
|
|
TEST_ASSERT_VAL("wrong config", 2 == evsel->attr.config);
|
|
|
|
/*
|
|
|
|
* The period, time and callgraph value gets configured
|
|
|
|
* within perf_evlist__config,
|
|
|
|
* while this test executes only parse events method.
|
|
|
|
*/
|
|
|
|
TEST_ASSERT_VAL("wrong period", 0 == evsel->attr.sample_period);
|
|
|
|
TEST_ASSERT_VAL("wrong callgraph", !(PERF_SAMPLE_CALLCHAIN & evsel->attr.sample_type));
|
|
|
|
TEST_ASSERT_VAL("wrong time", !(PERF_SAMPLE_TIME & evsel->attr.sample_type));
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2012-10-10 20:53:18 +08:00
|
|
|
static int test__checkevent_pmu_events(struct perf_evlist *evlist)
|
|
|
|
{
|
2013-11-14 02:54:30 +08:00
|
|
|
struct perf_evsel *evsel = perf_evlist__first(evlist);
|
2012-10-10 20:53:18 +08:00
|
|
|
|
|
|
|
TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
|
|
|
|
TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_user",
|
|
|
|
!evsel->attr.exclude_user);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_kernel",
|
|
|
|
evsel->attr.exclude_kernel);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
|
|
|
|
TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
|
2013-08-06 21:28:06 +08:00
|
|
|
TEST_ASSERT_VAL("wrong pinned", !evsel->attr.pinned);
|
2012-10-10 20:53:18 +08:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
perf test: Add test case for pmu event new style format
Add test case in automated tests suite. It checks not only the two types
of pmu event stytle formats "pmu_event_name" and "cpu/pmu_event_name/",
but also the different formats mixtures which are more likely to trigger
parse issue.
The patch set including this one has been tested by the perf automated
test:
./perf test parse -v"
On haswell, ivybridge and Romley platform.
The patch set also has been tested on haswell by the following script.
Note: please make sure that your test system support TSX and
L1-dcache-loads events. Otherwise, you may want to change the events to
other pmu events.
[lk@localhost ~]$ cat perf_style_test.sh
# hardware events + kernel pmu event with different style
perf stat -x, -e cycles,mem-stores,tx-start sleep 2
perf stat -x, -e cpu-cycles,cycles-ct,cycles-t sleep 2
perf stat -x, -e cycles,cpu/cycles-ct/,cpu/cycles-t/ sleep 2
perf stat -x, -e instructions,cpu/tx-start/ sleep 2
perf stat -x, -e '{cycles,tx-start}' sleep 2
perf stat -x, -e '{cycles,cpu/tx-start/}' sleep 2
# HW Cache event + kernel pmu event with different style
perf stat -x, -e L1-dcache-loads,cpu/mem-stores/,tx-start sleep 2
perf stat -x, -e L1-dcache-loads,mem-stores,cpu/tx-start/ sleep 2
perf stat -x, -e '{L1-dcache-loads,mem-stores}' sleep 2
perf stat -x, -e '{L1-dcache-loads,cpu/tx-start/}' sleep 2
# Raw event + kernel pmu event with different style:
perf stat -x, -e cpu/event=0xc0,umask=0x00/,mem-loads,cpu/mem-stores/ sleep 2
perf stat -x, -e cpu/event=0xc0,umask=0x00/,tx-start,cpu/el-start/ sleep 2
perf stat -x, -e '{cpu/event=0xc0,umask=0x00/,tx-start}' sleep 2
Signed-off-by: Kan Liang <kan.liang@intel.com>
Acked-by: Jiri Olsa <jolsa@redhat.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Link: http://lkml.kernel.org/r/1412694532-23391-5-git-send-email-kan.liang@intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2014-10-07 23:08:52 +08:00
|
|
|
|
|
|
|
static int test__checkevent_pmu_events_mix(struct perf_evlist *evlist)
|
|
|
|
{
|
|
|
|
struct perf_evsel *evsel = perf_evlist__first(evlist);
|
|
|
|
|
|
|
|
/* pmu-event:u */
|
|
|
|
TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_user",
|
|
|
|
!evsel->attr.exclude_user);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_kernel",
|
|
|
|
evsel->attr.exclude_kernel);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
|
|
|
|
TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
|
|
|
|
TEST_ASSERT_VAL("wrong pinned", !evsel->attr.pinned);
|
|
|
|
|
|
|
|
/* cpu/pmu-event/u*/
|
|
|
|
evsel = perf_evsel__next(evsel);
|
|
|
|
TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries);
|
|
|
|
TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_user",
|
|
|
|
!evsel->attr.exclude_user);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_kernel",
|
|
|
|
evsel->attr.exclude_kernel);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
|
|
|
|
TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
|
|
|
|
TEST_ASSERT_VAL("wrong pinned", !evsel->attr.pinned);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2012-06-15 14:31:42 +08:00
|
|
|
static int test__checkterms_simple(struct list_head *terms)
|
|
|
|
{
|
2013-01-19 03:29:49 +08:00
|
|
|
struct parse_events_term *term;
|
2012-06-15 14:31:42 +08:00
|
|
|
|
|
|
|
/* config=10 */
|
2013-01-19 03:29:49 +08:00
|
|
|
term = list_entry(terms->next, struct parse_events_term, list);
|
2012-06-15 14:31:42 +08:00
|
|
|
TEST_ASSERT_VAL("wrong type term",
|
|
|
|
term->type_term == PARSE_EVENTS__TERM_TYPE_CONFIG);
|
|
|
|
TEST_ASSERT_VAL("wrong type val",
|
|
|
|
term->type_val == PARSE_EVENTS__TERM_TYPE_NUM);
|
|
|
|
TEST_ASSERT_VAL("wrong val", term->val.num == 10);
|
|
|
|
TEST_ASSERT_VAL("wrong config", !term->config);
|
|
|
|
|
|
|
|
/* config1 */
|
2013-01-19 03:29:49 +08:00
|
|
|
term = list_entry(term->list.next, struct parse_events_term, list);
|
2012-06-15 14:31:42 +08:00
|
|
|
TEST_ASSERT_VAL("wrong type term",
|
|
|
|
term->type_term == PARSE_EVENTS__TERM_TYPE_CONFIG1);
|
|
|
|
TEST_ASSERT_VAL("wrong type val",
|
|
|
|
term->type_val == PARSE_EVENTS__TERM_TYPE_NUM);
|
|
|
|
TEST_ASSERT_VAL("wrong val", term->val.num == 1);
|
|
|
|
TEST_ASSERT_VAL("wrong config", !term->config);
|
|
|
|
|
|
|
|
/* config2=3 */
|
2013-01-19 03:29:49 +08:00
|
|
|
term = list_entry(term->list.next, struct parse_events_term, list);
|
2012-06-15 14:31:42 +08:00
|
|
|
TEST_ASSERT_VAL("wrong type term",
|
|
|
|
term->type_term == PARSE_EVENTS__TERM_TYPE_CONFIG2);
|
|
|
|
TEST_ASSERT_VAL("wrong type val",
|
|
|
|
term->type_val == PARSE_EVENTS__TERM_TYPE_NUM);
|
|
|
|
TEST_ASSERT_VAL("wrong val", term->val.num == 3);
|
|
|
|
TEST_ASSERT_VAL("wrong config", !term->config);
|
|
|
|
|
|
|
|
/* umask=1*/
|
2013-01-19 03:29:49 +08:00
|
|
|
term = list_entry(term->list.next, struct parse_events_term, list);
|
2012-06-15 14:31:42 +08:00
|
|
|
TEST_ASSERT_VAL("wrong type term",
|
|
|
|
term->type_term == PARSE_EVENTS__TERM_TYPE_USER);
|
|
|
|
TEST_ASSERT_VAL("wrong type val",
|
|
|
|
term->type_val == PARSE_EVENTS__TERM_TYPE_NUM);
|
|
|
|
TEST_ASSERT_VAL("wrong val", term->val.num == 1);
|
|
|
|
TEST_ASSERT_VAL("wrong config", !strcmp(term->config, "umask"));
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2012-08-08 18:23:52 +08:00
|
|
|
static int test__group1(struct perf_evlist *evlist)
|
|
|
|
{
|
|
|
|
struct perf_evsel *evsel, *leader;
|
|
|
|
|
|
|
|
TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries);
|
2013-01-22 17:09:30 +08:00
|
|
|
TEST_ASSERT_VAL("wrong number of groups", 1 == evlist->nr_groups);
|
2012-08-08 18:23:52 +08:00
|
|
|
|
|
|
|
/* instructions:k */
|
2012-08-15 03:42:15 +08:00
|
|
|
evsel = leader = perf_evlist__first(evlist);
|
2012-08-08 18:23:52 +08:00
|
|
|
TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
|
|
|
|
TEST_ASSERT_VAL("wrong config",
|
|
|
|
PERF_COUNT_HW_INSTRUCTIONS == evsel->attr.config);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
|
|
|
|
TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
|
2012-11-29 14:38:30 +08:00
|
|
|
TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel));
|
2013-01-22 17:09:30 +08:00
|
|
|
TEST_ASSERT_VAL("wrong nr_members", evsel->nr_members == 2);
|
|
|
|
TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 0);
|
2013-02-02 03:37:11 +08:00
|
|
|
TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
|
2012-08-08 18:23:52 +08:00
|
|
|
|
|
|
|
/* cycles:upp */
|
2012-08-15 03:42:15 +08:00
|
|
|
evsel = perf_evsel__next(evsel);
|
2012-08-08 18:23:52 +08:00
|
|
|
TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
|
|
|
|
TEST_ASSERT_VAL("wrong config",
|
|
|
|
PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
|
2012-10-21 00:29:34 +08:00
|
|
|
/* use of precise requires exclude_guest */
|
|
|
|
TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
|
2012-08-08 18:23:52 +08:00
|
|
|
TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
|
|
|
|
TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip == 2);
|
|
|
|
TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
|
2013-01-22 17:09:30 +08:00
|
|
|
TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 1);
|
2013-02-02 03:37:11 +08:00
|
|
|
TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
|
2012-08-08 18:23:52 +08:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int test__group2(struct perf_evlist *evlist)
|
|
|
|
{
|
|
|
|
struct perf_evsel *evsel, *leader;
|
|
|
|
|
|
|
|
TEST_ASSERT_VAL("wrong number of entries", 3 == evlist->nr_entries);
|
2013-01-22 17:09:30 +08:00
|
|
|
TEST_ASSERT_VAL("wrong number of groups", 1 == evlist->nr_groups);
|
2012-08-08 18:23:52 +08:00
|
|
|
|
|
|
|
/* faults + :ku modifier */
|
2012-08-15 03:42:15 +08:00
|
|
|
evsel = leader = perf_evlist__first(evlist);
|
2012-08-08 18:23:52 +08:00
|
|
|
TEST_ASSERT_VAL("wrong type", PERF_TYPE_SOFTWARE == evsel->attr.type);
|
|
|
|
TEST_ASSERT_VAL("wrong config",
|
|
|
|
PERF_COUNT_SW_PAGE_FAULTS == evsel->attr.config);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
|
|
|
|
TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
|
2012-11-29 14:38:30 +08:00
|
|
|
TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel));
|
2013-01-22 17:09:30 +08:00
|
|
|
TEST_ASSERT_VAL("wrong nr_members", evsel->nr_members == 2);
|
|
|
|
TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 0);
|
2013-02-02 03:37:11 +08:00
|
|
|
TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
|
2012-08-08 18:23:52 +08:00
|
|
|
|
|
|
|
/* cache-references + :u modifier */
|
2012-08-15 03:42:15 +08:00
|
|
|
evsel = perf_evsel__next(evsel);
|
2012-08-08 18:23:52 +08:00
|
|
|
TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
|
|
|
|
TEST_ASSERT_VAL("wrong config",
|
|
|
|
PERF_COUNT_HW_CACHE_REFERENCES == evsel->attr.config);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
|
2013-02-04 17:56:43 +08:00
|
|
|
TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
|
2012-08-08 18:23:52 +08:00
|
|
|
TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
|
|
|
|
TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
|
|
|
|
TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
|
2013-01-22 17:09:30 +08:00
|
|
|
TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 1);
|
2013-02-02 03:37:11 +08:00
|
|
|
TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
|
2012-08-08 18:23:52 +08:00
|
|
|
|
|
|
|
/* cycles:k */
|
2012-08-15 03:42:15 +08:00
|
|
|
evsel = perf_evsel__next(evsel);
|
2012-08-08 18:23:52 +08:00
|
|
|
TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
|
|
|
|
TEST_ASSERT_VAL("wrong config",
|
|
|
|
PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
|
|
|
|
TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
|
2012-11-29 14:38:30 +08:00
|
|
|
TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel));
|
2013-02-02 03:37:11 +08:00
|
|
|
TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
|
2012-08-08 18:23:52 +08:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2012-09-11 06:15:03 +08:00
|
|
|
static int test__group3(struct perf_evlist *evlist __maybe_unused)
|
2012-08-08 18:23:52 +08:00
|
|
|
{
|
|
|
|
struct perf_evsel *evsel, *leader;
|
|
|
|
|
|
|
|
TEST_ASSERT_VAL("wrong number of entries", 5 == evlist->nr_entries);
|
2013-01-22 17:09:30 +08:00
|
|
|
TEST_ASSERT_VAL("wrong number of groups", 2 == evlist->nr_groups);
|
2012-08-08 18:23:52 +08:00
|
|
|
|
2015-04-16 21:52:53 +08:00
|
|
|
/* group1 syscalls:sys_enter_openat:H */
|
2012-08-15 03:42:15 +08:00
|
|
|
evsel = leader = perf_evlist__first(evlist);
|
2012-08-08 18:23:52 +08:00
|
|
|
TEST_ASSERT_VAL("wrong type", PERF_TYPE_TRACEPOINT == evsel->attr.type);
|
|
|
|
TEST_ASSERT_VAL("wrong sample_type",
|
|
|
|
PERF_TP_SAMPLE_TYPE == evsel->attr.sample_type);
|
|
|
|
TEST_ASSERT_VAL("wrong sample_period", 1 == evsel->attr.sample_period);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
|
|
|
|
TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
|
2012-11-29 14:38:30 +08:00
|
|
|
TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel));
|
2012-08-08 18:23:52 +08:00
|
|
|
TEST_ASSERT_VAL("wrong group name",
|
|
|
|
!strcmp(leader->group_name, "group1"));
|
2013-01-22 17:09:30 +08:00
|
|
|
TEST_ASSERT_VAL("wrong nr_members", evsel->nr_members == 2);
|
|
|
|
TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 0);
|
2013-02-02 03:37:11 +08:00
|
|
|
TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
|
2012-08-08 18:23:52 +08:00
|
|
|
|
|
|
|
/* group1 cycles:kppp */
|
2012-08-15 03:42:15 +08:00
|
|
|
evsel = perf_evsel__next(evsel);
|
2012-08-08 18:23:52 +08:00
|
|
|
TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
|
|
|
|
TEST_ASSERT_VAL("wrong config",
|
|
|
|
PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
|
2012-10-21 00:29:34 +08:00
|
|
|
/* use of precise requires exclude_guest */
|
|
|
|
TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
|
2012-08-08 18:23:52 +08:00
|
|
|
TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
|
|
|
|
TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip == 3);
|
|
|
|
TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
|
|
|
|
TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
|
2013-01-22 17:09:30 +08:00
|
|
|
TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 1);
|
2013-02-02 03:37:11 +08:00
|
|
|
TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
|
2012-08-08 18:23:52 +08:00
|
|
|
|
|
|
|
/* group2 cycles + G modifier */
|
2012-08-15 03:42:15 +08:00
|
|
|
evsel = leader = perf_evsel__next(evsel);
|
2012-08-08 18:23:52 +08:00
|
|
|
TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
|
|
|
|
TEST_ASSERT_VAL("wrong config",
|
|
|
|
PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);
|
|
|
|
TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
|
2012-11-29 14:38:30 +08:00
|
|
|
TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel));
|
2012-08-08 18:23:52 +08:00
|
|
|
TEST_ASSERT_VAL("wrong group name",
|
|
|
|
!strcmp(leader->group_name, "group2"));
|
2013-01-22 17:09:30 +08:00
|
|
|
TEST_ASSERT_VAL("wrong nr_members", evsel->nr_members == 2);
|
|
|
|
TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 0);
|
2013-02-02 03:37:11 +08:00
|
|
|
TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
|
2012-08-08 18:23:52 +08:00
|
|
|
|
|
|
|
/* group2 1:3 + G modifier */
|
2012-08-15 03:42:15 +08:00
|
|
|
evsel = perf_evsel__next(evsel);
|
2012-08-08 18:23:52 +08:00
|
|
|
TEST_ASSERT_VAL("wrong type", 1 == evsel->attr.type);
|
|
|
|
TEST_ASSERT_VAL("wrong config", 3 == evsel->attr.config);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);
|
|
|
|
TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
|
|
|
|
TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
|
2013-01-22 17:09:30 +08:00
|
|
|
TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 1);
|
2013-02-02 03:37:11 +08:00
|
|
|
TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
|
2012-08-08 18:23:52 +08:00
|
|
|
|
|
|
|
/* instructions:u */
|
2012-08-15 03:42:15 +08:00
|
|
|
evsel = perf_evsel__next(evsel);
|
2012-08-08 18:23:52 +08:00
|
|
|
TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
|
|
|
|
TEST_ASSERT_VAL("wrong config",
|
|
|
|
PERF_COUNT_HW_INSTRUCTIONS == evsel->attr.config);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
|
|
|
|
TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
|
2012-11-29 14:38:30 +08:00
|
|
|
TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel));
|
2013-02-02 03:37:11 +08:00
|
|
|
TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
|
2012-08-08 18:23:52 +08:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2012-09-11 06:15:03 +08:00
|
|
|
static int test__group4(struct perf_evlist *evlist __maybe_unused)
|
2012-08-08 18:23:52 +08:00
|
|
|
{
|
|
|
|
struct perf_evsel *evsel, *leader;
|
|
|
|
|
|
|
|
TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries);
|
2013-01-22 17:09:30 +08:00
|
|
|
TEST_ASSERT_VAL("wrong number of groups", 1 == evlist->nr_groups);
|
2012-08-08 18:23:52 +08:00
|
|
|
|
|
|
|
/* cycles:u + p */
|
2012-08-15 03:42:15 +08:00
|
|
|
evsel = leader = perf_evlist__first(evlist);
|
2012-08-08 18:23:52 +08:00
|
|
|
TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
|
|
|
|
TEST_ASSERT_VAL("wrong config",
|
|
|
|
PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
|
2012-10-21 00:29:34 +08:00
|
|
|
/* use of precise requires exclude_guest */
|
|
|
|
TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
|
2012-08-08 18:23:52 +08:00
|
|
|
TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
|
|
|
|
TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip == 1);
|
|
|
|
TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
|
2012-11-29 14:38:30 +08:00
|
|
|
TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel));
|
2013-01-22 17:09:30 +08:00
|
|
|
TEST_ASSERT_VAL("wrong nr_members", evsel->nr_members == 2);
|
|
|
|
TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 0);
|
2013-02-02 03:37:11 +08:00
|
|
|
TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
|
2012-08-08 18:23:52 +08:00
|
|
|
|
|
|
|
/* instructions:kp + p */
|
2012-08-15 03:42:15 +08:00
|
|
|
evsel = perf_evsel__next(evsel);
|
2012-08-08 18:23:52 +08:00
|
|
|
TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
|
|
|
|
TEST_ASSERT_VAL("wrong config",
|
|
|
|
PERF_COUNT_HW_INSTRUCTIONS == evsel->attr.config);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
|
2012-10-21 00:29:34 +08:00
|
|
|
/* use of precise requires exclude_guest */
|
|
|
|
TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
|
2012-08-08 18:23:52 +08:00
|
|
|
TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
|
|
|
|
TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip == 2);
|
|
|
|
TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
|
2013-01-22 17:09:30 +08:00
|
|
|
TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 1);
|
2013-02-02 03:37:11 +08:00
|
|
|
TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
|
2012-08-08 18:23:52 +08:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2012-09-11 06:15:03 +08:00
|
|
|
static int test__group5(struct perf_evlist *evlist __maybe_unused)
|
2012-08-08 18:23:52 +08:00
|
|
|
{
|
|
|
|
struct perf_evsel *evsel, *leader;
|
|
|
|
|
|
|
|
TEST_ASSERT_VAL("wrong number of entries", 5 == evlist->nr_entries);
|
2013-01-22 17:09:30 +08:00
|
|
|
TEST_ASSERT_VAL("wrong number of groups", 2 == evlist->nr_groups);
|
2012-08-08 18:23:52 +08:00
|
|
|
|
|
|
|
/* cycles + G */
|
2012-08-15 03:42:15 +08:00
|
|
|
evsel = leader = perf_evlist__first(evlist);
|
2012-08-08 18:23:52 +08:00
|
|
|
TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
|
|
|
|
TEST_ASSERT_VAL("wrong config",
|
|
|
|
PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);
|
|
|
|
TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
|
|
|
|
TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
|
2012-11-29 14:38:30 +08:00
|
|
|
TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel));
|
2013-01-22 17:09:30 +08:00
|
|
|
TEST_ASSERT_VAL("wrong nr_members", evsel->nr_members == 2);
|
|
|
|
TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 0);
|
2013-02-02 03:37:11 +08:00
|
|
|
TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
|
2012-08-08 18:23:52 +08:00
|
|
|
|
|
|
|
/* instructions + G */
|
2012-08-15 03:42:15 +08:00
|
|
|
evsel = perf_evsel__next(evsel);
|
2012-08-08 18:23:52 +08:00
|
|
|
TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
|
|
|
|
TEST_ASSERT_VAL("wrong config",
|
|
|
|
PERF_COUNT_HW_INSTRUCTIONS == evsel->attr.config);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);
|
|
|
|
TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
|
|
|
|
TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
|
2013-01-22 17:09:30 +08:00
|
|
|
TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 1);
|
2013-02-02 03:37:11 +08:00
|
|
|
TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
|
2012-08-08 18:23:52 +08:00
|
|
|
|
|
|
|
/* cycles:G */
|
2012-08-15 03:42:15 +08:00
|
|
|
evsel = leader = perf_evsel__next(evsel);
|
2012-08-08 18:23:52 +08:00
|
|
|
TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
|
|
|
|
TEST_ASSERT_VAL("wrong config",
|
|
|
|
PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);
|
|
|
|
TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
|
|
|
|
TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
|
2012-11-29 14:38:30 +08:00
|
|
|
TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel));
|
2013-01-22 17:09:30 +08:00
|
|
|
TEST_ASSERT_VAL("wrong nr_members", evsel->nr_members == 2);
|
|
|
|
TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 0);
|
2013-02-02 03:37:11 +08:00
|
|
|
TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
|
2012-08-08 18:23:52 +08:00
|
|
|
|
|
|
|
/* instructions:G */
|
2012-08-15 03:42:15 +08:00
|
|
|
evsel = perf_evsel__next(evsel);
|
2012-08-08 18:23:52 +08:00
|
|
|
TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
|
|
|
|
TEST_ASSERT_VAL("wrong config",
|
|
|
|
PERF_COUNT_HW_INSTRUCTIONS == evsel->attr.config);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);
|
|
|
|
TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
|
|
|
|
TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
|
2013-01-22 17:09:30 +08:00
|
|
|
TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 1);
|
2012-08-08 18:23:52 +08:00
|
|
|
|
|
|
|
/* cycles */
|
2012-08-15 03:42:15 +08:00
|
|
|
evsel = perf_evsel__next(evsel);
|
2012-08-08 18:23:52 +08:00
|
|
|
TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
|
|
|
|
TEST_ASSERT_VAL("wrong config",
|
|
|
|
PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
|
|
|
|
TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
|
2012-11-29 14:38:30 +08:00
|
|
|
TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel));
|
2012-08-08 18:23:52 +08:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2013-02-04 17:56:43 +08:00
|
|
|
static int test__group_gh1(struct perf_evlist *evlist)
|
|
|
|
{
|
|
|
|
struct perf_evsel *evsel, *leader;
|
|
|
|
|
|
|
|
TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries);
|
|
|
|
TEST_ASSERT_VAL("wrong number of groups", 1 == evlist->nr_groups);
|
|
|
|
|
|
|
|
/* cycles + :H group modifier */
|
|
|
|
evsel = leader = perf_evlist__first(evlist);
|
|
|
|
TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
|
|
|
|
TEST_ASSERT_VAL("wrong config",
|
|
|
|
PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
|
|
|
|
TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
|
|
|
|
TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
|
|
|
|
TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel));
|
|
|
|
TEST_ASSERT_VAL("wrong nr_members", evsel->nr_members == 2);
|
|
|
|
TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 0);
|
|
|
|
|
|
|
|
/* cache-misses:G + :H group modifier */
|
|
|
|
evsel = perf_evsel__next(evsel);
|
|
|
|
TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
|
|
|
|
TEST_ASSERT_VAL("wrong config",
|
|
|
|
PERF_COUNT_HW_CACHE_MISSES == evsel->attr.config);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
|
|
|
|
TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
|
|
|
|
TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
|
|
|
|
TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 1);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int test__group_gh2(struct perf_evlist *evlist)
|
|
|
|
{
|
|
|
|
struct perf_evsel *evsel, *leader;
|
|
|
|
|
|
|
|
TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries);
|
|
|
|
TEST_ASSERT_VAL("wrong number of groups", 1 == evlist->nr_groups);
|
|
|
|
|
|
|
|
/* cycles + :G group modifier */
|
|
|
|
evsel = leader = perf_evlist__first(evlist);
|
|
|
|
TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
|
|
|
|
TEST_ASSERT_VAL("wrong config",
|
|
|
|
PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);
|
|
|
|
TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
|
|
|
|
TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
|
|
|
|
TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel));
|
|
|
|
TEST_ASSERT_VAL("wrong nr_members", evsel->nr_members == 2);
|
|
|
|
TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 0);
|
|
|
|
|
|
|
|
/* cache-misses:H + :G group modifier */
|
|
|
|
evsel = perf_evsel__next(evsel);
|
|
|
|
TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
|
|
|
|
TEST_ASSERT_VAL("wrong config",
|
|
|
|
PERF_COUNT_HW_CACHE_MISSES == evsel->attr.config);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
|
|
|
|
TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
|
|
|
|
TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
|
|
|
|
TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 1);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int test__group_gh3(struct perf_evlist *evlist)
|
|
|
|
{
|
|
|
|
struct perf_evsel *evsel, *leader;
|
|
|
|
|
|
|
|
TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries);
|
|
|
|
TEST_ASSERT_VAL("wrong number of groups", 1 == evlist->nr_groups);
|
|
|
|
|
|
|
|
/* cycles:G + :u group modifier */
|
|
|
|
evsel = leader = perf_evlist__first(evlist);
|
|
|
|
TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
|
|
|
|
TEST_ASSERT_VAL("wrong config",
|
|
|
|
PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);
|
|
|
|
TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
|
|
|
|
TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
|
|
|
|
TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel));
|
|
|
|
TEST_ASSERT_VAL("wrong nr_members", evsel->nr_members == 2);
|
|
|
|
TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 0);
|
|
|
|
|
|
|
|
/* cache-misses:H + :u group modifier */
|
|
|
|
evsel = perf_evsel__next(evsel);
|
|
|
|
TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
|
|
|
|
TEST_ASSERT_VAL("wrong config",
|
|
|
|
PERF_COUNT_HW_CACHE_MISSES == evsel->attr.config);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
|
|
|
|
TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
|
|
|
|
TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
|
|
|
|
TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 1);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int test__group_gh4(struct perf_evlist *evlist)
|
|
|
|
{
|
|
|
|
struct perf_evsel *evsel, *leader;
|
|
|
|
|
|
|
|
TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries);
|
|
|
|
TEST_ASSERT_VAL("wrong number of groups", 1 == evlist->nr_groups);
|
|
|
|
|
|
|
|
/* cycles:G + :uG group modifier */
|
|
|
|
evsel = leader = perf_evlist__first(evlist);
|
|
|
|
TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
|
|
|
|
TEST_ASSERT_VAL("wrong config",
|
|
|
|
PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);
|
|
|
|
TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
|
|
|
|
TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
|
|
|
|
TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel));
|
|
|
|
TEST_ASSERT_VAL("wrong nr_members", evsel->nr_members == 2);
|
|
|
|
TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 0);
|
|
|
|
|
|
|
|
/* cache-misses:H + :uG group modifier */
|
|
|
|
evsel = perf_evsel__next(evsel);
|
|
|
|
TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
|
|
|
|
TEST_ASSERT_VAL("wrong config",
|
|
|
|
PERF_COUNT_HW_CACHE_MISSES == evsel->attr.config);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
|
|
|
|
TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
|
|
|
|
TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
|
|
|
|
TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 1);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2013-02-02 03:37:11 +08:00
|
|
|
static int test__leader_sample1(struct perf_evlist *evlist)
|
|
|
|
{
|
|
|
|
struct perf_evsel *evsel, *leader;
|
|
|
|
|
|
|
|
TEST_ASSERT_VAL("wrong number of entries", 3 == evlist->nr_entries);
|
|
|
|
|
|
|
|
/* cycles - sampling group leader */
|
|
|
|
evsel = leader = perf_evlist__first(evlist);
|
|
|
|
TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
|
|
|
|
TEST_ASSERT_VAL("wrong config",
|
|
|
|
PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
|
|
|
|
TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
|
|
|
|
TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
|
|
|
|
TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
|
|
|
|
TEST_ASSERT_VAL("wrong sample_read", evsel->sample_read);
|
|
|
|
|
|
|
|
/* cache-misses - not sampling */
|
|
|
|
evsel = perf_evsel__next(evsel);
|
|
|
|
TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
|
|
|
|
TEST_ASSERT_VAL("wrong config",
|
|
|
|
PERF_COUNT_HW_CACHE_MISSES == evsel->attr.config);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
|
|
|
|
TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
|
|
|
|
TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
|
|
|
|
TEST_ASSERT_VAL("wrong sample_read", evsel->sample_read);
|
|
|
|
|
|
|
|
/* branch-misses - not sampling */
|
|
|
|
evsel = perf_evsel__next(evsel);
|
|
|
|
TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
|
|
|
|
TEST_ASSERT_VAL("wrong config",
|
|
|
|
PERF_COUNT_HW_BRANCH_MISSES == evsel->attr.config);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
|
|
|
|
TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
|
|
|
|
TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
|
|
|
|
TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
|
|
|
|
TEST_ASSERT_VAL("wrong sample_read", evsel->sample_read);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int test__leader_sample2(struct perf_evlist *evlist __maybe_unused)
|
|
|
|
{
|
|
|
|
struct perf_evsel *evsel, *leader;
|
|
|
|
|
|
|
|
TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries);
|
|
|
|
|
|
|
|
/* instructions - sampling group leader */
|
|
|
|
evsel = leader = perf_evlist__first(evlist);
|
|
|
|
TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
|
|
|
|
TEST_ASSERT_VAL("wrong config",
|
|
|
|
PERF_COUNT_HW_INSTRUCTIONS == evsel->attr.config);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
|
|
|
|
TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
|
|
|
|
TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
|
|
|
|
TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
|
|
|
|
TEST_ASSERT_VAL("wrong sample_read", evsel->sample_read);
|
|
|
|
|
|
|
|
/* branch-misses - not sampling */
|
|
|
|
evsel = perf_evsel__next(evsel);
|
|
|
|
TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
|
|
|
|
TEST_ASSERT_VAL("wrong config",
|
|
|
|
PERF_COUNT_HW_BRANCH_MISSES == evsel->attr.config);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
|
|
|
|
TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
|
|
|
|
TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
|
|
|
|
TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
|
|
|
|
TEST_ASSERT_VAL("wrong sample_read", evsel->sample_read);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2013-08-06 21:28:06 +08:00
|
|
|
static int test__checkevent_pinned_modifier(struct perf_evlist *evlist)
|
|
|
|
{
|
|
|
|
struct perf_evsel *evsel = perf_evlist__first(evlist);
|
|
|
|
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
|
|
|
|
TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip);
|
|
|
|
TEST_ASSERT_VAL("wrong pinned", evsel->attr.pinned);
|
|
|
|
|
|
|
|
return test__checkevent_symbolic_name(evlist);
|
|
|
|
}
|
|
|
|
|
|
|
|
static int test__pinned_group(struct perf_evlist *evlist)
|
|
|
|
{
|
|
|
|
struct perf_evsel *evsel, *leader;
|
|
|
|
|
|
|
|
TEST_ASSERT_VAL("wrong number of entries", 3 == evlist->nr_entries);
|
|
|
|
|
|
|
|
/* cycles - group leader */
|
|
|
|
evsel = leader = perf_evlist__first(evlist);
|
|
|
|
TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
|
|
|
|
TEST_ASSERT_VAL("wrong config",
|
|
|
|
PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
|
|
|
|
TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
|
|
|
|
TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
|
|
|
|
TEST_ASSERT_VAL("wrong pinned", evsel->attr.pinned);
|
|
|
|
|
|
|
|
/* cache-misses - can not be pinned, but will go on with the leader */
|
|
|
|
evsel = perf_evsel__next(evsel);
|
|
|
|
TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
|
|
|
|
TEST_ASSERT_VAL("wrong config",
|
|
|
|
PERF_COUNT_HW_CACHE_MISSES == evsel->attr.config);
|
|
|
|
TEST_ASSERT_VAL("wrong pinned", !evsel->attr.pinned);
|
|
|
|
|
|
|
|
/* branch-misses - ditto */
|
|
|
|
evsel = perf_evsel__next(evsel);
|
|
|
|
TEST_ASSERT_VAL("wrong config",
|
|
|
|
PERF_COUNT_HW_BRANCH_MISSES == evsel->attr.config);
|
|
|
|
TEST_ASSERT_VAL("wrong pinned", !evsel->attr.pinned);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2014-05-29 23:26:52 +08:00
|
|
|
static int test__checkevent_breakpoint_len(struct perf_evlist *evlist)
|
|
|
|
{
|
|
|
|
struct perf_evsel *evsel = perf_evlist__first(evlist);
|
|
|
|
|
|
|
|
TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
|
|
|
|
TEST_ASSERT_VAL("wrong type", PERF_TYPE_BREAKPOINT == evsel->attr.type);
|
|
|
|
TEST_ASSERT_VAL("wrong config", 0 == evsel->attr.config);
|
|
|
|
TEST_ASSERT_VAL("wrong bp_type", (HW_BREAKPOINT_R | HW_BREAKPOINT_W) ==
|
|
|
|
evsel->attr.bp_type);
|
|
|
|
TEST_ASSERT_VAL("wrong bp_len", HW_BREAKPOINT_LEN_1 ==
|
|
|
|
evsel->attr.bp_len);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int test__checkevent_breakpoint_len_w(struct perf_evlist *evlist)
|
|
|
|
{
|
|
|
|
struct perf_evsel *evsel = perf_evlist__first(evlist);
|
|
|
|
|
|
|
|
TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
|
|
|
|
TEST_ASSERT_VAL("wrong type", PERF_TYPE_BREAKPOINT == evsel->attr.type);
|
|
|
|
TEST_ASSERT_VAL("wrong config", 0 == evsel->attr.config);
|
|
|
|
TEST_ASSERT_VAL("wrong bp_type", HW_BREAKPOINT_W ==
|
|
|
|
evsel->attr.bp_type);
|
|
|
|
TEST_ASSERT_VAL("wrong bp_len", HW_BREAKPOINT_LEN_2 ==
|
|
|
|
evsel->attr.bp_len);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
test__checkevent_breakpoint_len_rw_modifier(struct perf_evlist *evlist)
|
|
|
|
{
|
|
|
|
struct perf_evsel *evsel = perf_evlist__first(evlist);
|
|
|
|
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
|
|
|
|
TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
|
|
|
|
TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
|
|
|
|
|
|
|
|
return test__checkevent_breakpoint_rw(evlist);
|
|
|
|
}
|
|
|
|
|
2015-10-06 02:06:06 +08:00
|
|
|
static int test__checkevent_precise_max_modifier(struct perf_evlist *evlist)
|
|
|
|
{
|
|
|
|
struct perf_evsel *evsel = perf_evlist__first(evlist);
|
|
|
|
|
|
|
|
TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries);
|
|
|
|
TEST_ASSERT_VAL("wrong type", PERF_TYPE_SOFTWARE == evsel->attr.type);
|
|
|
|
TEST_ASSERT_VAL("wrong config",
|
|
|
|
PERF_COUNT_SW_TASK_CLOCK == evsel->attr.config);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2012-12-17 21:08:38 +08:00
|
|
|
static int count_tracepoints(void)
|
|
|
|
{
|
|
|
|
struct dirent *events_ent;
|
|
|
|
DIR *events_dir;
|
|
|
|
int cnt = 0;
|
|
|
|
|
2015-09-02 15:56:45 +08:00
|
|
|
events_dir = opendir(tracing_events_path);
|
2012-12-17 21:08:38 +08:00
|
|
|
|
|
|
|
TEST_ASSERT_VAL("Can't open events dir", events_dir);
|
|
|
|
|
|
|
|
while ((events_ent = readdir(events_dir))) {
|
|
|
|
char sys_path[PATH_MAX];
|
|
|
|
struct dirent *sys_ent;
|
|
|
|
DIR *sys_dir;
|
|
|
|
|
|
|
|
if (!strcmp(events_ent->d_name, ".")
|
|
|
|
|| !strcmp(events_ent->d_name, "..")
|
|
|
|
|| !strcmp(events_ent->d_name, "enable")
|
|
|
|
|| !strcmp(events_ent->d_name, "header_event")
|
|
|
|
|| !strcmp(events_ent->d_name, "header_page"))
|
|
|
|
continue;
|
|
|
|
|
|
|
|
scnprintf(sys_path, PATH_MAX, "%s/%s",
|
2015-09-02 15:56:45 +08:00
|
|
|
tracing_events_path, events_ent->d_name);
|
2012-12-17 21:08:38 +08:00
|
|
|
|
|
|
|
sys_dir = opendir(sys_path);
|
|
|
|
TEST_ASSERT_VAL("Can't open sys dir", sys_dir);
|
|
|
|
|
|
|
|
while ((sys_ent = readdir(sys_dir))) {
|
|
|
|
if (!strcmp(sys_ent->d_name, ".")
|
|
|
|
|| !strcmp(sys_ent->d_name, "..")
|
|
|
|
|| !strcmp(sys_ent->d_name, "enable")
|
|
|
|
|| !strcmp(sys_ent->d_name, "filter"))
|
|
|
|
continue;
|
|
|
|
|
|
|
|
cnt++;
|
|
|
|
}
|
|
|
|
|
|
|
|
closedir(sys_dir);
|
|
|
|
}
|
|
|
|
|
|
|
|
closedir(events_dir);
|
|
|
|
return cnt;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int test__all_tracepoints(struct perf_evlist *evlist)
|
|
|
|
{
|
|
|
|
TEST_ASSERT_VAL("wrong events count",
|
|
|
|
count_tracepoints() == evlist->nr_entries);
|
|
|
|
|
|
|
|
return test__checkevent_tracepoint_multi(evlist);
|
|
|
|
}
|
|
|
|
|
2013-01-19 03:56:57 +08:00
|
|
|
struct evlist_test {
|
2012-05-21 15:12:49 +08:00
|
|
|
const char *name;
|
|
|
|
__u32 type;
|
2014-04-25 23:34:06 +08:00
|
|
|
const int id;
|
2012-05-21 15:12:49 +08:00
|
|
|
int (*check)(struct perf_evlist *evlist);
|
|
|
|
};
|
|
|
|
|
2013-01-19 03:56:57 +08:00
|
|
|
static struct evlist_test test__events[] = {
|
2014-04-25 23:34:06 +08:00
|
|
|
{
|
2015-04-16 21:52:53 +08:00
|
|
|
.name = "syscalls:sys_enter_openat",
|
2012-05-21 15:12:49 +08:00
|
|
|
.check = test__checkevent_tracepoint,
|
2014-04-25 23:34:06 +08:00
|
|
|
.id = 0,
|
2012-05-21 15:12:49 +08:00
|
|
|
},
|
2014-04-25 23:34:06 +08:00
|
|
|
{
|
2012-05-21 15:12:49 +08:00
|
|
|
.name = "syscalls:*",
|
|
|
|
.check = test__checkevent_tracepoint_multi,
|
2014-04-25 23:34:06 +08:00
|
|
|
.id = 1,
|
2012-05-21 15:12:49 +08:00
|
|
|
},
|
2014-04-25 23:34:06 +08:00
|
|
|
{
|
2012-05-21 15:12:49 +08:00
|
|
|
.name = "r1a",
|
|
|
|
.check = test__checkevent_raw,
|
2014-04-25 23:34:06 +08:00
|
|
|
.id = 2,
|
2012-05-21 15:12:49 +08:00
|
|
|
},
|
2014-04-25 23:34:06 +08:00
|
|
|
{
|
2012-05-21 15:12:49 +08:00
|
|
|
.name = "1:1",
|
|
|
|
.check = test__checkevent_numeric,
|
2014-04-25 23:34:06 +08:00
|
|
|
.id = 3,
|
2012-05-21 15:12:49 +08:00
|
|
|
},
|
2014-04-25 23:34:06 +08:00
|
|
|
{
|
2012-05-21 15:12:49 +08:00
|
|
|
.name = "instructions",
|
|
|
|
.check = test__checkevent_symbolic_name,
|
2014-04-25 23:34:06 +08:00
|
|
|
.id = 4,
|
2012-05-21 15:12:49 +08:00
|
|
|
},
|
2014-04-25 23:34:06 +08:00
|
|
|
{
|
2012-05-21 15:12:49 +08:00
|
|
|
.name = "cycles/period=100000,config2/",
|
|
|
|
.check = test__checkevent_symbolic_name_config,
|
2014-04-25 23:34:06 +08:00
|
|
|
.id = 5,
|
2012-05-21 15:12:49 +08:00
|
|
|
},
|
2014-04-25 23:34:06 +08:00
|
|
|
{
|
2012-05-21 15:12:49 +08:00
|
|
|
.name = "faults",
|
|
|
|
.check = test__checkevent_symbolic_alias,
|
2014-04-25 23:34:06 +08:00
|
|
|
.id = 6,
|
2012-05-21 15:12:49 +08:00
|
|
|
},
|
2014-04-25 23:34:06 +08:00
|
|
|
{
|
2012-05-21 15:12:49 +08:00
|
|
|
.name = "L1-dcache-load-miss",
|
|
|
|
.check = test__checkevent_genhw,
|
2014-04-25 23:34:06 +08:00
|
|
|
.id = 7,
|
2012-05-21 15:12:49 +08:00
|
|
|
},
|
2014-04-25 23:34:06 +08:00
|
|
|
{
|
2012-05-21 15:12:49 +08:00
|
|
|
.name = "mem:0",
|
|
|
|
.check = test__checkevent_breakpoint,
|
2014-04-25 23:34:06 +08:00
|
|
|
.id = 8,
|
2012-05-21 15:12:49 +08:00
|
|
|
},
|
2014-04-25 23:34:06 +08:00
|
|
|
{
|
2012-05-21 15:12:49 +08:00
|
|
|
.name = "mem:0:x",
|
|
|
|
.check = test__checkevent_breakpoint_x,
|
2014-04-25 23:34:06 +08:00
|
|
|
.id = 9,
|
2012-05-21 15:12:49 +08:00
|
|
|
},
|
2014-04-25 23:34:06 +08:00
|
|
|
{
|
2012-05-21 15:12:49 +08:00
|
|
|
.name = "mem:0:r",
|
|
|
|
.check = test__checkevent_breakpoint_r,
|
2014-04-25 23:34:06 +08:00
|
|
|
.id = 10,
|
2012-05-21 15:12:49 +08:00
|
|
|
},
|
2014-04-25 23:34:06 +08:00
|
|
|
{
|
2012-05-21 15:12:49 +08:00
|
|
|
.name = "mem:0:w",
|
|
|
|
.check = test__checkevent_breakpoint_w,
|
2014-04-25 23:34:06 +08:00
|
|
|
.id = 11,
|
2012-05-21 15:12:49 +08:00
|
|
|
},
|
2014-04-25 23:34:06 +08:00
|
|
|
{
|
2015-04-16 21:52:53 +08:00
|
|
|
.name = "syscalls:sys_enter_openat:k",
|
2012-05-21 15:12:49 +08:00
|
|
|
.check = test__checkevent_tracepoint_modifier,
|
2014-04-25 23:34:06 +08:00
|
|
|
.id = 12,
|
2012-05-21 15:12:49 +08:00
|
|
|
},
|
2014-04-25 23:34:06 +08:00
|
|
|
{
|
2012-05-21 15:12:49 +08:00
|
|
|
.name = "syscalls:*:u",
|
|
|
|
.check = test__checkevent_tracepoint_multi_modifier,
|
2014-04-25 23:34:06 +08:00
|
|
|
.id = 13,
|
2012-05-21 15:12:49 +08:00
|
|
|
},
|
2014-04-25 23:34:06 +08:00
|
|
|
{
|
2012-05-21 15:12:49 +08:00
|
|
|
.name = "r1a:kp",
|
|
|
|
.check = test__checkevent_raw_modifier,
|
2014-04-25 23:34:06 +08:00
|
|
|
.id = 14,
|
2012-05-21 15:12:49 +08:00
|
|
|
},
|
2014-04-25 23:34:06 +08:00
|
|
|
{
|
2012-05-21 15:12:49 +08:00
|
|
|
.name = "1:1:hp",
|
|
|
|
.check = test__checkevent_numeric_modifier,
|
2014-04-25 23:34:06 +08:00
|
|
|
.id = 15,
|
2012-05-21 15:12:49 +08:00
|
|
|
},
|
2014-04-25 23:34:06 +08:00
|
|
|
{
|
2012-05-21 15:12:49 +08:00
|
|
|
.name = "instructions:h",
|
|
|
|
.check = test__checkevent_symbolic_name_modifier,
|
2014-04-25 23:34:06 +08:00
|
|
|
.id = 16,
|
2012-05-21 15:12:49 +08:00
|
|
|
},
|
2014-04-25 23:34:06 +08:00
|
|
|
{
|
2012-05-21 15:12:49 +08:00
|
|
|
.name = "faults:u",
|
|
|
|
.check = test__checkevent_symbolic_alias_modifier,
|
2014-04-25 23:34:06 +08:00
|
|
|
.id = 17,
|
2012-05-21 15:12:49 +08:00
|
|
|
},
|
2014-04-25 23:34:06 +08:00
|
|
|
{
|
2012-05-21 15:12:49 +08:00
|
|
|
.name = "L1-dcache-load-miss:kp",
|
|
|
|
.check = test__checkevent_genhw_modifier,
|
2014-04-25 23:34:06 +08:00
|
|
|
.id = 18,
|
2012-05-21 15:12:49 +08:00
|
|
|
},
|
2014-04-25 23:34:06 +08:00
|
|
|
{
|
2012-05-21 15:12:49 +08:00
|
|
|
.name = "mem:0:u",
|
|
|
|
.check = test__checkevent_breakpoint_modifier,
|
2014-04-25 23:34:06 +08:00
|
|
|
.id = 19,
|
2012-05-21 15:12:49 +08:00
|
|
|
},
|
2014-04-25 23:34:06 +08:00
|
|
|
{
|
2012-05-21 15:12:49 +08:00
|
|
|
.name = "mem:0:x:k",
|
|
|
|
.check = test__checkevent_breakpoint_x_modifier,
|
2014-04-25 23:34:06 +08:00
|
|
|
.id = 20,
|
2012-05-21 15:12:49 +08:00
|
|
|
},
|
2014-04-25 23:34:06 +08:00
|
|
|
{
|
2012-05-21 15:12:49 +08:00
|
|
|
.name = "mem:0:r:hp",
|
|
|
|
.check = test__checkevent_breakpoint_r_modifier,
|
2014-04-25 23:34:06 +08:00
|
|
|
.id = 21,
|
2012-05-21 15:12:49 +08:00
|
|
|
},
|
2014-04-25 23:34:06 +08:00
|
|
|
{
|
2012-05-21 15:12:49 +08:00
|
|
|
.name = "mem:0:w:up",
|
|
|
|
.check = test__checkevent_breakpoint_w_modifier,
|
2014-04-25 23:34:06 +08:00
|
|
|
.id = 22,
|
2012-05-21 15:12:49 +08:00
|
|
|
},
|
2014-04-25 23:34:06 +08:00
|
|
|
{
|
2015-04-16 21:52:53 +08:00
|
|
|
.name = "r1,syscalls:sys_enter_openat:k,1:1:hp",
|
2012-05-21 15:12:49 +08:00
|
|
|
.check = test__checkevent_list,
|
2014-04-25 23:34:06 +08:00
|
|
|
.id = 23,
|
2012-05-21 15:12:49 +08:00
|
|
|
},
|
2014-04-25 23:34:06 +08:00
|
|
|
{
|
2012-05-21 15:12:49 +08:00
|
|
|
.name = "instructions:G",
|
|
|
|
.check = test__checkevent_exclude_host_modifier,
|
2014-04-25 23:34:06 +08:00
|
|
|
.id = 24,
|
2012-05-21 15:12:49 +08:00
|
|
|
},
|
2014-04-25 23:34:06 +08:00
|
|
|
{
|
2012-05-21 15:12:49 +08:00
|
|
|
.name = "instructions:H",
|
|
|
|
.check = test__checkevent_exclude_guest_modifier,
|
2014-04-25 23:34:06 +08:00
|
|
|
.id = 25,
|
2012-05-21 15:12:49 +08:00
|
|
|
},
|
2014-04-25 23:34:06 +08:00
|
|
|
{
|
2012-06-29 15:22:54 +08:00
|
|
|
.name = "mem:0:rw",
|
|
|
|
.check = test__checkevent_breakpoint_rw,
|
2014-04-25 23:34:06 +08:00
|
|
|
.id = 26,
|
2012-06-29 15:22:54 +08:00
|
|
|
},
|
2014-04-25 23:34:06 +08:00
|
|
|
{
|
2012-06-29 15:22:54 +08:00
|
|
|
.name = "mem:0:rw:kp",
|
|
|
|
.check = test__checkevent_breakpoint_rw_modifier,
|
2014-04-25 23:34:06 +08:00
|
|
|
.id = 27,
|
2012-06-29 15:22:54 +08:00
|
|
|
},
|
2014-04-25 23:34:06 +08:00
|
|
|
{
|
2012-08-08 18:23:52 +08:00
|
|
|
.name = "{instructions:k,cycles:upp}",
|
|
|
|
.check = test__group1,
|
2014-04-25 23:34:06 +08:00
|
|
|
.id = 28,
|
2012-08-08 18:23:52 +08:00
|
|
|
},
|
2014-04-25 23:34:06 +08:00
|
|
|
{
|
2012-08-08 18:23:52 +08:00
|
|
|
.name = "{faults:k,cache-references}:u,cycles:k",
|
|
|
|
.check = test__group2,
|
2014-04-25 23:34:06 +08:00
|
|
|
.id = 29,
|
2012-08-08 18:23:52 +08:00
|
|
|
},
|
2014-04-25 23:34:06 +08:00
|
|
|
{
|
2015-04-16 21:52:53 +08:00
|
|
|
.name = "group1{syscalls:sys_enter_openat:H,cycles:kppp},group2{cycles,1:3}:G,instructions:u",
|
2012-08-08 18:23:52 +08:00
|
|
|
.check = test__group3,
|
2014-04-25 23:34:06 +08:00
|
|
|
.id = 30,
|
2012-08-08 18:23:52 +08:00
|
|
|
},
|
2014-04-25 23:34:06 +08:00
|
|
|
{
|
2012-08-08 18:23:52 +08:00
|
|
|
.name = "{cycles:u,instructions:kp}:p",
|
|
|
|
.check = test__group4,
|
2014-04-25 23:34:06 +08:00
|
|
|
.id = 31,
|
2012-08-08 18:23:52 +08:00
|
|
|
},
|
2014-04-25 23:34:06 +08:00
|
|
|
{
|
2012-08-08 18:23:52 +08:00
|
|
|
.name = "{cycles,instructions}:G,{cycles:G,instructions:G},cycles",
|
|
|
|
.check = test__group5,
|
2014-04-25 23:34:06 +08:00
|
|
|
.id = 32,
|
2012-08-08 18:23:52 +08:00
|
|
|
},
|
2014-04-25 23:34:06 +08:00
|
|
|
{
|
2012-12-17 21:08:38 +08:00
|
|
|
.name = "*:*",
|
|
|
|
.check = test__all_tracepoints,
|
2014-04-25 23:34:06 +08:00
|
|
|
.id = 33,
|
2012-12-17 21:08:38 +08:00
|
|
|
},
|
2014-04-25 23:34:06 +08:00
|
|
|
{
|
2013-02-04 17:56:43 +08:00
|
|
|
.name = "{cycles,cache-misses:G}:H",
|
|
|
|
.check = test__group_gh1,
|
2014-04-25 23:34:06 +08:00
|
|
|
.id = 34,
|
2013-02-04 17:56:43 +08:00
|
|
|
},
|
2014-04-25 23:34:06 +08:00
|
|
|
{
|
2013-02-04 17:56:43 +08:00
|
|
|
.name = "{cycles,cache-misses:H}:G",
|
|
|
|
.check = test__group_gh2,
|
2014-04-25 23:34:06 +08:00
|
|
|
.id = 35,
|
2013-02-04 17:56:43 +08:00
|
|
|
},
|
2014-04-25 23:34:06 +08:00
|
|
|
{
|
2013-02-04 17:56:43 +08:00
|
|
|
.name = "{cycles:G,cache-misses:H}:u",
|
|
|
|
.check = test__group_gh3,
|
2014-04-25 23:34:06 +08:00
|
|
|
.id = 36,
|
2013-02-04 17:56:43 +08:00
|
|
|
},
|
2014-04-25 23:34:06 +08:00
|
|
|
{
|
2013-02-04 17:56:43 +08:00
|
|
|
.name = "{cycles:G,cache-misses:H}:uG",
|
|
|
|
.check = test__group_gh4,
|
2014-04-25 23:34:06 +08:00
|
|
|
.id = 37,
|
2013-02-04 17:56:43 +08:00
|
|
|
},
|
2014-04-25 23:34:06 +08:00
|
|
|
{
|
2013-02-02 03:37:11 +08:00
|
|
|
.name = "{cycles,cache-misses,branch-misses}:S",
|
|
|
|
.check = test__leader_sample1,
|
2014-04-25 23:34:06 +08:00
|
|
|
.id = 38,
|
2013-02-02 03:37:11 +08:00
|
|
|
},
|
2014-04-25 23:34:06 +08:00
|
|
|
{
|
2013-02-02 03:37:11 +08:00
|
|
|
.name = "{instructions,branch-misses}:Su",
|
|
|
|
.check = test__leader_sample2,
|
2014-04-25 23:34:06 +08:00
|
|
|
.id = 39,
|
2013-02-02 03:37:11 +08:00
|
|
|
},
|
2014-04-25 23:34:06 +08:00
|
|
|
{
|
2013-08-06 21:28:06 +08:00
|
|
|
.name = "instructions:uDp",
|
|
|
|
.check = test__checkevent_pinned_modifier,
|
2014-04-25 23:34:06 +08:00
|
|
|
.id = 40,
|
2013-08-06 21:28:06 +08:00
|
|
|
},
|
2014-04-25 23:34:06 +08:00
|
|
|
{
|
2013-08-06 21:28:06 +08:00
|
|
|
.name = "{cycles,cache-misses,branch-misses}:D",
|
|
|
|
.check = test__pinned_group,
|
2014-04-25 23:34:06 +08:00
|
|
|
.id = 41,
|
2013-08-06 21:28:06 +08:00
|
|
|
},
|
2014-05-29 23:26:52 +08:00
|
|
|
{
|
|
|
|
.name = "mem:0/1",
|
|
|
|
.check = test__checkevent_breakpoint_len,
|
|
|
|
.id = 42,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
.name = "mem:0/2:w",
|
|
|
|
.check = test__checkevent_breakpoint_len_w,
|
|
|
|
.id = 43,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
.name = "mem:0/4:rw:u",
|
|
|
|
.check = test__checkevent_breakpoint_len_rw_modifier,
|
|
|
|
.id = 44
|
|
|
|
},
|
2014-04-25 23:34:07 +08:00
|
|
|
#if defined(__s390x__)
|
|
|
|
{
|
|
|
|
.name = "kvm-s390:kvm_s390_create_vm",
|
|
|
|
.check = test__checkevent_tracepoint,
|
|
|
|
.id = 100,
|
|
|
|
},
|
|
|
|
#endif
|
2015-04-08 05:25:14 +08:00
|
|
|
{
|
|
|
|
.name = "instructions:I",
|
|
|
|
.check = test__checkevent_exclude_idle_modifier,
|
|
|
|
.id = 45,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
.name = "instructions:kIG",
|
|
|
|
.check = test__checkevent_exclude_idle_modifier_1,
|
|
|
|
.id = 46,
|
|
|
|
},
|
2015-10-06 02:06:06 +08:00
|
|
|
{
|
|
|
|
.name = "task-clock:P,cycles",
|
|
|
|
.check = test__checkevent_precise_max_modifier,
|
|
|
|
.id = 47,
|
|
|
|
},
|
2012-05-21 15:12:49 +08:00
|
|
|
};
|
|
|
|
|
2013-01-19 03:56:57 +08:00
|
|
|
static struct evlist_test test__events_pmu[] = {
|
2014-04-25 23:34:06 +08:00
|
|
|
{
|
2012-05-21 15:12:49 +08:00
|
|
|
.name = "cpu/config=10,config1,config2=3,period=1000/u",
|
|
|
|
.check = test__checkevent_pmu,
|
2014-04-25 23:34:06 +08:00
|
|
|
.id = 0,
|
2012-05-21 15:12:49 +08:00
|
|
|
},
|
2014-04-25 23:34:06 +08:00
|
|
|
{
|
2012-05-21 15:12:53 +08:00
|
|
|
.name = "cpu/config=1,name=krava/u,cpu/config=2/u",
|
|
|
|
.check = test__checkevent_pmu_name,
|
2014-04-25 23:34:06 +08:00
|
|
|
.id = 1,
|
2012-05-21 15:12:53 +08:00
|
|
|
},
|
2015-08-11 18:30:50 +08:00
|
|
|
{
|
|
|
|
.name = "cpu/config=1,call-graph=fp,time,period=100000/,cpu/config=2,call-graph=no,time=0,period=2000/",
|
|
|
|
.check = test__checkevent_pmu_partial_time_callgraph,
|
|
|
|
.id = 2,
|
|
|
|
},
|
2012-05-21 15:12:49 +08:00
|
|
|
};
|
|
|
|
|
2013-01-19 03:56:57 +08:00
|
|
|
struct terms_test {
|
2012-06-15 14:31:42 +08:00
|
|
|
const char *str;
|
|
|
|
__u32 type;
|
|
|
|
int (*check)(struct list_head *terms);
|
|
|
|
};
|
|
|
|
|
2013-01-19 03:56:57 +08:00
|
|
|
static struct terms_test test__terms[] = {
|
2012-06-15 14:31:42 +08:00
|
|
|
[0] = {
|
|
|
|
.str = "config=10,config1,config2=3,umask=1",
|
|
|
|
.check = test__checkterms_simple,
|
|
|
|
},
|
|
|
|
};
|
|
|
|
|
2013-01-19 03:56:57 +08:00
|
|
|
static int test_event(struct evlist_test *e)
|
2012-05-21 15:12:49 +08:00
|
|
|
{
|
|
|
|
struct perf_evlist *evlist;
|
|
|
|
int ret;
|
|
|
|
|
2013-03-11 15:43:12 +08:00
|
|
|
evlist = perf_evlist__new();
|
2012-05-21 15:12:49 +08:00
|
|
|
if (evlist == NULL)
|
|
|
|
return -ENOMEM;
|
|
|
|
|
perf tools: Add parse_events_error interface
Adding support to return error information from parse_events function.
Following struct will be populated by parse_events function on return:
struct parse_events_error {
int idx;
char *str;
char *help;
};
where 'idx' is the position in the string where the parsing failed,
'str' contains dynamically allocated error string describing the error
and 'help' is optional help string.
The change contains reporting function, which currently does not display
anything. The code changes to supply error data for specific event types
are coming in next patches. However this is what the expected output is:
$ sudo perf record -e 'sched:krava' ls
event syntax error: 'sched:krava'
\___ unknown tracepoint
...
$ perf record -e 'cpu/even=0x1/' ls
event syntax error: 'cpu/even=0x1/'
\___ unknown term
valid terms: pc,any,inv,edge,cmask,event,in_tx,ldlat,umask,in_tx_cp,offcore_rsp,config,config1,config2,name,period,branch_type
...
$ perf record -e cycles,cache-mises ls
event syntax error: '..es,cache-mises'
\___ parser error
...
The output functions cut the beginning of the event string so the error
starts up to 10th character and cut the end of the string of it crosses
the terminal width.
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Cc: David Ahern <dsahern@gmail.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1429729824-13932-2-git-send-email-jolsa@kernel.org
[ Renamed 'error' variables to 'err', not to clash with util.h error() ]
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2015-04-23 03:10:16 +08:00
|
|
|
ret = parse_events(evlist, e->name, NULL);
|
2012-05-21 15:12:49 +08:00
|
|
|
if (ret) {
|
|
|
|
pr_debug("failed to parse event '%s', err %d\n",
|
|
|
|
e->name, ret);
|
2014-01-04 04:30:04 +08:00
|
|
|
} else {
|
|
|
|
ret = e->check(evlist);
|
2012-05-21 15:12:49 +08:00
|
|
|
}
|
2014-12-18 04:24:45 +08:00
|
|
|
|
2012-05-21 15:12:49 +08:00
|
|
|
perf_evlist__delete(evlist);
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2013-01-19 03:56:57 +08:00
|
|
|
static int test_events(struct evlist_test *events, unsigned cnt)
|
2012-05-21 15:12:49 +08:00
|
|
|
{
|
2012-08-22 02:03:15 +08:00
|
|
|
int ret1, ret2 = 0;
|
2012-05-21 15:12:49 +08:00
|
|
|
unsigned i;
|
|
|
|
|
|
|
|
for (i = 0; i < cnt; i++) {
|
2013-01-19 03:56:57 +08:00
|
|
|
struct evlist_test *e = &events[i];
|
2012-05-21 15:12:49 +08:00
|
|
|
|
2014-04-25 23:34:06 +08:00
|
|
|
pr_debug("running test %d '%s'\n", e->id, e->name);
|
2012-08-22 02:03:15 +08:00
|
|
|
ret1 = test_event(e);
|
|
|
|
if (ret1)
|
|
|
|
ret2 = ret1;
|
2012-06-15 14:31:42 +08:00
|
|
|
}
|
|
|
|
|
2012-08-22 02:03:15 +08:00
|
|
|
return ret2;
|
2012-06-15 14:31:42 +08:00
|
|
|
}
|
|
|
|
|
2013-01-19 03:56:57 +08:00
|
|
|
static int test_term(struct terms_test *t)
|
2012-06-15 14:31:42 +08:00
|
|
|
{
|
2013-07-03 03:27:24 +08:00
|
|
|
struct list_head terms;
|
2012-06-15 14:31:42 +08:00
|
|
|
int ret;
|
|
|
|
|
2013-07-03 03:27:24 +08:00
|
|
|
INIT_LIST_HEAD(&terms);
|
2012-06-15 14:31:42 +08:00
|
|
|
|
2013-07-03 03:27:24 +08:00
|
|
|
ret = parse_events_terms(&terms, t->str);
|
2012-06-15 14:31:42 +08:00
|
|
|
if (ret) {
|
|
|
|
pr_debug("failed to parse terms '%s', err %d\n",
|
|
|
|
t->str , ret);
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2013-07-03 03:27:24 +08:00
|
|
|
ret = t->check(&terms);
|
2016-02-13 03:48:00 +08:00
|
|
|
parse_events_terms__purge(&terms);
|
2012-06-15 14:31:42 +08:00
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2013-01-19 03:56:57 +08:00
|
|
|
static int test_terms(struct terms_test *terms, unsigned cnt)
|
2012-06-15 14:31:42 +08:00
|
|
|
{
|
|
|
|
int ret = 0;
|
|
|
|
unsigned i;
|
|
|
|
|
|
|
|
for (i = 0; i < cnt; i++) {
|
2013-01-19 03:56:57 +08:00
|
|
|
struct terms_test *t = &terms[i];
|
2012-06-15 14:31:42 +08:00
|
|
|
|
|
|
|
pr_debug("running test %d '%s'\n", i, t->str);
|
|
|
|
ret = test_term(t);
|
2012-05-21 15:12:49 +08:00
|
|
|
if (ret)
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int test_pmu(void)
|
|
|
|
{
|
|
|
|
struct stat st;
|
|
|
|
char path[PATH_MAX];
|
|
|
|
int ret;
|
|
|
|
|
|
|
|
snprintf(path, PATH_MAX, "%s/bus/event_source/devices/cpu/format/",
|
2013-11-06 01:48:50 +08:00
|
|
|
sysfs__mountpoint());
|
2012-05-21 15:12:49 +08:00
|
|
|
|
|
|
|
ret = stat(path, &st);
|
|
|
|
if (ret)
|
2012-07-18 00:20:59 +08:00
|
|
|
pr_debug("omitting PMU cpu tests\n");
|
2012-05-21 15:12:49 +08:00
|
|
|
return !ret;
|
|
|
|
}
|
|
|
|
|
2012-10-10 20:53:18 +08:00
|
|
|
static int test_pmu_events(void)
|
|
|
|
{
|
|
|
|
struct stat st;
|
|
|
|
char path[PATH_MAX];
|
|
|
|
struct dirent *ent;
|
|
|
|
DIR *dir;
|
|
|
|
int ret;
|
|
|
|
|
|
|
|
snprintf(path, PATH_MAX, "%s/bus/event_source/devices/cpu/events/",
|
2013-11-06 01:48:50 +08:00
|
|
|
sysfs__mountpoint());
|
2012-10-10 20:53:18 +08:00
|
|
|
|
|
|
|
ret = stat(path, &st);
|
|
|
|
if (ret) {
|
2013-04-09 01:06:50 +08:00
|
|
|
pr_debug("omitting PMU cpu events tests\n");
|
2012-10-10 20:53:18 +08:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
dir = opendir(path);
|
|
|
|
if (!dir) {
|
|
|
|
pr_debug("can't open pmu event dir");
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
while (!ret && (ent = readdir(dir))) {
|
|
|
|
#define MAX_NAME 100
|
2013-01-19 03:56:57 +08:00
|
|
|
struct evlist_test e;
|
2012-10-10 20:53:18 +08:00
|
|
|
char name[MAX_NAME];
|
|
|
|
|
|
|
|
if (!strcmp(ent->d_name, ".") ||
|
|
|
|
!strcmp(ent->d_name, ".."))
|
|
|
|
continue;
|
|
|
|
|
|
|
|
snprintf(name, MAX_NAME, "cpu/event=%s/u", ent->d_name);
|
|
|
|
|
|
|
|
e.name = name;
|
|
|
|
e.check = test__checkevent_pmu_events;
|
|
|
|
|
|
|
|
ret = test_event(&e);
|
perf test: Add test case for pmu event new style format
Add test case in automated tests suite. It checks not only the two types
of pmu event stytle formats "pmu_event_name" and "cpu/pmu_event_name/",
but also the different formats mixtures which are more likely to trigger
parse issue.
The patch set including this one has been tested by the perf automated
test:
./perf test parse -v"
On haswell, ivybridge and Romley platform.
The patch set also has been tested on haswell by the following script.
Note: please make sure that your test system support TSX and
L1-dcache-loads events. Otherwise, you may want to change the events to
other pmu events.
[lk@localhost ~]$ cat perf_style_test.sh
# hardware events + kernel pmu event with different style
perf stat -x, -e cycles,mem-stores,tx-start sleep 2
perf stat -x, -e cpu-cycles,cycles-ct,cycles-t sleep 2
perf stat -x, -e cycles,cpu/cycles-ct/,cpu/cycles-t/ sleep 2
perf stat -x, -e instructions,cpu/tx-start/ sleep 2
perf stat -x, -e '{cycles,tx-start}' sleep 2
perf stat -x, -e '{cycles,cpu/tx-start/}' sleep 2
# HW Cache event + kernel pmu event with different style
perf stat -x, -e L1-dcache-loads,cpu/mem-stores/,tx-start sleep 2
perf stat -x, -e L1-dcache-loads,mem-stores,cpu/tx-start/ sleep 2
perf stat -x, -e '{L1-dcache-loads,mem-stores}' sleep 2
perf stat -x, -e '{L1-dcache-loads,cpu/tx-start/}' sleep 2
# Raw event + kernel pmu event with different style:
perf stat -x, -e cpu/event=0xc0,umask=0x00/,mem-loads,cpu/mem-stores/ sleep 2
perf stat -x, -e cpu/event=0xc0,umask=0x00/,tx-start,cpu/el-start/ sleep 2
perf stat -x, -e '{cpu/event=0xc0,umask=0x00/,tx-start}' sleep 2
Signed-off-by: Kan Liang <kan.liang@intel.com>
Acked-by: Jiri Olsa <jolsa@redhat.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Link: http://lkml.kernel.org/r/1412694532-23391-5-git-send-email-kan.liang@intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2014-10-07 23:08:52 +08:00
|
|
|
if (ret)
|
|
|
|
break;
|
|
|
|
snprintf(name, MAX_NAME, "%s:u,cpu/event=%s/u", ent->d_name, ent->d_name);
|
|
|
|
e.name = name;
|
|
|
|
e.check = test__checkevent_pmu_events_mix;
|
|
|
|
ret = test_event(&e);
|
2012-10-10 20:53:18 +08:00
|
|
|
#undef MAX_NAME
|
|
|
|
}
|
|
|
|
|
|
|
|
closedir(dir);
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2015-10-19 23:23:49 +08:00
|
|
|
static void debug_warn(const char *warn, va_list params)
|
|
|
|
{
|
|
|
|
char msg[1024];
|
|
|
|
|
|
|
|
if (!verbose)
|
|
|
|
return;
|
|
|
|
|
|
|
|
vsnprintf(msg, sizeof(msg), warn, params);
|
|
|
|
fprintf(stderr, " Warning: %s\n", msg);
|
|
|
|
}
|
|
|
|
|
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 23:01:48 +08:00
|
|
|
int test__parse_events(int subtest __maybe_unused)
|
2012-05-21 15:12:49 +08:00
|
|
|
{
|
2012-08-22 02:03:15 +08:00
|
|
|
int ret1, ret2 = 0;
|
2012-05-21 15:12:49 +08:00
|
|
|
|
2012-07-04 06:00:47 +08:00
|
|
|
#define TEST_EVENTS(tests) \
|
|
|
|
do { \
|
2012-08-22 02:03:15 +08:00
|
|
|
ret1 = test_events(tests, ARRAY_SIZE(tests)); \
|
|
|
|
if (!ret2) \
|
|
|
|
ret2 = ret1; \
|
2012-07-04 06:00:47 +08:00
|
|
|
} while (0)
|
2012-06-15 14:31:42 +08:00
|
|
|
|
2015-10-19 23:23:49 +08:00
|
|
|
set_warning_routine(debug_warn);
|
|
|
|
|
2012-07-04 06:00:47 +08:00
|
|
|
TEST_EVENTS(test__events);
|
2012-06-15 14:31:42 +08:00
|
|
|
|
2012-07-04 06:00:47 +08:00
|
|
|
if (test_pmu())
|
|
|
|
TEST_EVENTS(test__events_pmu);
|
2012-05-21 15:12:49 +08:00
|
|
|
|
2012-10-10 20:53:18 +08:00
|
|
|
if (test_pmu()) {
|
|
|
|
int ret = test_pmu_events();
|
|
|
|
if (ret)
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2012-08-22 02:03:15 +08:00
|
|
|
ret1 = test_terms(test__terms, ARRAY_SIZE(test__terms));
|
|
|
|
if (!ret2)
|
|
|
|
ret2 = ret1;
|
|
|
|
|
|
|
|
return ret2;
|
2012-05-21 15:12:49 +08:00
|
|
|
}
|