diff mbox series

[i-g-t,2/2] intel_gpu_top: Add option to sort by PID

Message ID 20210203114456.895974-2-tvrtko.ursulin@linux.intel.com (mailing list archive)
State New, archived
Headers show
Series [i-g-t,1/2] intel_gpu_top: Show banner messages when cycling sort modes | expand

Commit Message

Tvrtko Ursulin Feb. 3, 2021, 11:44 a.m. UTC
From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>

Useful to mimick top view.

Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
---
 man/intel_gpu_top.rst |  2 +-
 tools/intel_gpu_top.c | 46 +++++++++++++++++++++++++++++++------------
 2 files changed, 34 insertions(+), 14 deletions(-)

Comments

Chris Wilson Feb. 3, 2021, 11:50 a.m. UTC | #1
Quoting Tvrtko Ursulin (2021-02-03 11:44:56)
> From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
> 
> Useful to mimick top view.
> 
> Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
> ---
>  man/intel_gpu_top.rst |  2 +-
>  tools/intel_gpu_top.c | 46 +++++++++++++++++++++++++++++++------------
>  2 files changed, 34 insertions(+), 14 deletions(-)
> 
> diff --git a/man/intel_gpu_top.rst b/man/intel_gpu_top.rst
> index 118d8b953a70..b145d85c0440 100644
> --- a/man/intel_gpu_top.rst
> +++ b/man/intel_gpu_top.rst
> @@ -56,7 +56,7 @@ Supported keys:
>      'q'    Exit from the tool.
>      '1'    Toggle between aggregated engine class and physical engine mode.
>      'n'    Toggle display of numeric client busyness overlay.
> -    's'    Toggle between sort modes (runtime, total runtime, client id).
> +    's'    Toggle between sort modes (runtime, total runtime, pid, client id).
>      'i'    Toggle display of clients which used no GPU time.
>  
>  DEVICE SELECTION
> diff --git a/tools/intel_gpu_top.c b/tools/intel_gpu_top.c
> index b409106f3718..24a87d2f4f3f 100644
> --- a/tools/intel_gpu_top.c
> +++ b/tools/intel_gpu_top.c
> @@ -959,6 +959,24 @@ static int client_id_cmp(const void *_a, const void *_b)
>         return (int)b->id - a->id;
>  }
>  
> +static int client_pid_cmp(const void *_a, const void *_b)
> +{
> +       const struct client *a = _a;
> +       const struct client *b = _b;
> +       int pid_a, pid_b;
> +
> +       pid_a = a->status == ALIVE ? a->pid : INT_MAX;
> +       pid_b = b->status == ALIVE ? b->pid : INT_MAX;
> +
> +       pid_b -= pid_a;
> +       if (pid_b > 0)
> +               return -1;
> +       if (pid_b < 0)
> +               return 1;
> +
> +       return (int)a->id - b->id;
> +}
> +
>  static int (*client_cmp)(const void *, const void *) = client_last_cmp;
>  
>  static void sort_clients(struct clients *clients)
> @@ -2149,21 +2167,23 @@ static void interactive_stdin(void)
>  
>  static void select_client_sort(void)
>  {
> +       struct {
> +               int (*cmp)(const void *, const void *);
> +               const char *msg;
> +       } cmp[] = {
> +               { client_last_cmp, "Sorting clients by current GPU usage." },
> +               { client_total_cmp, "Sorting clients by accummulated GPU usage." },
> +               { client_pid_cmp, "Sorting clients by pid." },
> +               { client_id_cmp, "Sorting clients by sysfs id." },
> +       };
>         static unsigned int client_sort;
>  
> -       switch (++client_sort % 3) {
> -       case 0:
> -               client_cmp = client_last_cmp;
> -               header_msg = "Sorting clients by current GPU usage.";
> -               break;
> -       case 1:
> -               client_cmp = client_total_cmp;
> -               header_msg = "Sorting clients by accummulated GPU usage.";
> -               break;
> -       case 2:
> -               client_cmp = client_id_cmp;
> -               header_msg = "Sorting clients by sysfs id.";
> -       }
> +       ++client_sort;
> +       if (client_sort >= ARRAY_SIZE(cmp))
> +               client_sort = 0;
> +
> +       client_cmp = cmp[client_sort].cmp;
> +       header_msg = cmp[client_sort].msg;
>  }

Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
-Chris
diff mbox series

Patch

diff --git a/man/intel_gpu_top.rst b/man/intel_gpu_top.rst
index 118d8b953a70..b145d85c0440 100644
--- a/man/intel_gpu_top.rst
+++ b/man/intel_gpu_top.rst
@@ -56,7 +56,7 @@  Supported keys:
     'q'    Exit from the tool.
     '1'    Toggle between aggregated engine class and physical engine mode.
     'n'    Toggle display of numeric client busyness overlay.
-    's'    Toggle between sort modes (runtime, total runtime, client id).
+    's'    Toggle between sort modes (runtime, total runtime, pid, client id).
     'i'    Toggle display of clients which used no GPU time.
 
 DEVICE SELECTION
diff --git a/tools/intel_gpu_top.c b/tools/intel_gpu_top.c
index b409106f3718..24a87d2f4f3f 100644
--- a/tools/intel_gpu_top.c
+++ b/tools/intel_gpu_top.c
@@ -959,6 +959,24 @@  static int client_id_cmp(const void *_a, const void *_b)
 	return (int)b->id - a->id;
 }
 
+static int client_pid_cmp(const void *_a, const void *_b)
+{
+	const struct client *a = _a;
+	const struct client *b = _b;
+	int pid_a, pid_b;
+
+	pid_a = a->status == ALIVE ? a->pid : INT_MAX;
+	pid_b = b->status == ALIVE ? b->pid : INT_MAX;
+
+	pid_b -= pid_a;
+	if (pid_b > 0)
+		return -1;
+	if (pid_b < 0)
+		return 1;
+
+	return (int)a->id - b->id;
+}
+
 static int (*client_cmp)(const void *, const void *) = client_last_cmp;
 
 static void sort_clients(struct clients *clients)
@@ -2149,21 +2167,23 @@  static void interactive_stdin(void)
 
 static void select_client_sort(void)
 {
+	struct {
+		int (*cmp)(const void *, const void *);
+		const char *msg;
+	} cmp[] = {
+		{ client_last_cmp, "Sorting clients by current GPU usage." },
+		{ client_total_cmp, "Sorting clients by accummulated GPU usage." },
+		{ client_pid_cmp, "Sorting clients by pid." },
+		{ client_id_cmp, "Sorting clients by sysfs id." },
+	};
 	static unsigned int client_sort;
 
-	switch (++client_sort % 3) {
-	case 0:
-		client_cmp = client_last_cmp;
-		header_msg = "Sorting clients by current GPU usage.";
-		break;
-	case 1:
-		client_cmp = client_total_cmp;
-		header_msg = "Sorting clients by accummulated GPU usage.";
-		break;
-	case 2:
-		client_cmp = client_id_cmp;
-		header_msg = "Sorting clients by sysfs id.";
-	}
+	++client_sort;
+	if (client_sort >= ARRAY_SIZE(cmp))
+		client_sort = 0;
+
+	client_cmp = cmp[client_sort].cmp;
+	header_msg = cmp[client_sort].msg;
 }
 
 static void process_stdin(unsigned int timeout_us)