All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Nieto, David M" <David.Nieto@amd.com>
To: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>,
	"Intel-gfx@lists.freedesktop.org"
	<Intel-gfx@lists.freedesktop.org>
Cc: "Koenig, Christian" <Christian.Koenig@amd.com>,
	"dri-devel@lists.freedesktop.org"
	<dri-devel@lists.freedesktop.org>,
	Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Subject: Re: [RFC 7/7] drm/i915: Expose client engine utilisation via fdinfo
Date: Thu, 20 May 2021 16:26:33 +0000	[thread overview]
Message-ID: <BYAPR12MB28401B22CACDC249926C0A19F42A9@BYAPR12MB2840.namprd12.prod.outlook.com> (raw)
In-Reply-To: <20210520151254.959958-8-tvrtko.ursulin@linux.intel.com>

[-- Attachment #1: Type: text/plain, Size: 6533 bytes --]

[AMD Official Use Only]

i would like to add a unit marker for the stats that we monitor in the fd, as we discussed currently we are displaying the usage percentage, because we wanted to to provide single query percentages, but this may evolve with time.

May I suggest to add two new fields

drm-stat-interval: <64 bit> ns
drm-stat-timestamp: <64 bit> ns

If interval is set, engine utilization is calculated by doing <perc render> = 100*<drm_engine_render>/<drm_stat_interval>
if interval is not set, two reads are needed : <perc render> = 100*<drm_engine_render1 - drm_engine_render0> / <drm-stat-timestamp1 - drm-stat-timestamp0>


Regards,

David


________________________________
From: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
Sent: Thursday, May 20, 2021 8:12 AM
To: Intel-gfx@lists.freedesktop.org <Intel-gfx@lists.freedesktop.org>
Cc: dri-devel@lists.freedesktop.org <dri-devel@lists.freedesktop.org>; Tvrtko Ursulin <tvrtko.ursulin@intel.com>; Nieto, David M <David.Nieto@amd.com>; Koenig, Christian <Christian.Koenig@amd.com>; Daniel Vetter <daniel@ffwll.ch>
Subject: [RFC 7/7] drm/i915: Expose client engine utilisation via fdinfo

From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>

Similar to AMD commit
874442541133 ("drm/amdgpu: Add show_fdinfo() interface"), using the
infrastructure added in previous patches, we add basic client info
and GPU engine utilisation for i915.

Example of the output:

  pos:    0
  flags:  0100002
  mnt_id: 21
  drm-driver: i915
  drm-pdev:   0000:00:02.0
  drm-client-id:      7
  drm-engine-render:  9288864723 ns
  drm-engine-copy:    2035071108 ns
  drm-engine-video:   0 ns
  drm-engine-video-enhance:   0 ns

DRM related fields are appropriately prefixed for easy parsing and
separation from generic fdinfo fields.

Idea is for some fields to become either fully or partially standardised
in order to enable writting of generic top-like tools.

Initial proposal for fully standardised common fields:

 drm-driver: <str>
 drm-pdev: <aaaa:bb.cc.d>

Optional fully standardised:

 drm-client-id: <uint>

Optional partially standardised:

 engine-<str>: <u64> ns
 memory-<str>: <u64> KiB

Once agreed the format would need to go to some README or kerneldoc in
DRM core.

Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Cc: David M Nieto <David.Nieto@amd.com>
Cc: Christian König <christian.koenig@amd.com>
Cc: Daniel Vetter <daniel@ffwll.ch>
---
 drivers/gpu/drm/i915/i915_drm_client.c | 68 ++++++++++++++++++++++++++
 drivers/gpu/drm/i915/i915_drm_client.h |  4 ++
 drivers/gpu/drm/i915/i915_drv.c        |  3 ++
 3 files changed, 75 insertions(+)

diff --git a/drivers/gpu/drm/i915/i915_drm_client.c b/drivers/gpu/drm/i915/i915_drm_client.c
index 1e5db7753276..5e9cfba1116b 100644
--- a/drivers/gpu/drm/i915/i915_drm_client.c
+++ b/drivers/gpu/drm/i915/i915_drm_client.c
@@ -9,6 +9,11 @@

 #include <drm/drm_print.h>

+#include <uapi/drm/i915_drm.h>
+
+#include "gem/i915_gem_context.h"
+#include "gt/intel_engine_user.h"
+
 #include "i915_drm_client.h"
 #include "i915_drv.h"
 #include "i915_gem.h"
@@ -168,3 +173,66 @@ void i915_drm_clients_fini(struct i915_drm_clients *clients)

         xa_destroy(&clients->xarray);
 }
