overlay: Couple wait begin/end events together to fix accounting

Since the events may be processed out of order (due to per-cpu
ringbuffers) we need to be careful to associated wait pairs in order to
compute the correct elapsed time.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
Chris Wilson 2013-08-17 22:22:21 +01:00
parent e1d8d774f3
commit 6233cac9c9
3 changed files with 38 additions and 3 deletions

View File

@ -229,12 +229,21 @@ static int wait_begin(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;
struct gpu_perf_wait *wait;
comm = lookup_comm(gp, sample->pid); comm = lookup_comm(gp, sample->pid);
if (comm == NULL) if (comm == NULL)
return 0; return 0;
comm->wait_begin = sample->time; wait = malloc(sizeof(*wait));
if (wait == NULL)
return 0;
wait->seqno = sample->raw[3];
wait->time = sample->time;
wait->next = comm->wait;
comm->wait = wait;
return 0; return 0;
} }
@ -242,12 +251,22 @@ static int wait_end(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;
struct gpu_perf_wait *wait, **prev;
comm = lookup_comm(gp, sample->pid); comm = lookup_comm(gp, sample->pid);
if (comm == NULL) if (comm == NULL)
return 0; return 0;
comm->wait_time += sample->time - comm->wait_begin; for (prev = &comm->wait; (wait = *prev) != NULL; prev = &wait->next) {
if (wait->seqno != sample->raw[3])
continue;
comm->wait_time += sample->time - wait->time;
*prev = wait->next;
free(wait);
return 1;
}
return 0; return 0;
} }

View File

@ -14,6 +14,11 @@ struct gpu_perf {
int flip_complete; int flip_complete;
struct gpu_perf_comm { struct gpu_perf_comm {
struct gpu_perf_comm *next; struct gpu_perf_comm *next;
struct gpu_perf_wait {
struct gpu_perf_wait *next;
uint32_t seqno;
uint64_t time;
} *wait;
char name[256]; char name[256];
pid_t pid; pid_t pid;
int nr_requests[4]; int nr_requests[4];

View File

@ -266,10 +266,21 @@ static void show_gpu_perf(struct overlay_context *ctx, struct overlay_gpu_perf *
need_comma = true; need_comma = true;
} }
if (comm->wait_time) { if (comm->wait_time) {
if (comm->wait_time > 100) { 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", sprintf(buf, "%s %.1f us waiting",
need_comma ? "," : "", need_comma ? "," : "",
comm->wait_time / 1000.); 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); cairo_show_text(ctx->cr, buf);
need_comma = true; need_comma = true;
} }