lkml.org 
[lkml]   [2022]   [Oct]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RFC 16/17] drm/i915: Wire up with drm controller GPU time query
    Date
    From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>

    Implement the drm_cgroup_ops->active_time_us callback.

    Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
    ---
    drivers/gpu/drm/i915/i915_driver.c | 1 +
    drivers/gpu/drm/i915/i915_drm_client.c | 106 +++++++++++++++++++------
    drivers/gpu/drm/i915/i915_drm_client.h | 2 +
    3 files changed, 83 insertions(+), 26 deletions(-)

    diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c
    index 7912782b87cc..b949fd715202 100644
    --- a/drivers/gpu/drm/i915/i915_driver.c
    +++ b/drivers/gpu/drm/i915/i915_driver.c
    @@ -1896,6 +1896,7 @@ static const struct drm_ioctl_desc i915_ioctls[] = {
    #ifdef CONFIG_CGROUP_DRM
    static const struct drm_cgroup_ops i915_drm_cgroup_ops = {
    .priority_levels = i915_drm_priority_levels,
    + .active_time_us = i915_drm_cgroup_get_active_time_us,
    };
    #endif

    diff --git a/drivers/gpu/drm/i915/i915_drm_client.c b/drivers/gpu/drm/i915/i915_drm_client.c
    index 61a3cdaa7b16..8527fe80d449 100644
    --- a/drivers/gpu/drm/i915/i915_drm_client.c
    +++ b/drivers/gpu/drm/i915/i915_drm_client.c
    @@ -75,23 +75,7 @@ void i915_drm_clients_fini(struct i915_drm_clients *clients)
    xa_destroy(&clients->xarray);
    }

    -#ifdef CONFIG_CGROUP_DRM
    -unsigned int i915_drm_priority_levels(struct drm_file *file)
    -{
    - struct drm_i915_file_private *fpriv = file->driver_priv;
    - struct i915_drm_client *client = fpriv->client;
    - struct drm_i915_private *i915 = client->clients->i915;
    -
    - if (GRAPHICS_VER(i915) < 8)
    - return 0;
    - else if (intel_uc_uses_guc_submission(&to_gt(i915)->uc))
    - return 3;
    - else
    - return 2047;
    -}
    -#endif
    -
    -#ifdef CONFIG_PROC_FS
    +#if defined(CONFIG_PROC_FS) || defined(CONFIG_CGROUP_DRM)
    static const char * const uabi_class_names[] = {
    [I915_ENGINE_CLASS_RENDER] = "render",
    [I915_ENGINE_CLASS_COPY] = "copy",
    @@ -116,22 +100,92 @@ static u64 busy_add(struct i915_gem_context *ctx, unsigned int class)
    return total;
    }

    -static void
    -show_client_class(struct seq_file *m,
    - struct i915_drm_client *client,
    - unsigned int class)
    +static u64 get_class_active_ns(struct i915_drm_client *client,
    + unsigned int class,
    + unsigned int *capacity)
    {
    - const struct list_head *list = &client->ctx_list;
    - u64 total = atomic64_read(&client->past_runtime[class]);
    - const unsigned int capacity =
    - client->clients->i915->engine_uabi_class_count[class];
    struct i915_gem_context *ctx;
    + u64 total;
    +
    + *capacity =
    + client->clients->i915->engine_uabi_class_count[class];
    + if (!*capacity)
    + return 0;
    +
    + total = atomic64_read(&client->past_runtime[class]);

    rcu_read_lock();
    - list_for_each_entry_rcu(ctx, list, client_link)
    + list_for_each_entry_rcu(ctx, &client->ctx_list, client_link)
    total += busy_add(ctx, class);
    rcu_read_unlock();

    + return total;
    +}
    +#endif
    +
    +#ifdef CONFIG_CGROUP_DRM
    +unsigned int i915_drm_priority_levels(struct drm_file *file)
    +{
    + struct drm_i915_file_private *fpriv = file->driver_priv;
    + struct i915_drm_client *client = fpriv->client;
    + struct drm_i915_private *i915 = client->clients->i915;
    +
    + if (GRAPHICS_VER(i915) < 8)
    + return 0;
    + else if (intel_uc_uses_guc_submission(&to_gt(i915)->uc))
    + return 3;
    + else
    + return 2047;
    +}
    +
    +static bool supports_stats(struct drm_i915_private *i915)
    +{
    + if (GRAPHICS_VER(i915) < 8)
    + return false;
    +
    + /* temporary... */
    + if (intel_uc_uses_guc_submission(&to_gt(i915)->uc))
    + return false;
    +
    + return true;
    +}
    +
    +u64 i915_drm_cgroup_get_active_time_us(struct drm_file *file)
    +{
    + struct drm_i915_file_private *fpriv = file->driver_priv;
    + struct i915_drm_client *client = fpriv->client;
    + unsigned int i;
    + u64 busy = 0;
    +
    + if (!supports_stats(client->clients->i915))
    + return 0;
    +
    + for (i = 0; i < ARRAY_SIZE(uabi_class_names); i++) {
    + unsigned int capacity;
    + u64 b;
    +
    + b = get_class_active_ns(client, i, &capacity);
    + if (capacity) {
    + b = DIV_ROUND_UP_ULL(b, capacity * 1000);
    + busy += b;
    + }
    + }
    +
    + return busy;
    +}
    +#endif
    +
    +#ifdef CONFIG_PROC_FS
    +static void
    +show_client_class(struct seq_file *m,
    + struct i915_drm_client *client,
    + unsigned int class)
    +{
    + unsigned int capacity;
    + u64 total;
    +
    + total = get_class_active_ns(client, class, &capacity);
    +
    if (capacity)
    seq_printf(m, "drm-engine-%s:\t%llu ns\n",
    uabi_class_names[class], total);
    diff --git a/drivers/gpu/drm/i915/i915_drm_client.h b/drivers/gpu/drm/i915/i915_drm_client.h
    index bd5925241007..99b8ae01c183 100644
    --- a/drivers/gpu/drm/i915/i915_drm_client.h
    +++ b/drivers/gpu/drm/i915/i915_drm_client.h
    @@ -69,4 +69,6 @@ void i915_drm_clients_fini(struct i915_drm_clients *clients);

    unsigned int i915_drm_priority_levels(struct drm_file *file);

    +u64 i915_drm_cgroup_get_active_time_us(struct drm_file *file);
    +
    #endif /* !__I915_DRM_CLIENT_H__ */
    --
    2.34.1
    \
     
     \ /
      Last update: 2022-10-19 19:36    [W:3.424 / U:0.280 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site