+
+#ifdef CONFIG_PROC_FS
+static const char * const uabi_class_names[] = {
+       [I915_ENGINE_CLASS_RENDER] = "render",
+       [I915_ENGINE_CLASS_COPY] = "copy",
+       [I915_ENGINE_CLASS_VIDEO] = "video",
+       [I915_ENGINE_CLASS_VIDEO_ENHANCE] = "video-enhance",
+};
+
+static u64 busy_add(struct i915_gem_context *ctx, unsigned int class)
+{
+       struct i915_gem_engines_iter it;
+       struct intel_context *ce;
+       u64 total = 0;
+
+       for_each_gem_engine(ce, rcu_dereference(ctx->engines), it) {
+               if (ce->engine->uabi_class != class)
+                       continue;
+
+               total += intel_context_get_total_runtime_ns(ce);
+       }
+
+       return total;
+}
+
+static void
+show_client_class(struct seq_file *m,
+                 struct i915_drm_client *client,
+                 unsigned int class)
+{
+       const struct list_head *list = &client->ctx_list;
+       u64 total = atomic64_read(&client->past_runtime[class]);
+       struct i915_gem_context *ctx;
+
+       rcu_read_lock();
+       list_for_each_entry_rcu(ctx, list, client_link)
+               total += busy_add(ctx, class);
+       rcu_read_unlock();
+
+       return seq_printf(m, "drm-engine-%s:\t%llu ns\n",
+                         uabi_class_names[class], total);
+}
+
+void i915_drm_client_fdinfo(struct seq_file *m, struct file *f)
+{
+       struct drm_file *file = f->private_data;
+       struct drm_i915_file_private *file_priv = file->driver_priv;
+       struct drm_i915_private *i915 = file_priv->dev_priv;
+       struct i915_drm_client *client = file_priv->client;
+       struct pci_dev *pdev = to_pci_dev(i915->drm.dev);
+       unsigned int i;
+
+       seq_printf(m, "drm-driver:\ti915\n");
+       seq_printf(m, "drm-pdev:\t%04x:%02x:%02x.%d\n",
+                  pci_domain_nr(pdev->bus), pdev->bus->number,
+                  PCI_SLOT(pdev->devfn), PCI_FUNC(pdev->devfn));
+
+       seq_printf(m, "drm-client-id:\t%u\n", client->id);
+
+       for (i = 0; i < ARRAY_SIZE(uabi_class_names); i++)
+               show_client_class(m, client, i);
+}
+#endif
diff --git a/drivers/gpu/drm/i915/i915_drm_client.h b/drivers/gpu/drm/i915/i915_drm_client.h
index b2b69d6985e4..9885002433a0 100644
--- a/drivers/gpu/drm/i915/i915_drm_client.h
+++ b/drivers/gpu/drm/i915/i915_drm_client.h
@@ -98,6 +98,10 @@ i915_drm_client_pid(const struct i915_drm_client *client)
         return __i915_drm_client_name(client)->pid;
 }

+#ifdef CONFIG_PROC_FS
+void i915_drm_client_fdinfo(struct seq_file *m, struct file *f);
+#endif
+
 void i915_drm_clients_fini(struct i915_drm_clients *clients);

 #endif /* !__I915_DRM_CLIENT_H__ */
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
index 33eb7b52b58b..6b63fe4b3c26 100644
--- a/drivers/gpu/drm/i915/i915_drv.c
+++ b/drivers/gpu/drm/i915/i915_drv.c
@@ -1694,6 +1694,9 @@ static const struct file_operations i915_driver_fops = {
         .read = drm_read,
         .compat_ioctl = i915_ioc32_compat_ioctl,
         .llseek = noop_llseek,
+#ifdef CONFIG_PROC_FS
+       .show_fdinfo = i915_drm_client_fdinfo,
+#endif
 };

 static int
