[Mesa-dev] [PATCH 4/5] i965: perf: add support for userspace configurations
Lionel Landwerlin
lionel.g.landwerlin at intel.com
Tue Aug 29 11:21:07 UTC 2017
On 29/08/17 12:15, Chris Wilson wrote:
> Quoting Lionel Landwerlin (2017-08-29 11:58:57)
>> This allows us to deploy new configurations without touching the
>> kernel.
>>
>> Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
>> ---
>> src/mesa/drivers/dri/i965/brw_performance_query.c | 97 ++++++++++++++++++++++-
>> 1 file changed, 96 insertions(+), 1 deletion(-)
>>
>> diff --git a/src/mesa/drivers/dri/i965/brw_performance_query.c b/src/mesa/drivers/dri/i965/brw_performance_query.c
>> index 4b585c95b7d..901cbb464e9 100644
>> --- a/src/mesa/drivers/dri/i965/brw_performance_query.c
>> +++ b/src/mesa/drivers/dri/i965/brw_performance_query.c
>> @@ -1807,6 +1807,96 @@ read_sysfs_drm_device_file_uint64(struct brw_context *brw,
>> return read_file_uint64(buf, value);
>> }
>>
>> +static bool
>> +kernel_has_dynamic_config_support(int drm_fd, const char *sysfs_dev_dir)
>> +{
>> + struct drm_i915_perf_oa_config config;
>> + const char *uuid = "01234567-0123-0123-0123-0123456789ab";
>> + uint32_t mux_regs[] = { 0x9888 /* NOA_WRITE */, 0x0 };
>> + char config_path[256];
>> + struct stat sb;
>> + uint64_t config_id;
>> + int ret;
>> +
>> + snprintf(config_path, sizeof(config_path),
>> + "%s/metrics/%s/id", sysfs_dev_dir, uuid);
>> +
>> + if (stat(config_path, &sb) == 0) {
>> + if (!read_file_uint64(config_path, &config_id))
>> + return false;
>> +
>> + if (ioctl(drm_fd, DRM_IOCTL_I915_PERF_REMOVE_CONFIG, &config_id) == 0)
>> + return true;
> So you acknowledge the race condition with another process also doing
> the same test, or worse if they genuinely used that uuid for an actual
> config.
Thanks, I should randomize that.
>
>> + }
>> +
>> + memset(&config, 0, sizeof(config));
>> + memcpy(config.uuid, uuid, sizeof(config.uuid));
>> +
>> + config.n_mux_regs = 1;
>> + config.mux_regs_ptr = (uintptr_t) mux_regs;
>> +
>> + /* Create a new config */
>> + ret = ioctl(drm_fd, DRM_IOCTL_I915_PERF_ADD_CONFIG, &config);
>> + if (ret < 0)
>> + return false;
> A trick you may like to try is to create an invalid config that
> generates something other than EINVAL so that you can then distinguish
> with the non-existent ioctl cmd error. Since you reserved id=0 for
> invalid, a good choice would be
>
> static bool has_dyn_config() {
> uint64_t config_id = 0;
> return sys_ioctl(drm_fd, DRM_IOCTL_I915_PERF_REMOVE_CONFIG, &config_id) == -ENOENT;
> }
Thanks!
> -Chris
>
More information about the mesa-dev
mailing list