[Mesa-dev] [PATCH 03/11] i965: perf: store sysfs device entry into context

Jason Ekstrand jason at jlekstrand.net
Thu Mar 8 22:36:02 UTC 2018


On Thu, Mar 8, 2018 at 7:42 AM, Lionel Landwerlin <
lionel.g.landwerlin at intel.com> wrote:

> We want to reuse it later on.
>
> Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
> ---
>  src/mesa/drivers/dri/i965/brw_context.h           |   3 +
>  src/mesa/drivers/dri/i965/brw_performance_query.c | 146
> +++++++++++-----------
>  2 files changed, 73 insertions(+), 76 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_context.h
> b/src/mesa/drivers/dri/i965/brw_context.h
> index d6e3c7807f7..d3e7c71207b 100644
> --- a/src/mesa/drivers/dri/i965/brw_context.h
> +++ b/src/mesa/drivers/dri/i965/brw_context.h
> @@ -1189,6 +1189,9 @@ struct brw_context
>         */
>        struct hash_table *oa_metrics_table;
>
> +      /* Location of the device's sysfs entry. */
> +      char sysfs_dev_dir[256];
> +
>        struct brw_perf_query_info *queries;
>        int n_queries;
>
> diff --git a/src/mesa/drivers/dri/i965/brw_performance_query.c
> b/src/mesa/drivers/dri/i965/brw_performance_query.c
> index 622c2d2d950..a084b30fe7c 100644
> --- a/src/mesa/drivers/dri/i965/brw_performance_query.c
> +++ b/src/mesa/drivers/dri/i965/brw_performance_query.c
> @@ -318,6 +318,47 @@ brw_perf_query(struct gl_perf_query_object *o)
>
>  /***********************************************************
> *******************/
>
> +static bool
> +read_file_uint64(const char *file, uint64_t *val)
> +{
> +    char buf[32];
> +    int fd, n;
> +
> +    fd = open(file, 0);
> +    if (fd < 0)
> +       return false;
> +    while ((n = read(fd, buf, sizeof (buf) - 1)) < 0 &&
> +           errno == EINTR);
> +    close(fd);
> +    if (n < 0)
> +       return false;
> +
> +    buf[n] = '\0';
> +    *val = strtoull(buf, NULL, 0);
> +
> +    return true;
> +}
> +
> +static bool
> +read_sysfs_drm_device_file_uint64(struct brw_context *brw,
> +                                  const char *file,
> +                                  uint64_t *value)
> +{
> +   char buf[512];
> +   int len;
> +
> +   len = snprintf(buf, sizeof(buf), "%s/%s",
> +                  brw->perfquery.sysfs_dev_dir, file);
> +   if (len < 0 || len >= sizeof(buf)) {
> +      DBG("Failed to concatenate sys filename to read u64 from\n");
> +      return false;
> +   }
> +
> +   return read_file_uint64(buf, value);
> +}
> +
> +/**********************************************************
> ********************/
> +
>  static bool
>  brw_is_perf_query_ready(struct gl_context *ctx,
>                          struct gl_perf_query_object *o);
> @@ -1746,27 +1787,6 @@ init_pipeline_statistic_query_registers(struct
> brw_context *brw)
>     query->data_size = sizeof(uint64_t) * query->n_counters;
>  }
>
> -static bool
> -read_file_uint64(const char *file, uint64_t *val)
> -{
> -    char buf[32];
> -    int fd, n;
> -
> -    fd = open(file, 0);
> -    if (fd < 0)
> -       return false;
> -    while ((n = read(fd, buf, sizeof (buf) - 1)) < 0 &&
> -           errno == EINTR);
> -    close(fd);
> -    if (n < 0)
> -       return false;
> -
> -    buf[n] = '\0';
> -    *val = strtoull(buf, NULL, 0);
> -
> -    return true;
> -}
> -
>  static void
>  register_oa_config(struct brw_context *brw,
>                     const struct brw_perf_query_info *query,
> @@ -1780,14 +1800,14 @@ register_oa_config(struct brw_context *brw,
>  }
>
>  static void
> -enumerate_sysfs_metrics(struct brw_context *brw, const char
> *sysfs_dev_dir)
> +enumerate_sysfs_metrics(struct brw_context *brw)
>  {
>     char buf[256];
>     DIR *metricsdir = NULL;
>     struct dirent *metric_entry;
>     int len;
>
> -   len = snprintf(buf, sizeof(buf), "%s/metrics", sysfs_dev_dir);
> +   len = snprintf(buf, sizeof(buf), "%s/metrics",
> brw->perfquery.sysfs_dev_dir);
>     if (len < 0 || len >= sizeof(buf)) {
>        DBG("Failed to concatenate path to sysfs metrics/ directory\n");
>        return;
> @@ -1814,7 +1834,7 @@ enumerate_sysfs_metrics(struct brw_context *brw,
> const char *sysfs_dev_dir)
>           uint64_t id;
>
>           len = snprintf(buf, sizeof(buf), "%s/metrics/%s/id",
> -                        sysfs_dev_dir, metric_entry->d_name);
> +                        brw->perfquery.sysfs_dev_dir,
> metric_entry->d_name);
>           if (len < 0 || len >= sizeof(buf)) {
>              DBG("Failed to concatenate path to sysfs metric id file\n");
>              continue;
> @@ -1834,37 +1854,18 @@ enumerate_sysfs_metrics(struct brw_context *brw,
> const char *sysfs_dev_dir)
>  }
>
>  static bool
> -read_sysfs_drm_device_file_uint64(struct brw_context *brw,
> -                                  const char *sysfs_dev_dir,
> -                                  const char *file,
> -                                  uint64_t *value)
> -{
> -   char buf[512];
> -   int len;
> -
> -   len = snprintf(buf, sizeof(buf), "%s/%s", sysfs_dev_dir, file);
> -   if (len < 0 || len >= sizeof(buf)) {
> -      DBG("Failed to concatenate sys filename to read u64 from\n");
> -      return false;
> -   }
> -
> -   return read_file_uint64(buf, value);
> -}
> -
> -static bool
> -kernel_has_dynamic_config_support(struct brw_context *brw,
> -                                  const char *sysfs_dev_dir)
> +kernel_has_dynamic_config_support(struct brw_context *brw)
>  {
>     __DRIscreen *screen = brw->screen->driScrnPriv;
>     struct hash_entry *entry;
>
>     hash_table_foreach(brw->perfquery.oa_metrics_table, entry) {
>        struct brw_perf_query_info *query = entry->data;
> -      char config_path[256];
> +      char config_path[280];
>

What's with the bump?


>        uint64_t config_id;
>
> -      snprintf(config_path, sizeof(config_path),
> -               "%s/metrics/%s/id", sysfs_dev_dir, query->guid);
> +      snprintf(config_path, sizeof(config_path), "%s/metrics/%s/id",
> +               brw->perfquery.sysfs_dev_dir, query->guid);
>
>        /* Look for the test config, which we know we can't replace. */
>        if (read_file_uint64(config_path, &config_id) && config_id == 1) {
> @@ -1877,7 +1878,7 @@ kernel_has_dynamic_config_support(struct
> brw_context *brw,
>  }
>
>  static void
> -init_oa_configs(struct brw_context *brw, const char *sysfs_dev_dir)
> +init_oa_configs(struct brw_context *brw)
>  {
>     __DRIscreen *screen = brw->screen->driScrnPriv;
>     struct hash_entry *entry;
> @@ -1885,12 +1886,12 @@ init_oa_configs(struct brw_context *brw, const
> char *sysfs_dev_dir)
>     hash_table_foreach(brw->perfquery.oa_metrics_table, entry) {
>        const struct brw_perf_query_info *query = entry->data;
>        struct drm_i915_perf_oa_config config;
> -      char config_path[256];
> +      char config_path[280];
>

Here too


>        uint64_t config_id;
>        int ret;
>
> -      snprintf(config_path, sizeof(config_path),
> -               "%s/metrics/%s/id", sysfs_dev_dir, query->guid);
> +      snprintf(config_path, sizeof(config_path), "%s/metrics/%s/id",
> +               brw->perfquery.sysfs_dev_dir, query->guid);
>
>        /* Don't recreate already loaded configs. */
>        if (read_file_uint64(config_path, &config_id)) {
> @@ -1925,20 +1926,16 @@ init_oa_configs(struct brw_context *brw, const
> char *sysfs_dev_dir)
>  }
>
>  static bool
> -init_oa_sys_vars(struct brw_context *brw, const char *sysfs_dev_dir)
> +init_oa_sys_vars(struct brw_context *brw)
>  {
>     const struct gen_device_info *devinfo = &brw->screen->devinfo;
>     uint64_t min_freq_mhz = 0, max_freq_mhz = 0;
>     __DRIscreen *screen = brw->screen->driScrnPriv;
>
> -   if (!read_sysfs_drm_device_file_uint64(brw, sysfs_dev_dir,
> -                                          "gt_min_freq_mhz",
> -                                          &min_freq_mhz))
> +   if (!read_sysfs_drm_device_file_uint64(brw, "gt_min_freq_mhz",
> &min_freq_mhz))
>        return false;
>
> -   if (!read_sysfs_drm_device_file_uint64(brw, sysfs_dev_dir,
> -                                          "gt_max_freq_mhz",
> -                                          &max_freq_mhz))
> +   if (!read_sysfs_drm_device_file_uint64(brw,  "gt_max_freq_mhz",
> &max_freq_mhz))
>        return false;
>
>     brw->perfquery.sys_vars.gt_min_freq = min_freq_mhz * 1000000;
> @@ -2023,9 +2020,7 @@ init_oa_sys_vars(struct brw_context *brw, const char
> *sysfs_dev_dir)
>  }
>
>  static bool
> -get_sysfs_dev_dir(struct brw_context *brw,
> -                  char *path_buf,
> -                  int path_buf_len)
> +get_sysfs_dev_dir(struct brw_context *brw)
>  {
>     __DRIscreen *screen = brw->screen->driScrnPriv;
>     struct stat sb;
> @@ -2034,9 +2029,7 @@ get_sysfs_dev_dir(struct brw_context *brw,
>     struct dirent *drm_entry;
>     int len;
>
> -   assert(path_buf);
> -   assert(path_buf_len);
> -   path_buf[0] = '\0';
> +   brw->perfquery.sysfs_dev_dir[0] = '\0';
>
>     if (fstat(screen->fd, &sb)) {
>        DBG("Failed to stat DRM fd\n");
> @@ -2051,16 +2044,17 @@ get_sysfs_dev_dir(struct brw_context *brw,
>        return false;
>     }
>
> -   len = snprintf(path_buf, path_buf_len,
> +   len = snprintf(brw->perfquery.sysfs_dev_dir,
> +                  sizeof(brw->perfquery.sysfs_dev_dir),
>                    "/sys/dev/char/%d:%d/device/drm", maj, min);
> -   if (len < 0 || len >= path_buf_len) {
> +   if (len < 0 || len >= sizeof(brw->perfquery.sysfs_dev_dir)) {
>        DBG("Failed to concatenate sysfs path to drm device\n");
>        return false;
>     }
>
> -   drmdir = opendir(path_buf);
> +   drmdir = opendir(brw->perfquery.sysfs_dev_dir);
>     if (!drmdir) {
> -      DBG("Failed to open %s: %m\n", path_buf);
> +      DBG("Failed to open %s: %m\n", brw->perfquery.sysfs_dev_dir);
>        return false;
>     }
>
> @@ -2069,11 +2063,12 @@ get_sysfs_dev_dir(struct brw_context *brw,
>             drm_entry->d_type == DT_LNK) &&
>            strncmp(drm_entry->d_name, "card", 4) == 0)
>        {
> -         len = snprintf(path_buf, path_buf_len,
> +         len = snprintf(brw->perfquery.sysfs_dev_dir,
> +                        sizeof(brw->perfquery.sysfs_dev_dir),
>                          "/sys/dev/char/%d:%d/device/drm/%s",
>                          maj, min, drm_entry->d_name);
>           closedir(drmdir);
> -         if (len < 0 || len >= path_buf_len)
> +         if (len < 0 || len >= sizeof(brw->perfquery.sysfs_dev_dir))
>              return false;
>           else
>              return true;
> @@ -2134,7 +2129,6 @@ brw_init_perf_query_info(struct gl_context *ctx)
>     const struct gen_device_info *devinfo = &brw->screen->devinfo;
>     bool i915_perf_oa_available = false;
>     struct stat sb;
> -   char sysfs_dev_dir[128];
>     perf_register_oa_queries_t oa_register;
>
>     if (brw->perfquery.n_queries)
> @@ -2166,8 +2160,8 @@ brw_init_perf_query_info(struct gl_context *ctx)
>
>     if (i915_perf_oa_available &&
>         oa_register &&
> -       get_sysfs_dev_dir(brw, sysfs_dev_dir, sizeof(sysfs_dev_dir)) &&
> -       init_oa_sys_vars(brw, sysfs_dev_dir))
> +       get_sysfs_dev_dir(brw) &&
> +       init_oa_sys_vars(brw))
>     {
>        brw->perfquery.oa_metrics_table =
>           _mesa_hash_table_create(NULL, _mesa_key_hash_string,
> @@ -2179,10 +2173,10 @@ brw_init_perf_query_info(struct gl_context *ctx)
>        oa_register(brw);
>
>        if (likely((INTEL_DEBUG & DEBUG_NO_OACONFIG) == 0) &&
> -          kernel_has_dynamic_config_support(brw, sysfs_dev_dir))
> -         init_oa_configs(brw, sysfs_dev_dir);
> +          kernel_has_dynamic_config_support(brw))
> +         init_oa_configs(brw);
>        else
> -         enumerate_sysfs_metrics(brw, sysfs_dev_dir);
> +         enumerate_sysfs_metrics(brw);
>     }
>
>     brw->perfquery.unaccumulated =
> --
> 2.16.2
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20180308/9d1d32b2/attachment-0001.html>


More information about the mesa-dev mailing list