--
2.30.2


[-- Attachment #2: Type: text/html, Size: 12939 bytes --]

WARNING: multiple messages have this Message-ID (diff)
From: "Nieto, David M" <David.Nieto@amd.com>
To: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>,
	"Intel-gfx@lists.freedesktop.org"
	<Intel-gfx@lists.freedesktop.org>
Cc: "Koenig, Christian" <Christian.Koenig@amd.com>,
	"dri-devel@lists.freedesktop.org"
	<dri-devel@lists.freedesktop.org>
Subject: Re: [Intel-gfx] [RFC 7/7] drm/i915: Expose client engine utilisation via fdinfo
Date: Thu, 20 May 2021 16:26:33 +0000	[thread overview]
Message-ID: <BYAPR12MB28401B22CACDC249926C0A19F42A9@BYAPR12MB2840.namprd12.prod.outlook.com> (raw)
In-Reply-To: <20210520151254.959958-8-tvrtko.ursulin@linux.intel.com>


[-- Attachment #1.1: Type: text/plain, Size: 6533 bytes --]

[AMD Official Use Only]

i would like to add a unit marker for the stats that we monitor in the fd, as we discussed currently we are displaying the usage percentage, because we wanted to to provide single query percentages, but this may evolve with time.

May I suggest to add two new fields

drm-stat-interval: <64 bit> ns
drm-stat-timestamp: <64 bit> ns

If interval is set, engine utilization is calculated by doing <perc render> = 100*<drm_engine_render>/<drm_stat_interval>
if interval is not set, two reads are needed : <perc render> = 100*<drm_engine_render1 - drm_engine_render0> / <drm-stat-timestamp1 - drm-stat-timestamp0>


Regards,

David


________________________________
From: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
Sent: Thursday, May 20, 2021 8:12 AM
To: Intel-gfx@lists.freedesktop.org <Intel-gfx@lists.freedesktop.org>
Cc: dri-devel@lists.freedesktop.org <dri-devel@lists.freedesktop.org>; Tvrtko Ursulin <tvrtko.ursulin@intel.com>; Nieto, David M <David.Nieto@amd.com>; Koenig, Christian <Christian.Koenig@amd.com>; Daniel Vetter <daniel@ffwll.ch>
Subject: [RFC 7/7] drm/i915: Expose client engine utilisation via fdinfo

From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>

Similar to AMD commit
874442541133 ("drm/amdgpu: Add show_fdinfo() interface"), using the
infrastructure added in previous patches, we add basic client info
and GPU engine utilisation for i915.

Example of the output:

  pos:    0
  flags:  0100002
  mnt_id: 21
  drm-driver: i915
  drm-pdev:   0000:00:02.0
  drm-client-id:      7
  drm-engine-render:  9288864723 ns
  drm-engine-copy:    2035071108 ns
  drm-engine-video:   0 ns
  drm-engine-video-enhance:   0 ns

DRM related fields are appropriately prefixed for easy parsing and
separation from generic fdinfo fields.

Idea is for some fields to become either fully or partially standardised
in order to enable writting of generic top-like tools.

Initial proposal for fully standardised common fields:

 drm-driver: <str>
 drm-pdev: <aaaa:bb.cc.d>

Optional fully standardised:

 drm-client-id: <uint>

Optional partially standardised:

 engine-<str>: <u64> ns
 memory-<str>: <u64> KiB

Once agreed the format would need to go to some README or kerneldoc in
DRM core.

Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Cc: David M Nieto <David.Nieto@amd.com>
Cc: Christian König <christian.koenig@amd.com>
Cc: Daniel Vetter <daniel@ffwll.ch>
---
 drivers/gpu/drm/i915/i915_drm_client.c | 68 ++++++++++++++++++++++++++
 drivers/gpu/drm/i915/i915_drm_client.h |  4 ++
 drivers/gpu/drm/i915/i915_drv.c        |  3 ++
 3 files changed, 75 insertions(+)

diff --git a/drivers/gpu/drm/i915/i915_drm_client.c b/drivers/gpu/drm/i915/i915_drm_client.c
index 1e5db7753276..5e9cfba1116b 100644
--- a/drivers/gpu/drm/i915/i915_drm_client.c
+++ b/drivers/gpu/drm/i915/i915_drm_client.c
@@ -9,6 +9,11 @@

 #include <drm/drm_print.h>

+#include <uapi/drm/i915_drm.h>
+
+#include "gem/i915_gem_context.h"
+#include "gt/intel_engine_user.h"
+
 #include "i915_drm_client.h"
 #include "i915_drv.h"
 #include "i915_gem.h"
@@ -168,3 +173,66 @@ void i915_drm_clients_fini(struct i915_drm_clients *clients)

         xa_destroy(&clients->xarray);
 }
+
+#ifdef CONFIG_PROC_FS
+static const char * const uabi_class_names[] = {
+       [I915_ENGINE_CLASS_RENDER] = "render",
+       [I915_ENGINE_CLASS_COPY] = "copy",
+       [I915_ENGINE_CLASS_VIDEO] = "video",
+       [I915_ENGINE_CLASS_VIDEO_ENHANCE] = "video-enhance",
+};
+
+static u64 busy_add(struct i915_gem_context *ctx, unsigned int class)
+{
+       struct i915_gem_engines_iter it;
+       struct intel_context *ce;
+       u64 total = 0;
+
+       for_each_gem_engine(ce, rcu_dereference(ctx->engines), it) {
+               if (ce->engine->uabi_class != class)
+                       continue;
+
+               total += intel_context_get_total_runtime_ns(ce);
+       }
+
+       return total;
+}
+
+static void
+show_client_class(struct seq_file *m,
+                 struct i915_drm_client *client,
+                 unsigned int class)
+{
+       const struct list_head *list = &client->ctx_list;
+       u64 total = atomic64_read(&client->past_runtime[class]);
+       struct i915_gem_context *ctx;
+
+       rcu_read_lock();
+       list_for_each_entry_rcu(ctx, list, client_link)
+               total += busy_add(ctx, class);
+       rcu_read_unlock();
+
+       return seq_printf(m, "drm-engine-%s:\t%llu ns\n",
+                         uabi_class_names[class], total);
+}
+
+void i915_drm_client_fdinfo(struct seq_file *m, struct file *f)
+{
+       struct drm_file *file = f->private_data;
+       struct drm_i915_file_private *file_priv = file->driver_priv;
+       struct drm_i915_private *i915 = file_priv->dev_priv;
+       struct i915_drm_client *client = file_priv->client;
+       struct pci_dev *pdev = to_pci_dev(i915->drm.dev);
+       unsigned int i;
+
+       seq_printf(m, "drm-driver:\ti915\n");
+       seq_printf(m, "drm-pdev:\t%04x:%02x:%02x.%d\n",
+                  pci_domain_nr(pdev->bus), pdev->bus->number,
+                  PCI_SLOT(pdev->devfn), PCI_FUNC(pdev->devfn));
+
+       seq_printf(m, "drm-client-id:\t%u\n", client->id);
+
+       for (i = 0; i < ARRAY_SIZE(uabi_class_names); i++)
+               show_client_class(m, client, i);
+}
+#endif
diff --git a/drivers/gpu/drm/i915/i915_drm_client.h b/drivers/gpu/drm/i915/i915_drm_client.h
index b2b69d6985e4..9885002433a0 100644
--- a/drivers/gpu/drm/i915/i915_drm_client.h
+++ b/drivers/gpu/drm/i915/i915_drm_client.h
@@ -98,6 +98,10 @@ i915_drm_client_pid(const struct i915_drm_client *client)
         return __i915_drm_client_name(client)->pid;
 }

