mirror of
https://github.com/tiagovignatti/intel-gpu-tools.git
synced 2025-06-12 10:26:12 +00:00
overlay: Show per-process wait times
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
parent
cc9de398cf
commit
eed59eac47
@ -83,9 +83,11 @@ void chart_add_sample(struct chart *chart, double value)
|
|||||||
{
|
{
|
||||||
int pos;
|
int pos;
|
||||||
|
|
||||||
pos = chart->current_sample % chart->num_samples;
|
if (chart->num_samples == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
pos = chart->current_sample++ % chart->num_samples;
|
||||||
chart->samples[pos] = value;
|
chart->samples[pos] = value;
|
||||||
chart->current_sample++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void chart_update_range(struct chart *chart)
|
static void chart_update_range(struct chart *chart)
|
||||||
|
@ -169,26 +169,37 @@ static char *get_comm(pid_t pid, char *comm, int len)
|
|||||||
return comm;
|
return comm;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct gpu_perf_comm *
|
||||||
|
lookup_comm(struct gpu_perf *gp, pid_t pid)
|
||||||
|
{
|
||||||
|
struct gpu_perf_comm *comm;
|
||||||
|
|
||||||
|
for (comm = gp->comm; comm != NULL; comm = comm->next) {
|
||||||
|
if (comm->pid == pid)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (comm == NULL) {
|
||||||
|
comm = calloc(1, sizeof(*comm));
|
||||||
|
if (comm == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
comm->next = gp->comm;
|
||||||
|
gp->comm = comm;
|
||||||
|
get_comm(pid, comm->name, sizeof(comm->name));
|
||||||
|
comm->pid = pid;
|
||||||
|
}
|
||||||
|
|
||||||
|
return comm;
|
||||||
|
}
|
||||||
|
|
||||||
static int request_add(struct gpu_perf *gp, const void *event)
|
static int request_add(struct gpu_perf *gp, const void *event)
|
||||||
{
|
{
|
||||||
const struct sample_event *sample = event;
|
const struct sample_event *sample = event;
|
||||||
struct gpu_perf_comm *comm;
|
struct gpu_perf_comm *comm;
|
||||||
|
|
||||||
for (comm = gp->comm; comm != NULL; comm = comm->next) {
|
comm = lookup_comm(gp, sample->pid);
|
||||||
if (comm->pid == sample->pid)
|
if (comm == NULL)
|
||||||
break;
|
return 0;
|
||||||
}
|
|
||||||
if (comm == NULL) {
|
|
||||||
comm = malloc(sizeof(*comm));
|
|
||||||
if (comm == NULL)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
comm->next = gp->comm;
|
|
||||||
gp->comm = comm;
|
|
||||||
get_comm(sample->pid, comm->name, sizeof(comm->name));
|
|
||||||
comm->pid = sample->pid;
|
|
||||||
memset(comm->nr_requests, 0, sizeof(comm->nr_requests));
|
|
||||||
}
|
|
||||||
|
|
||||||
comm->nr_requests[sample->raw[1]]++;
|
comm->nr_requests[sample->raw[1]]++;
|
||||||
return 1;
|
return 1;
|
||||||
@ -211,6 +222,32 @@ static int flip_complete(struct gpu_perf *gp, const void *event)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int wait_begin(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->wait_begin = sample->time;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int wait_end(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->wait_time += sample->time - comm->wait_begin;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
void gpu_perf_init(struct gpu_perf *gp, unsigned flags)
|
void gpu_perf_init(struct gpu_perf *gp, unsigned flags)
|
||||||
{
|
{
|
||||||
memset(gp, 0, sizeof(*gp));
|
memset(gp, 0, sizeof(*gp));
|
||||||
@ -220,6 +257,8 @@ void gpu_perf_init(struct gpu_perf *gp, unsigned flags)
|
|||||||
perf_tracepoint_open(gp, "i915", "i915_gem_request_add", request_add);
|
perf_tracepoint_open(gp, "i915", "i915_gem_request_add", request_add);
|
||||||
if (perf_tracepoint_open(gp, "i915", "i915_gem_ring_complete", seqno_end) == 0)
|
if (perf_tracepoint_open(gp, "i915", "i915_gem_ring_complete", seqno_end) == 0)
|
||||||
perf_tracepoint_open(gp, "i915", "i915_gem_ring_dispatch", seqno_start);
|
perf_tracepoint_open(gp, "i915", "i915_gem_ring_dispatch", seqno_start);
|
||||||
|
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_flip_complete", flip_complete);
|
perf_tracepoint_open(gp, "i915", "i915_flip_complete", flip_complete);
|
||||||
|
|
||||||
if (gp->nr_events == 0)
|
if (gp->nr_events == 0)
|
||||||
|
@ -18,6 +18,9 @@ struct gpu_perf {
|
|||||||
pid_t pid;
|
pid_t pid;
|
||||||
int nr_requests[4];
|
int nr_requests[4];
|
||||||
void *user_data;
|
void *user_data;
|
||||||
|
|
||||||
|
uint64_t wait_begin;
|
||||||
|
uint64_t wait_time;
|
||||||
} *comm;
|
} *comm;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -244,6 +244,8 @@ static void show_gpu_perf(struct overlay_context *ctx, struct overlay_gpu_perf *
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (prev = &gp->gpu_perf.comm; (comm = *prev) != NULL; ) {
|
for (prev = &gp->gpu_perf.comm; (comm = *prev) != NULL; ) {
|
||||||
|
int need_comma = 0;
|
||||||
|
|
||||||
if (comm->user_data) {
|
if (comm->user_data) {
|
||||||
struct chart *c = comm->user_data;
|
struct chart *c = comm->user_data;
|
||||||
cairo_set_source_rgba(ctx->cr,
|
cairo_set_source_rgba(ctx->cr,
|
||||||
@ -259,8 +261,19 @@ static void show_gpu_perf(struct overlay_context *ctx, struct overlay_gpu_perf *
|
|||||||
for (n = 0; n < 3; n++) {
|
for (n = 0; n < 3; n++) {
|
||||||
if (comm->nr_requests[n] == 0)
|
if (comm->nr_requests[n] == 0)
|
||||||
continue;
|
continue;
|
||||||
sprintf(buf, " %d %s", comm->nr_requests[n], ring_name[n]);
|
sprintf(buf, "%s %d %s", need_comma ? "," : "", comm->nr_requests[n], ring_name[n]);
|
||||||
cairo_show_text(ctx->cr, buf);
|
cairo_show_text(ctx->cr, buf);
|
||||||
|
need_comma = true;
|
||||||
|
}
|
||||||
|
if (comm->wait_time) {
|
||||||
|
if (comm->wait_time > 100) {
|
||||||
|
sprintf(buf, "%s %.1f us waiting",
|
||||||
|
need_comma ? "," : "",
|
||||||
|
comm->wait_time / 1000.);
|
||||||
|
cairo_show_text(ctx->cr, buf);
|
||||||
|
need_comma = true;
|
||||||
|
}
|
||||||
|
comm->wait_time = 0;
|
||||||
}
|
}
|
||||||
y += 14;
|
y += 14;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user