mirror of
https://github.com/tiagovignatti/intel-gpu-tools.git
synced 2025-06-13 02:46:23 +00:00
overlay: Count number of semaphores used by each process
This required me to contract the per-process information considerably, hopefully readability is not sacrificed too much. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
parent
1e65d5ac2f
commit
908df374a9
@ -249,6 +249,19 @@ static int flip_complete(struct gpu_perf *gp, const void *event)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int ring_sync(struct gpu_perf *gp, const void *event)
|
||||||
|
{
|
||||||
|
const struct sample_event *sample = event;
|
||||||
|
struct gpu_perf_comm *comm;
|
||||||
|
|
||||||
|
comm = lookup_comm(gp, sample->pid);
|
||||||
|
if (comm == NULL)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
comm->nr_sema++;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
static int wait_begin(struct gpu_perf *gp, const void *event)
|
static int wait_begin(struct gpu_perf *gp, const void *event)
|
||||||
{
|
{
|
||||||
const struct sample_event *sample = event;
|
const struct sample_event *sample = event;
|
||||||
@ -300,6 +313,7 @@ void gpu_perf_init(struct gpu_perf *gp, unsigned flags)
|
|||||||
if (perf_tracepoint_open(gp, "i915", "i915_gem_request_wait_begin", wait_begin) == 0)
|
if (perf_tracepoint_open(gp, "i915", "i915_gem_request_wait_begin", wait_begin) == 0)
|
||||||
perf_tracepoint_open(gp, "i915", "i915_gem_request_wait_end", wait_end);
|
perf_tracepoint_open(gp, "i915", "i915_gem_request_wait_end", wait_end);
|
||||||
perf_tracepoint_open(gp, "i915", "i915_flip_complete", flip_complete);
|
perf_tracepoint_open(gp, "i915", "i915_flip_complete", flip_complete);
|
||||||
|
perf_tracepoint_open(gp, "i915", "i915_gem_ring_sync_to", ring_sync);
|
||||||
|
|
||||||
if (gp->nr_events == 0) {
|
if (gp->nr_events == 0) {
|
||||||
gp->error = "i915.ko tracepoints not available";
|
gp->error = "i915.ko tracepoints not available";
|
||||||
|
@ -50,7 +50,7 @@ struct gpu_perf {
|
|||||||
void *user_data;
|
void *user_data;
|
||||||
|
|
||||||
uint64_t wait_time;
|
uint64_t wait_time;
|
||||||
uint64_t busy_time;
|
uint32_t nr_sema;
|
||||||
} *comm;
|
} *comm;
|
||||||
struct gpu_perf_time {
|
struct gpu_perf_time {
|
||||||
struct gpu_perf_time *next;
|
struct gpu_perf_time *next;
|
||||||
|
@ -282,9 +282,9 @@ static void show_gpu_perf(struct overlay_context *ctx, struct overlay_gpu_perf *
|
|||||||
};
|
};
|
||||||
struct gpu_perf_comm *comm, **prev;
|
struct gpu_perf_comm *comm, **prev;
|
||||||
const char *ring_name[] = {
|
const char *ring_name[] = {
|
||||||
"render",
|
"R",
|
||||||
"video",
|
"V",
|
||||||
"blt",
|
"B",
|
||||||
};
|
};
|
||||||
double range[2];
|
double range[2];
|
||||||
char buf[1024];
|
char buf[1024];
|
||||||
@ -361,7 +361,42 @@ static void show_gpu_perf(struct overlay_context *ctx, struct overlay_gpu_perf *
|
|||||||
cairo_fill(ctx->cr);
|
cairo_fill(ctx->cr);
|
||||||
|
|
||||||
for (prev = &gp->gpu_perf.comm; (comm = *prev) != NULL; ) {
|
for (prev = &gp->gpu_perf.comm; (comm = *prev) != NULL; ) {
|
||||||
int need_comma = 0;
|
int need_comma = 0, len;
|
||||||
|
|
||||||
|
if (comm->name[0] == '\0')
|
||||||
|
goto skip_comm;
|
||||||
|
|
||||||
|
len = sprintf(buf, "%s:", comm->name);
|
||||||
|
for (n = 0; n < 3; n++) {
|
||||||
|
if (comm->nr_requests[n] == 0)
|
||||||
|
continue;
|
||||||
|
len += sprintf(buf + len, "%s %d%s", need_comma ? "," : "", comm->nr_requests[n], ring_name[n]);
|
||||||
|
need_comma = true;
|
||||||
|
}
|
||||||
|
if (comm->wait_time) {
|
||||||
|
if (comm->wait_time > 1000*1000) {
|
||||||
|
len += sprintf(buf + len, "%s %.1fms waits",
|
||||||
|
need_comma ? "," : "",
|
||||||
|
comm->wait_time / (1000*1000.));
|
||||||
|
} else if (comm->wait_time > 100) {
|
||||||
|
len += sprintf(buf + len, "%s %.1fus waits",
|
||||||
|
need_comma ? "," : "",
|
||||||
|
comm->wait_time / 1000.);
|
||||||
|
} else {
|
||||||
|
len += sprintf(buf, "%s %.0fns waits",
|
||||||
|
need_comma ? "," : "",
|
||||||
|
(double)comm->wait_time);
|
||||||
|
}
|
||||||
|
need_comma = true;
|
||||||
|
comm->wait_time = 0;
|
||||||
|
}
|
||||||
|
if (comm->nr_sema) {
|
||||||
|
len += sprintf(buf + len, "%s %d syncs",
|
||||||
|
need_comma ? "," : "",
|
||||||
|
comm->nr_sema);
|
||||||
|
need_comma = true;
|
||||||
|
comm->nr_sema = 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (comm->user_data) {
|
if (comm->user_data) {
|
||||||
struct chart *c = comm->user_data;
|
struct chart *c = comm->user_data;
|
||||||
@ -373,59 +408,10 @@ static void show_gpu_perf(struct overlay_context *ctx, struct overlay_gpu_perf *
|
|||||||
} else
|
} else
|
||||||
cairo_set_source_rgba(ctx->cr, 1, 1, 1, 1);
|
cairo_set_source_rgba(ctx->cr, 1, 1, 1, 1);
|
||||||
cairo_move_to(ctx->cr, x, y);
|
cairo_move_to(ctx->cr, x, y);
|
||||||
sprintf(buf, "%s:", comm->name);
|
|
||||||
cairo_show_text(ctx->cr, buf);
|
cairo_show_text(ctx->cr, buf);
|
||||||
for (n = 0; n < 3; n++) {
|
|
||||||
if (comm->nr_requests[n] == 0)
|
|
||||||
continue;
|
|
||||||
sprintf(buf, "%s %d %s", need_comma ? "," : "", comm->nr_requests[n], ring_name[n]);
|
|
||||||
cairo_show_text(ctx->cr, buf);
|
|
||||||
need_comma = true;
|
|
||||||
}
|
|
||||||
if (comm->wait_time) {
|
|
||||||
buf[0] = '\0';
|
|
||||||
if (comm->wait_time > 1000*1000) {
|
|
||||||
sprintf(buf, "%s %.1f ms waiting",
|
|
||||||
need_comma ? "," : "",
|
|
||||||
comm->wait_time / (1000*1000.));
|
|
||||||
} else if (comm->wait_time > 100) {
|
|
||||||
sprintf(buf, "%s %.1f us waiting",
|
|
||||||
need_comma ? "," : "",
|
|
||||||
comm->wait_time / 1000.);
|
|
||||||
} else {
|
|
||||||
sprintf(buf, "%s %.0f ns waiting",
|
|
||||||
need_comma ? "," : "",
|
|
||||||
(double)comm->wait_time);
|
|
||||||
}
|
|
||||||
if (buf[0] != '\0') {
|
|
||||||
cairo_show_text(ctx->cr, buf);
|
|
||||||
need_comma = true;
|
|
||||||
}
|
|
||||||
comm->wait_time = 0;
|
|
||||||
}
|
|
||||||
if (comm->busy_time) {
|
|
||||||
buf[0] = '\0';
|
|
||||||
if (comm->busy_time > 1000*1000) {
|
|
||||||
sprintf(buf, "%s %.1f ms busy",
|
|
||||||
need_comma ? "," : "",
|
|
||||||
comm->busy_time / (1000*1000.));
|
|
||||||
} else if (comm->busy_time > 100) {
|
|
||||||
sprintf(buf, "%s %.1f us busy",
|
|
||||||
need_comma ? "," : "",
|
|
||||||
comm->busy_time / 1000.);
|
|
||||||
} else {
|
|
||||||
sprintf(buf, "%s %.0f ns busy",
|
|
||||||
need_comma ? "," : "",
|
|
||||||
(double)comm->busy_time);
|
|
||||||
}
|
|
||||||
if (buf[0] != '\0') {
|
|
||||||
cairo_show_text(ctx->cr, buf);
|
|
||||||
need_comma = true;
|
|
||||||
}
|
|
||||||
comm->busy_time = 0;
|
|
||||||
}
|
|
||||||
y += 14;
|
y += 14;
|
||||||
|
|
||||||
|
skip_comm:
|
||||||
memset(comm->nr_requests, 0, sizeof(comm->nr_requests));
|
memset(comm->nr_requests, 0, sizeof(comm->nr_requests));
|
||||||
if (strcmp(comm->name, get_comm(comm->pid, buf, sizeof(buf)))) {
|
if (strcmp(comm->name, get_comm(comm->pid, buf, sizeof(buf)))) {
|
||||||
*prev = comm->next;
|
*prev = comm->next;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user