evsel-roundtrip-name.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. // SPDX-License-Identifier: GPL-2.0
  2. #include "evlist.h"
  3. #include "evsel.h"
  4. #include "parse-events.h"
  5. #include "tests.h"
  6. #include "debug.h"
  7. #include <linux/kernel.h>
  8. static int perf_evsel__roundtrip_cache_name_test(void)
  9. {
  10. int ret = TEST_OK;
  11. for (int type = 0; type < PERF_COUNT_HW_CACHE_MAX; type++) {
  12. for (int op = 0; op < PERF_COUNT_HW_CACHE_OP_MAX; op++) {
  13. /* skip invalid cache type */
  14. if (!evsel__is_cache_op_valid(type, op))
  15. continue;
  16. for (int res = 0; res < PERF_COUNT_HW_CACHE_RESULT_MAX; res++) {
  17. char name[128];
  18. struct evlist *evlist = evlist__new();
  19. struct evsel *evsel;
  20. int err;
  21. if (evlist == NULL) {
  22. pr_debug("Failed to alloc evlist");
  23. return TEST_FAIL;
  24. }
  25. __evsel__hw_cache_type_op_res_name(type, op, res,
  26. name, sizeof(name));
  27. err = parse_event(evlist, name);
  28. if (err) {
  29. pr_debug("Failure to parse cache event '%s' possibly as PMUs don't support it",
  30. name);
  31. evlist__delete(evlist);
  32. continue;
  33. }
  34. evlist__for_each_entry(evlist, evsel) {
  35. if (!evsel__name_is(evsel, name)) {
  36. pr_debug("%s != %s\n", evsel__name(evsel), name);
  37. ret = TEST_FAIL;
  38. }
  39. }
  40. evlist__delete(evlist);
  41. }
  42. }
  43. }
  44. return ret;
  45. }
  46. static int perf_evsel__name_array_test(const char *const names[], int nr_names)
  47. {
  48. int ret = TEST_OK;
  49. for (int i = 0; i < nr_names; ++i) {
  50. struct evlist *evlist = evlist__new();
  51. struct evsel *evsel;
  52. int err;
  53. if (evlist == NULL) {
  54. pr_debug("Failed to alloc evlist");
  55. return TEST_FAIL;
  56. }
  57. err = parse_event(evlist, names[i]);
  58. if (err) {
  59. pr_debug("failed to parse event '%s', err %d\n",
  60. names[i], err);
  61. evlist__delete(evlist);
  62. ret = TEST_FAIL;
  63. continue;
  64. }
  65. evlist__for_each_entry(evlist, evsel) {
  66. if (!evsel__name_is(evsel, names[i])) {
  67. pr_debug("%s != %s\n", evsel__name(evsel), names[i]);
  68. ret = TEST_FAIL;
  69. }
  70. }
  71. evlist__delete(evlist);
  72. }
  73. return ret;
  74. }
  75. static int test__perf_evsel__roundtrip_name_test(struct test_suite *test __maybe_unused,
  76. int subtest __maybe_unused)
  77. {
  78. int err = 0, ret = TEST_OK;
  79. err = perf_evsel__name_array_test(evsel__hw_names, PERF_COUNT_HW_MAX);
  80. if (err)
  81. ret = err;
  82. err = perf_evsel__name_array_test(evsel__sw_names, PERF_COUNT_SW_DUMMY + 1);
  83. if (err)
  84. ret = err;
  85. err = perf_evsel__roundtrip_cache_name_test();
  86. if (err)
  87. ret = err;
  88. return ret;
  89. }
  90. DEFINE_SUITE("Roundtrip evsel->name", perf_evsel__roundtrip_name_test);