intel/perf: Move perf query register programming to static tables.
authorEric Anholt <eric@anholt.net>
Thu, 9 Jul 2020 16:41:45 +0000 (09:41 -0700)
committerMarge Bot <eric+marge@anholt.net>
Fri, 17 Jul 2020 17:44:17 +0000 (17:44 +0000)
And now that they're static tables, we don't need to ralloc a copy in
non-shared memory.

Saves ~210k in the built intel drivers.

Bug: https://bugs.chromium.org/p/chromium/issues/detail?id=1048434
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5829>

src/intel/perf/gen_perf.c
src/intel/perf/gen_perf.h
src/intel/perf/gen_perf.py
src/intel/perf/gen_perf_private.h

index f31b15aa4b26ac3f9b32129bd4bae059b54fc0a2..e6a18a3a8d549d3c63a637be092d2f0a021b5e84 100644 (file)
@@ -328,13 +328,13 @@ i915_add_config(struct gen_perf_config *perf, int fd,
    memcpy(i915_config.uuid, guid, sizeof(i915_config.uuid));
 
    i915_config.n_mux_regs = config->n_mux_regs;
-   i915_config.mux_regs_ptr = to_user_pointer(config->mux_regs);
+   i915_config.mux_regs_ptr = to_const_user_pointer(config->mux_regs);
 
    i915_config.n_boolean_regs = config->n_b_counter_regs;
-   i915_config.boolean_regs_ptr = to_user_pointer(config->b_counter_regs);
+   i915_config.boolean_regs_ptr = to_const_user_pointer(config->b_counter_regs);
 
    i915_config.n_flex_regs = config->n_flex_regs;
-   i915_config.flex_regs_ptr = to_user_pointer(config->flex_regs);
+   i915_config.flex_regs_ptr = to_const_user_pointer(config->flex_regs);
 
    int ret = gen_ioctl(fd, DRM_IOCTL_I915_PERF_ADD_CONFIG, &i915_config);
    return ret > 0 ? ret : 0;
@@ -748,9 +748,9 @@ gen_perf_load_configuration(struct gen_perf_config *perf_cfg, int fd, const char
     * struct gen_perf_query_register_prog maps exactly to the tuple of
     * (register offset, register value) returned by the i915.
     */
-   i915_config.flex_regs_ptr = to_user_pointer(config->flex_regs);
-   i915_config.mux_regs_ptr = to_user_pointer(config->mux_regs);
-   i915_config.boolean_regs_ptr = to_user_pointer(config->b_counter_regs);
+   i915_config.flex_regs_ptr = to_const_user_pointer(config->flex_regs);
+   i915_config.mux_regs_ptr = to_const_user_pointer(config->mux_regs);
+   i915_config.boolean_regs_ptr = to_const_user_pointer(config->b_counter_regs);
    if (!i915_query_perf_config_data(perf_cfg, fd, guid, &i915_config)) {
       ralloc_free(config);
       return NULL;
index 95aeab9182fbe7422c35a5c77be0f5e232b42a69..49ea2eb9e81f50229680448870438ac5a78827f0 100644 (file)
@@ -190,13 +190,13 @@ struct gen_perf_query_register_prog {
 
 /* Register programming for a given query */
 struct gen_perf_registers {
-   struct gen_perf_query_register_prog *flex_regs;
+   const struct gen_perf_query_register_prog *flex_regs;
    uint32_t n_flex_regs;
 
-   struct gen_perf_query_register_prog *mux_regs;
+   const struct gen_perf_query_register_prog *mux_regs;
    uint32_t n_mux_regs;
 
-   struct gen_perf_query_register_prog *b_counter_regs;
+   const struct gen_perf_query_register_prog *b_counter_regs;
    uint32_t n_b_counter_regs;
 };
 
index a5b47ea56e822ca27e042eb30711cc87de95c867..e714e1e802dd97ed94b2e6b0a064afe09b37b78a 100644 (file)
@@ -430,10 +430,14 @@ def generate_register_configs(set):
             c_indent(3)
 
         registers = register_config.findall('register')
-        c("query->config.%s = rzalloc_array(query, struct gen_perf_query_register_prog, %d);" % (t, len(registers)))
+        c("static const struct gen_perf_query_register_prog %s[] = {" % t)
+        c_indent(3)
         for register in registers:
-            c("query->config.%s[query->config.n_%s++] = (struct gen_perf_query_register_prog) { .reg = %s, .val = %s };" %
-              (t, t, register.get('address'), register.get('value')))
+            c("{ .reg = %s, .val = %s }," % (register.get('address'), register.get('value')))
+        c_outdent(3)
+        c("};")
+        c("query->config.%s = %s;" % (t, t))
+        c("query->config.n_%s = ARRAY_SIZE(%s);" % (t, t))
 
         if availability:
             c_outdent(3)
index 2e4568fa9aaa89805923124964006c5b6fd0783d..e3e877dd89e4c5a6460006ee2a10886a4d1f94e6 100644 (file)
@@ -31,6 +31,11 @@ static inline uint64_t to_user_pointer(void *ptr)
    return (uintptr_t) ptr;
 }
 
+static inline uint64_t to_const_user_pointer(const void *ptr)
+{
+   return (uintptr_t) ptr;
+}
+
 static inline void
 gen_perf_query_add_stat_reg(struct gen_perf_query_info *query, uint32_t reg,
                             uint32_t numerator, uint32_t denominator,