intel/perf: fix raw query kernel metric selection
authorLionel Landwerlin <lionel.g.landwerlin@intel.com>
Mon, 24 Aug 2020 10:52:59 +0000 (13:52 +0300)
committerMarge Bot <eric+marge@anholt.net>
Mon, 24 Aug 2020 18:52:23 +0000 (18:52 +0000)
The raw query is meant to be used with MDAPI [1]. When using this
metric without this library, we usually selected the TestOa metric to
provide some default sensible values (instead of undefined).
Historically this TestOa metric lived in the kernel at ID=1. We
removed all metrics from the kernel in kernel commit 9aba9c188da136
("drm/i915/perf: remove generated code").

This fixes the Mesa code to use a valid metric set ID (1 could work
some of the time, but not guaranteed).

[1] : https://github.com/intel/metrics-discovery

v2: Store fallback metric at init time

v3: Drop TestOa lookout

v4: Skip the existing queries (Marcin)

Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
CC: <mesa-stable@lists.freedesktop.org>
Tested-by: Marcin Ĺšlusarz <marcin.slusarz@intel.com> (v1)
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6438>

src/intel/perf/gen_perf.c
src/intel/perf/gen_perf.h
src/intel/perf/gen_perf_query.c

index ba1b4f8b127e3cf0a4cc18a6e2b393c87d38108f..d9f20501512bee8bf20e0a362843be728ecdd7ff 100644 (file)
@@ -770,6 +770,19 @@ load_oa_metrics(struct gen_perf_config *perf, int fd,
    /* sort counters in each individual group created by this function by name */
    for (int i = existing_queries; i < perf->n_queries; ++i)
       sort_query(&perf->queries[i]);
+
+   /* Select a fallback OA metric. Look for the TestOa metric or use the last
+    * one if no present (on HSW).
+    */
+   for (int i = existing_queries; i < perf->n_queries; i++) {
+      if (perf->queries[i].symbol_name &&
+          strcmp(perf->queries[i].symbol_name, "TestOa") == 0) {
+         perf->fallback_raw_oa_metric = perf->queries[i].oa_metrics_set_id;
+         break;
+      }
+   }
+   if (perf->fallback_raw_oa_metric == 0)
+      perf->fallback_raw_oa_metric = perf->queries[perf->n_queries - 1].oa_metrics_set_id;
 }
 
 struct gen_perf_registers *
index 073236c431752baf6e0f065947ca12cc1171c3f8..790719ccbadad3960acea2d5f1d7e1af2d3f39ec 100644 (file)
@@ -283,6 +283,11 @@ struct gen_perf_config {
     */
    struct hash_table *oa_metrics_table;
 
+   /* When MDAPI hasn't configured the metric we need to use by the time the
+    * query begins, this OA metric is used as a fallback.
+    */
+   uint64_t fallback_raw_oa_metric;
+
    /* Whether we have support for this platform. If true && n_queries == 0,
     * this means we will not be able to use i915-perf because of it is in
     * paranoid mode.
index 7bd8e0277d24d2d85e29358efd49062615626d87..593ab5c473b66e91d74fb443701177a1443d8ffd 100644 (file)
@@ -423,7 +423,7 @@ get_metric_id(struct gen_perf_config *perf,
    if (!gen_perf_load_metric_id(perf, query->guid,
                                 &raw_query->oa_metrics_set_id)) {
       DBG("Unable to read query guid=%s ID, falling back to test config\n", query->guid);
-      raw_query->oa_metrics_set_id = 1ULL;
+      raw_query->oa_metrics_set_id = perf->fallback_raw_oa_metric;
    } else {
       DBG("Raw query '%s'guid=%s loaded ID: %"PRIu64"\n",
           query->name, query->guid, query->oa_metrics_set_id);