intel/perf: Use a char array for OA perf query data
authorJason Ekstrand <jason@jlekstrand.net>
Tue, 10 Aug 2021 20:09:51 +0000 (15:09 -0500)
committerMarge Bot <eric+marge@anholt.net>
Wed, 11 Aug 2021 23:57:52 +0000 (23:57 +0000)
drm_i915_query_perf_config::data is an unsized array and declaring a
struct containing an unsized array that isn't at the end is a GNU
extension which trips up Android builds.  Instead, stuff both into a
char array of the appropriate size.  This emulates what you'd normally
do to allocate one of these with malloc only on the stack.

Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Reviewed-by: Kristian H. Kristensen <hoegsberg@google.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12308>

src/intel/perf/intel_perf.c

index 7c5175d..a4d801b 100644 (file)
@@ -266,22 +266,20 @@ i915_query_perf_config_data(struct intel_perf_config *perf,
                             int fd, const char *guid,
                             struct drm_i915_perf_oa_config *config)
 {
-   struct {
-      struct drm_i915_query_perf_config query;
-      struct drm_i915_perf_oa_config config;
-   } item_data;
+   char data[sizeof(struct drm_i915_query_perf_config) +
+             sizeof(struct drm_i915_perf_oa_config)] = {};
+   struct drm_i915_query_perf_config *query = (void *)data;
 
-   memset(&item_data, 0, sizeof(item_data));
-   memcpy(item_data.query.uuid, guid, sizeof(item_data.query.uuid));
-   memcpy(&item_data.config, config, sizeof(item_data.config));
+   memcpy(query->uuid, guid, sizeof(query->uuid));
+   memcpy(query->data, config, sizeof(*config));
 
-   int32_t item_length = sizeof(item_data);
+   int32_t item_length = sizeof(data);
    if (intel_i915_query_flags(fd, DRM_I915_QUERY_PERF_CONFIG,
                               DRM_I915_QUERY_PERF_CONFIG_DATA_FOR_UUID,
-                              &item_data, &item_length))
+                              query, &item_length))
       return false;
 
-   memcpy(config, &item_data.config, sizeof(item_data.config));
+   memcpy(config, query->data, sizeof(*config));
 
    return true;
 }