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.landwer...@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. > + } > + > + 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; } -Chris _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev