linux/tools/perf/tests/event_update.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2#include <linux/compiler.h>
   3#include <perf/cpumap.h>
   4#include <string.h>
   5#include "cpumap.h"
   6#include "evlist.h"
   7#include "evsel.h"
   8#include "header.h"
   9#include "machine.h"
  10#include "util/synthetic-events.h"
  11#include "tool.h"
  12#include "tests.h"
  13#include "debug.h"
  14
  15static int process_event_unit(struct perf_tool *tool __maybe_unused,
  16                              union perf_event *event,
  17                              struct perf_sample *sample __maybe_unused,
  18                              struct machine *machine __maybe_unused)
  19{
  20        struct perf_record_event_update *ev = (struct perf_record_event_update *)event;
  21
  22        TEST_ASSERT_VAL("wrong id", ev->id == 123);
  23        TEST_ASSERT_VAL("wrong id", ev->type == PERF_EVENT_UPDATE__UNIT);
  24        TEST_ASSERT_VAL("wrong unit", !strcmp(ev->data, "KRAVA"));
  25        return 0;
  26}
  27
  28static int process_event_scale(struct perf_tool *tool __maybe_unused,
  29                               union perf_event *event,
  30                               struct perf_sample *sample __maybe_unused,
  31                               struct machine *machine __maybe_unused)
  32{
  33        struct perf_record_event_update *ev = (struct perf_record_event_update *)event;
  34        struct perf_record_event_update_scale *ev_data;
  35
  36        ev_data = (struct perf_record_event_update_scale *)ev->data;
  37
  38        TEST_ASSERT_VAL("wrong id", ev->id == 123);
  39        TEST_ASSERT_VAL("wrong id", ev->type == PERF_EVENT_UPDATE__SCALE);
  40        TEST_ASSERT_VAL("wrong scale", ev_data->scale == 0.123);
  41        return 0;
  42}
  43
  44struct event_name {
  45        struct perf_tool tool;
  46        const char *name;
  47};
  48
  49static int process_event_name(struct perf_tool *tool,
  50                              union perf_event *event,
  51                              struct perf_sample *sample __maybe_unused,
  52                              struct machine *machine __maybe_unused)
  53{
  54        struct event_name *tmp = container_of(tool, struct event_name, tool);
  55        struct perf_record_event_update *ev = (struct perf_record_event_update *)event;
  56
  57        TEST_ASSERT_VAL("wrong id", ev->id == 123);
  58        TEST_ASSERT_VAL("wrong id", ev->type == PERF_EVENT_UPDATE__NAME);
  59        TEST_ASSERT_VAL("wrong name", !strcmp(ev->data, tmp->name));
  60        return 0;
  61}
  62
  63static int process_event_cpus(struct perf_tool *tool __maybe_unused,
  64                              union perf_event *event,
  65                              struct perf_sample *sample __maybe_unused,
  66                              struct machine *machine __maybe_unused)
  67{
  68        struct perf_record_event_update *ev = (struct perf_record_event_update *)event;
  69        struct perf_record_event_update_cpus *ev_data;
  70        struct perf_cpu_map *map;
  71
  72        ev_data = (struct perf_record_event_update_cpus *) ev->data;
  73
  74        map = cpu_map__new_data(&ev_data->cpus);
  75
  76        TEST_ASSERT_VAL("wrong id", ev->id == 123);
  77        TEST_ASSERT_VAL("wrong type", ev->type == PERF_EVENT_UPDATE__CPUS);
  78        TEST_ASSERT_VAL("wrong cpus", map->nr == 3);
  79        TEST_ASSERT_VAL("wrong cpus", map->map[0] == 1);
  80        TEST_ASSERT_VAL("wrong cpus", map->map[1] == 2);
  81        TEST_ASSERT_VAL("wrong cpus", map->map[2] == 3);
  82        perf_cpu_map__put(map);
  83        return 0;
  84}
  85
  86int test__event_update(struct test *test __maybe_unused, int subtest __maybe_unused)
  87{
  88        struct evsel *evsel;
  89        struct event_name tmp;
  90        struct evlist *evlist = evlist__new_default();
  91        char *unit = strdup("KRAVA");
  92
  93        TEST_ASSERT_VAL("failed to get evlist", evlist);
  94
  95        evsel = evlist__first(evlist);
  96
  97        TEST_ASSERT_VAL("failed to allocate ids",
  98                        !perf_evsel__alloc_id(&evsel->core, 1, 1));
  99
 100        perf_evlist__id_add(&evlist->core, &evsel->core, 0, 0, 123);
 101
 102        evsel->unit = unit;
 103
 104        TEST_ASSERT_VAL("failed to synthesize attr update unit",
 105                        !perf_event__synthesize_event_update_unit(NULL, evsel, process_event_unit));
 106
 107        evsel->scale = 0.123;
 108
 109        TEST_ASSERT_VAL("failed to synthesize attr update scale",
 110                        !perf_event__synthesize_event_update_scale(NULL, evsel, process_event_scale));
 111
 112        tmp.name = evsel__name(evsel);
 113
 114        TEST_ASSERT_VAL("failed to synthesize attr update name",
 115                        !perf_event__synthesize_event_update_name(&tmp.tool, evsel, process_event_name));
 116
 117        evsel->core.own_cpus = perf_cpu_map__new("1,2,3");
 118
 119        TEST_ASSERT_VAL("failed to synthesize attr update cpus",
 120                        !perf_event__synthesize_event_update_cpus(&tmp.tool, evsel, process_event_cpus));
 121
 122        free(unit);
 123        evlist__delete(evlist);
 124        return 0;
 125}
 126