+#ifdef CONFIG_PROC_FS
+void i915_drm_client_fdinfo(struct seq_file *m, struct file *f);
+#endif
+
 void i915_drm_clients_fini(struct i915_drm_clients *clients);

 #endif /* !__I915_DRM_CLIENT_H__ */
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
index 33eb7b52b58b..6b63fe4b3c26 100644
--- a/drivers/gpu/drm/i915/i915_drv.c
+++ b/drivers/gpu/drm/i915/i915_drv.c
@@ -1694,6 +1694,9 @@ static const struct file_operations i915_driver_fops = {
         .read = drm_read,
         .compat_ioctl = i915_ioc32_compat_ioctl,
         .llseek = noop_llseek,
+#ifdef CONFIG_PROC_FS
+       .show_fdinfo = i915_drm_client_fdinfo,
+#endif
 };

 static int
--
2.30.2


[-- Attachment #1.2: Type: text/html, Size: 12939 bytes --]

[-- Attachment #2: Type: text/plain, Size: 160 bytes --]

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

  reply	other threads:[~2021-05-20 16:26 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-05-20 15:12 [RFC 0/7] Per client engine busyness Tvrtko Ursulin
2021-05-20 15:12 ` [Intel-gfx] " Tvrtko Ursulin
2021-05-20 15:12 ` [RFC 1/7] drm/i915: Explicitly track DRM clients Tvrtko Ursulin
2021-05-20 15:12   ` [Intel-gfx] " Tvrtko Ursulin
2021-05-20 15:12 ` [RFC 2/7] drm/i915: Update client name on context create Tvrtko Ursulin
2021-05-20 15:12   ` [Intel-gfx] " Tvrtko Ursulin
2021-05-20 15:12 ` [RFC 3/7] drm/i915: Make GEM contexts track DRM clients Tvrtko Ursulin
2021-05-20 15:12   ` [Intel-gfx] " Tvrtko Ursulin
2021-05-20 15:12 ` [RFC 4/7] drm/i915: Track runtime spent in closed and unreachable GEM contexts Tvrtko Ursulin
2021-05-20 15:12   ` [Intel-gfx] " Tvrtko Ursulin
2021-05-20 15:12 ` [RFC 5/7] drm/i915: Track all user contexts per client Tvrtko Ursulin
2021-05-20 15:12   ` [Intel-gfx] " Tvrtko Ursulin
2021-05-20 15:12 ` [RFC 6/7] drm/i915: Track context current active time Tvrtko Ursulin
2021-05-20 15:12   ` [Intel-gfx] " Tvrtko Ursulin
2021-05-20 15:12 ` [RFC 7/7] drm/i915: Expose client engine utilisation via fdinfo Tvrtko Ursulin
2021-05-20 15:12   ` [Intel-gfx] " Tvrtko Ursulin
2021-05-20 16:26   ` Nieto, David M [this message]
2021-05-20 16:26     ` Nieto, David M
2021-05-20 16:31     ` Christian König
2021-05-20 16:31       ` [Intel-gfx] " Christian König
2021-05-20 17:47       ` Daniel Vetter
2021-05-20 17:47         ` [Intel-gfx] " Daniel Vetter
2021-05-21 12:26         ` Tvrtko Ursulin
2021-05-21 12:26           ` [Intel-gfx] " Tvrtko Ursulin
2021-05-21 12:32           ` Christian König
2021-05-21 12:32             ` [Intel-gfx] " Christian König
2021-05-20 15:55 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for Per client engine busyness Patchwork
2021-05-20 15:56 ` [Intel-gfx] ✗ Fi.CI.SPARSE: " Patchwork
2021-05-20 16:26 ` [Intel-gfx] ✓ Fi.CI.BAT: success " Patchwork
2021-05-22  0:22 ` [Intel-gfx] ✗ Fi.CI.IGT: failure " Patchwork

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=BYAPR12MB28401B22CACDC249926C0A19F42A9@BYAPR12MB2840.namprd12.prod.outlook.com \
    --to=david.nieto@amd.com \
    --cc=Christian.Koenig@amd.com \
    --cc=Intel-gfx@lists.freedesktop.org \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=tvrtko.ursulin@intel.com \
    --cc=tvrtko.ursulin@linux.intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.