summaryrefslogtreecommitdiff
path: root/tools/intel_gpu_top.c
diff options
context:
space:
mode:
authorTvrtko Ursulin <tvrtko.ursulin@intel.com>2021-02-03 10:22:54 +0000
committerTvrtko Ursulin <tvrtko.ursulin@intel.com>2021-02-03 13:04:22 +0000
commit2b2b58f9a61c2ce38e425231b3caa59b75819c1f (patch)
tree531dab27016d55b0fbbe2198e17bd0f52db66517 /tools/intel_gpu_top.c
parent4581082c706498cc3afe20e89fc4836a3fc69105 (diff)
intel_gpu_top: Always sort the clients array after update
Walking the client "list" makes assumptions about the order of active and free slots which means we need to sort the array after every update. Patch is mostly just code movement with the only functional difference of eliminating two subsequent scans with no sort in between This closes a very short window there list iteration could get confused if sysfs clients would change rapidly and unfavourably during tool startup. Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com> Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'tools/intel_gpu_top.c')
-rw-r--r--tools/intel_gpu_top.c132
1 files changed, 66 insertions, 66 deletions
diff --git a/tools/intel_gpu_top.c b/tools/intel_gpu_top.c
index dffc6ebe..1ffdf5ee 100644
--- a/tools/intel_gpu_top.c
+++ b/tools/intel_gpu_top.c
@@ -899,71 +899,6 @@ read_client_sysfs(char *buf, int bufsize, const char *sysfs_root,
return __read_client_field(*client_root, field, buf, bufsize);
}
-static void scan_clients(struct clients *clients)
-{
- struct dirent *dent;
- struct client *c;
- unsigned int id;
- int tmp;
- DIR *d;
-
- if (!clients)
- return;
-
- for_each_client(clients, c, tmp) {
- assert(c->status != PROBE);
- if (c->status == ALIVE)
- c->status = PROBE;
- else
- break; /* Free block at the end of array. */
- }
-
- d = opendir(clients->sysfs_root);
- if (!d)
- return;
-
- while ((dent = readdir(d)) != NULL) {
- char name[24], pid[24];
- int ret, root = -1, *pr;
-
- if (dent->d_type != DT_DIR)
- continue;
- if (!isdigit(dent->d_name[0]))
- continue;
-
- id = atoi(dent->d_name);
-
- c = find_client(clients, PROBE, id);
-
- if (c)
- pr = &c->sysfs_root;
- else
- pr = &root;
-
- ret = read_client_sysfs(name, sizeof(name), clients->sysfs_root,
- id, "name", pr);
- ret |= read_client_sysfs(pid, sizeof(pid), clients->sysfs_root,
- id, "pid", pr);
- if (!ret) {
- if (!c)
- add_client(clients, id, atoi(pid), name, root);
- else
- update_client(c, atoi(pid), name);
- } else if (c) {
- c->status = PROBE; /* Will be deleted below. */
- }
- }
-
- closedir(d);
-
- for_each_client(clients, c, tmp) {
- if (c->status == PROBE)
- free_client(c);
- else if (c->status == FREE)
- break;
- }
-}
-
static int client_last_cmp(const void *_a, const void *_b)
{
const struct client *a = _a;
@@ -1060,6 +995,72 @@ static void sort_clients(struct clients *clients)
}
}
+static void scan_clients(struct clients *clients)
+{
+ struct dirent *dent;
+ struct client *c;
+ unsigned int id;
+ int tmp;
+ DIR *d;
+
+ if (!clients)
+ return;
+
+ for_each_client(clients, c, tmp) {
+ assert(c->status != PROBE);
+ if (c->status == ALIVE)
+ c->status = PROBE;
+ else
+ break; /* Free block at the end of array. */
+ }
+
+ d = opendir(clients->sysfs_root);
+ if (!d)
+ return;
+
+ while ((dent = readdir(d)) != NULL) {
+ char name[24], pid[24];
+ int ret, root = -1, *pr;
+
+ if (dent->d_type != DT_DIR)
+ continue;
+ if (!isdigit(dent->d_name[0]))
+ continue;
+
+ id = atoi(dent->d_name);
+
+ c = find_client(clients, PROBE, id);
+
+ if (c)
+ pr = &c->sysfs_root;
+ else
+ pr = &root;
+
+ ret = read_client_sysfs(name, sizeof(name), clients->sysfs_root,
+ id, "name", pr);
+ ret |= read_client_sysfs(pid, sizeof(pid), clients->sysfs_root,
+ id, "pid", pr);
+ if (!ret) {
+ if (!c)
+ add_client(clients, id, atoi(pid), name, root);
+ else
+ update_client(c, atoi(pid), name);
+ } else if (c) {
+ c->status = PROBE; /* Will be deleted below. */
+ }
+ }
+
+ closedir(d);
+
+ for_each_client(clients, c, tmp) {
+ if (c->status == PROBE)
+ free_client(c);
+ else if (c->status == FREE)
+ break;
+ }
+
+ sort_clients(clients);
+}
static const char *bars[] = { " ", "▏", "▎", "▍", "▌", "▋", "▊", "▉", "█" };
@@ -2305,7 +2306,6 @@ int main(int argc, char **argv)
t = (double)(engines->ts.cur - engines->ts.prev) / 1e9;
scan_clients(clients);
- sort_clients(clients);
if (stop_top)
break;