expand-cgroup.c 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. // SPDX-License-Identifier: GPL-2.0
  2. #include "tests.h"
  3. #include "debug.h"
  4. #include "evlist.h"
  5. #include "cgroup.h"
  6. #include "rblist.h"
  7. #include "metricgroup.h"
  8. #include "parse-events.h"
  9. #include "pmu-events/pmu-events.h"
  10. #include "pfm.h"
  11. #include <subcmd/parse-options.h>
  12. #include <stdio.h>
  13. #include <stdlib.h>
  14. #include <string.h>
  15. static int test_expand_events(struct evlist *evlist)
  16. {
  17. int i, ret = TEST_FAIL;
  18. int nr_events;
  19. bool was_group_event;
  20. int nr_members; /* for the first evsel only */
  21. const char cgrp_str[] = "A,B,C";
  22. const char *cgrp_name[] = { "A", "B", "C" };
  23. int nr_cgrps = ARRAY_SIZE(cgrp_name);
  24. char **ev_name;
  25. struct evsel *evsel;
  26. TEST_ASSERT_VAL("evlist is empty", !evlist__empty(evlist));
  27. nr_events = evlist->core.nr_entries;
  28. ev_name = calloc(nr_events, sizeof(*ev_name));
  29. if (ev_name == NULL) {
  30. pr_debug("memory allocation failure\n");
  31. return TEST_FAIL;
  32. }
  33. i = 0;
  34. evlist__for_each_entry(evlist, evsel) {
  35. ev_name[i] = strdup(evsel->name);
  36. if (ev_name[i] == NULL) {
  37. pr_debug("memory allocation failure\n");
  38. goto out;
  39. }
  40. i++;
  41. }
  42. /* remember grouping info */
  43. was_group_event = evsel__is_group_event(evlist__first(evlist));
  44. nr_members = evlist__first(evlist)->core.nr_members;
  45. ret = evlist__expand_cgroup(evlist, cgrp_str, false);
  46. if (ret < 0) {
  47. pr_debug("failed to expand events for cgroups\n");
  48. goto out;
  49. }
  50. ret = TEST_FAIL;
  51. if (evlist->core.nr_entries != nr_events * nr_cgrps) {
  52. pr_debug("event count doesn't match\n");
  53. goto out;
  54. }
  55. i = 0;
  56. evlist__for_each_entry(evlist, evsel) {
  57. if (!evsel__name_is(evsel, ev_name[i % nr_events])) {
  58. pr_debug("event name doesn't match:\n");
  59. pr_debug(" evsel[%d]: %s\n expected: %s\n",
  60. i, evsel->name, ev_name[i % nr_events]);
  61. goto out;
  62. }
  63. if (strcmp(evsel->cgrp->name, cgrp_name[i / nr_events])) {
  64. pr_debug("cgroup name doesn't match:\n");
  65. pr_debug(" evsel[%d]: %s\n expected: %s\n",
  66. i, evsel->cgrp->name, cgrp_name[i / nr_events]);
  67. goto out;
  68. }
  69. if ((i % nr_events) == 0) {
  70. if (evsel__is_group_event(evsel) != was_group_event) {
  71. pr_debug("event group doesn't match: got %s, expect %s\n",
  72. evsel__is_group_event(evsel) ? "true" : "false",
  73. was_group_event ? "true" : "false");
  74. goto out;
  75. }
  76. if (evsel->core.nr_members != nr_members) {
  77. pr_debug("event group member doesn't match: %d vs %d\n",
  78. evsel->core.nr_members, nr_members);
  79. goto out;
  80. }
  81. }
  82. i++;
  83. }
  84. ret = TEST_OK;
  85. out: for (i = 0; i < nr_events; i++)
  86. free(ev_name[i]);
  87. free(ev_name);
  88. return ret;
  89. }
  90. static int expand_default_events(void)
  91. {
  92. int ret;
  93. struct evlist *evlist = evlist__new_default();
  94. TEST_ASSERT_VAL("failed to get evlist", evlist);
  95. ret = test_expand_events(evlist);
  96. evlist__delete(evlist);
  97. return ret;
  98. }
  99. static int expand_group_events(void)
  100. {
  101. int ret;
  102. struct evlist *evlist;
  103. struct parse_events_error err;
  104. const char event_str[] = "{cycles,instructions}";
  105. symbol_conf.event_group = true;
  106. evlist = evlist__new();
  107. TEST_ASSERT_VAL("failed to get evlist", evlist);
  108. parse_events_error__init(&err);
  109. ret = parse_events(evlist, event_str, &err);
  110. if (ret < 0) {
  111. pr_debug("failed to parse event '%s', err %d\n", event_str, ret);
  112. parse_events_error__print(&err, event_str);
  113. goto out;
  114. }
  115. ret = test_expand_events(evlist);
  116. out:
  117. parse_events_error__exit(&err);
  118. evlist__delete(evlist);
  119. return ret;
  120. }
  121. static int expand_libpfm_events(void)
  122. {
  123. int ret;
  124. struct evlist *evlist;
  125. const char event_str[] = "CYCLES";
  126. struct option opt = {
  127. .value = &evlist,
  128. };
  129. symbol_conf.event_group = true;
  130. evlist = evlist__new();
  131. TEST_ASSERT_VAL("failed to get evlist", evlist);
  132. ret = parse_libpfm_events_option(&opt, event_str, 0);
  133. if (ret < 0) {
  134. pr_debug("failed to parse libpfm event '%s', err %d\n",
  135. event_str, ret);
  136. goto out;
  137. }
  138. if (evlist__empty(evlist)) {
  139. pr_debug("libpfm was not enabled\n");
  140. goto out;
  141. }
  142. ret = test_expand_events(evlist);
  143. out:
  144. evlist__delete(evlist);
  145. return ret;
  146. }
  147. static int expand_metric_events(void)
  148. {
  149. int ret;
  150. struct evlist *evlist;
  151. const char metric_str[] = "CPI";
  152. const struct pmu_metrics_table *pme_test;
  153. evlist = evlist__new();
  154. TEST_ASSERT_VAL("failed to get evlist", evlist);
  155. pme_test = find_core_metrics_table("testarch", "testcpu");
  156. ret = metricgroup__parse_groups_test(evlist, pme_test, metric_str);
  157. if (ret < 0) {
  158. pr_debug("failed to parse '%s' metric\n", metric_str);
  159. goto out;
  160. }
  161. ret = test_expand_events(evlist);
  162. out:
  163. evlist__delete(evlist);
  164. return ret;
  165. }
  166. static int test__expand_cgroup_events(struct test_suite *test __maybe_unused,
  167. int subtest __maybe_unused)
  168. {
  169. int ret;
  170. ret = expand_default_events();
  171. TEST_ASSERT_EQUAL("failed to expand default events", ret, 0);
  172. ret = expand_group_events();
  173. TEST_ASSERT_EQUAL("failed to expand event group", ret, 0);
  174. ret = expand_libpfm_events();
  175. TEST_ASSERT_EQUAL("failed to expand event group", ret, 0);
  176. ret = expand_metric_events();
  177. TEST_ASSERT_EQUAL("failed to expand metric events", ret, 0);
  178. return ret;
  179. }
  180. DEFINE_SUITE("Event expansion for cgroups", expand_cgroup_events);