* [igt-dev] [PATCH i-g-t 0/2] intel-gpu-overlay: Queued/runnable/running engine stats
@ 2018-02-12 19:01 Tvrtko Ursulin
2018-02-12 19:01 ` [igt-dev] [PATCH i-g-t 1/2] intel-gpu-overlay: Add engine queue stats Tvrtko Ursulin
` (2 more replies)
0 siblings, 3 replies; 8+ messages in thread
From: Tvrtko Ursulin @ 2018-02-12 19:01 UTC (permalink / raw)
To: igt-dev; +Cc: Tvrtko Ursulin
From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Show engine load and load average in intel-gpu-overlay. Matching IGT series to
go with: https://patchwork.freedesktop.org/series/36926/.
Tvrtko Ursulin (2):
intel-gpu-overlay: Add engine queue stats
intel-gpu-overlay: Show 1s, 30s and 15m GPU load
lib/igt_perf.h | 18 ++++++++++++-
overlay/gpu-top.c | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-
overlay/gpu-top.h | 21 ++++++++++++++-
overlay/overlay.c | 36 +++++++++++++++++++------
4 files changed, 143 insertions(+), 11 deletions(-)
--
2.14.1
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply [flat|nested] 8+ messages in thread
* [igt-dev] [PATCH i-g-t 1/2] intel-gpu-overlay: Add engine queue stats
2018-02-12 19:01 [igt-dev] [PATCH i-g-t 0/2] intel-gpu-overlay: Queued/runnable/running engine stats Tvrtko Ursulin
@ 2018-02-12 19:01 ` Tvrtko Ursulin
2018-02-13 10:49 ` Chris Wilson
2018-02-12 19:01 ` [igt-dev] [PATCH i-g-t 2/2] intel-gpu-overlay: Show 1s, 30s and 15m GPU load Tvrtko Ursulin
2018-02-12 19:39 ` [igt-dev] ✗ Fi.CI.BAT: failure for intel-gpu-overlay: Queued/runnable/running engine stats Patchwork
2 siblings, 1 reply; 8+ messages in thread
From: Tvrtko Ursulin @ 2018-02-12 19:01 UTC (permalink / raw)
To: igt-dev; +Cc: Tvrtko Ursulin
From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Use new PMU engine queue stats (queued, runnable and running) and display
them per engine.
Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
---
lib/igt_perf.h | 18 +++++++++++++++++-
overlay/gpu-top.c | 42 ++++++++++++++++++++++++++++++++++++++++++
overlay/gpu-top.h | 11 +++++++++++
overlay/overlay.c | 9 +++++++++
4 files changed, 79 insertions(+), 1 deletion(-)
diff --git a/lib/igt_perf.h b/lib/igt_perf.h
index 7b66fc582b88..68e208941ca9 100644
--- a/lib/igt_perf.h
+++ b/lib/igt_perf.h
@@ -35,9 +35,16 @@ enum drm_i915_pmu_engine_sample {
I915_SAMPLE_BUSY = 0,
I915_SAMPLE_WAIT = 1,
I915_SAMPLE_SEMA = 2,
- I915_ENGINE_SAMPLE_MAX /* non-ABI */
+ I915_SAMPLE_QUEUED = 3,
+ I915_SAMPLE_RUNNABLE = 4,
+ I915_SAMPLE_RUNNING = 5,
};
+ /* Divide counter value by divisor to get the real value. */
+#define I915_SAMPLE_QUEUED_DIVISOR (1024)
+#define I915_SAMPLE_RUNNABLE_DIVISOR (1024)
+#define I915_SAMPLE_RUNNING_DIVISOR (1024)
+
#define I915_PMU_SAMPLE_BITS (4)
#define I915_PMU_SAMPLE_MASK (0xf)
#define I915_PMU_SAMPLE_INSTANCE_BITS (8)
@@ -58,6 +65,15 @@ enum drm_i915_pmu_engine_sample {
#define I915_PMU_ENGINE_SEMA(class, instance) \
__I915_PMU_ENGINE(class, instance, I915_SAMPLE_SEMA)
+#define I915_PMU_ENGINE_QUEUED(class, instance) \
+ __I915_PMU_ENGINE(class, instance, I915_SAMPLE_QUEUED)
+
+#define I915_PMU_ENGINE_RUNNABLE(class, instance) \
+ __I915_PMU_ENGINE(class, instance, I915_SAMPLE_RUNNABLE)
+
+#define I915_PMU_ENGINE_RUNNING(class, instance) \
+ __I915_PMU_ENGINE(class, instance, I915_SAMPLE_RUNNING)
+
#define __I915_PMU_OTHER(x) (__I915_PMU_ENGINE(0xff, 0xff, 0xf) + 1 + (x))
#define I915_PMU_ACTUAL_FREQUENCY __I915_PMU_OTHER(0)
diff --git a/overlay/gpu-top.c b/overlay/gpu-top.c
index 61b8f62fd78c..22e9badb22c1 100644
--- a/overlay/gpu-top.c
+++ b/overlay/gpu-top.c
@@ -72,6 +72,18 @@ static int perf_init(struct gpu_top *gt)
gt->fd) >= 0)
gt->have_sema = 1;
+ if (perf_i915_open_group(I915_PMU_ENGINE_QUEUED(d->class, d->inst),
+ gt->fd) >= 0)
+ gt->have_queued = 1;
+
+ if (perf_i915_open_group(I915_PMU_ENGINE_RUNNABLE(d->class, d->inst),
+ gt->fd) >= 0)
+ gt->have_runnable = 1;
+
+ if (perf_i915_open_group(I915_PMU_ENGINE_RUNNING(d->class, d->inst),
+ gt->fd) >= 0)
+ gt->have_running = 1;
+
gt->ring[0].name = d->name;
gt->num_rings = 1;
@@ -93,6 +105,24 @@ static int perf_init(struct gpu_top *gt)
gt->fd) < 0)
return -1;
+ if (gt->have_queued &&
+ perf_i915_open_group(I915_PMU_ENGINE_QUEUED(d->class,
+ d->inst),
+ gt->fd) < 0)
+ return -1;
+
+ if (gt->have_runnable &&
+ perf_i915_open_group(I915_PMU_ENGINE_RUNNABLE(d->class,
+ d->inst),
+ gt->fd) < 0)
+ return -1;
+
+ if (gt->have_running &&
+ perf_i915_open_group(I915_PMU_ENGINE_RUNNING(d->class,
+ d->inst),
+ gt->fd) < 0)
+ return -1;
+
gt->ring[gt->num_rings++].name = d->name;
}
@@ -298,6 +328,12 @@ int gpu_top_update(struct gpu_top *gt)
s->wait[n] = sample[m++];
if (gt->have_sema)
s->sema[n] = sample[m++];
+ if (gt->have_queued)
+ s->queued[n] = sample[m++];
+ if (gt->have_runnable)
+ s->runnable[n] = sample[m++];
+ if (gt->have_running)
+ s->running[n] = sample[m++];
}
if (gt->count == 1)
@@ -310,6 +346,12 @@ int gpu_top_update(struct gpu_top *gt)
gt->ring[n].u.u.wait = (100 * (s->wait[n] - d->wait[n]) + d_time/2) / d_time;
if (gt->have_sema)
gt->ring[n].u.u.sema = (100 * (s->sema[n] - d->sema[n]) + d_time/2) / d_time;
+ if (gt->have_queued)
+ gt->ring[n].queued = (double)((s->queued[n] - d->queued[n])) / I915_SAMPLE_QUEUED_DIVISOR * 1e9 / d_time;
+ if (gt->have_runnable)
+ gt->ring[n].runnable = (double)((s->runnable[n] - d->runnable[n])) / I915_SAMPLE_RUNNABLE_DIVISOR * 1e9 / d_time;
+ if (gt->have_running)
+ gt->ring[n].running = (double)((s->running[n] - d->running[n])) / I915_SAMPLE_RUNNING_DIVISOR * 1e9 / d_time;
/* in case of rounding + sampling errors, fudge */
if (gt->ring[n].u.u.busy > 100)
diff --git a/overlay/gpu-top.h b/overlay/gpu-top.h
index d3cdd779760f..cb4310c82a94 100644
--- a/overlay/gpu-top.h
+++ b/overlay/gpu-top.h
@@ -36,6 +36,9 @@ struct gpu_top {
int num_rings;
int have_wait;
int have_sema;
+ int have_queued;
+ int have_runnable;
+ int have_running;
struct gpu_top_ring {
const char *name;
@@ -47,6 +50,10 @@ struct gpu_top {
} u;
uint32_t payload;
} u;
+
+ double queued;
+ double runnable;
+ double running;
} ring[MAX_RINGS];
struct gpu_top_stat {
@@ -54,7 +61,11 @@ struct gpu_top {
uint64_t busy[MAX_RINGS];
uint64_t wait[MAX_RINGS];
uint64_t sema[MAX_RINGS];
+ uint64_t queued[MAX_RINGS];
+ uint64_t runnable[MAX_RINGS];
+ uint64_t running[MAX_RINGS];
} stat[2];
+
int count;
};
diff --git a/overlay/overlay.c b/overlay/overlay.c
index 545af7bcb2f5..a639703ebcec 100644
--- a/overlay/overlay.c
+++ b/overlay/overlay.c
@@ -255,6 +255,15 @@ static void show_gpu_top(struct overlay_context *ctx, struct overlay_gpu_top *gt
len = sprintf(txt, "%s: %3d%% busy",
gt->gpu_top.ring[n].name,
gt->gpu_top.ring[n].u.u.busy);
+ if (gt->gpu_top.have_queued)
+ len += sprintf(txt + len, ", qd %.2f",
+ gt->gpu_top.ring[n].queued);
+ if (gt->gpu_top.have_runnable)
+ len += sprintf(txt + len, ", rd %.2f",
+ gt->gpu_top.ring[n].runnable);
+ if (gt->gpu_top.have_running)
+ len += sprintf(txt + len, ", ed %.2f",
+ gt->gpu_top.ring[n].running);
if (gt->gpu_top.ring[n].u.u.wait)
len += sprintf(txt + len, ", %d%% wait",
gt->gpu_top.ring[n].u.u.wait);
--
2.14.1
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [igt-dev] [PATCH i-g-t 2/2] intel-gpu-overlay: Show 1s, 30s and 15m GPU load
2018-02-12 19:01 [igt-dev] [PATCH i-g-t 0/2] intel-gpu-overlay: Queued/runnable/running engine stats Tvrtko Ursulin
2018-02-12 19:01 ` [igt-dev] [PATCH i-g-t 1/2] intel-gpu-overlay: Add engine queue stats Tvrtko Ursulin
@ 2018-02-12 19:01 ` Tvrtko Ursulin
2018-02-12 21:00 ` Chris Wilson
` (2 more replies)
2018-02-12 19:39 ` [igt-dev] ✗ Fi.CI.BAT: failure for intel-gpu-overlay: Queued/runnable/running engine stats Patchwork
2 siblings, 3 replies; 8+ messages in thread
From: Tvrtko Ursulin @ 2018-02-12 19:01 UTC (permalink / raw)
To: igt-dev; +Cc: Tvrtko Ursulin
From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Show total GPU loads in the window banner.
Engine load is defined as total of runnable and running requests on an
engine.
Total, non-normalized, load is display. In other words if N engines are
busy with exactly one request, the load will be shown as N.
Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
---
overlay/gpu-top.c | 37 ++++++++++++++++++++++++++++++++++++-
overlay/gpu-top.h | 10 +++++++++-
overlay/overlay.c | 27 +++++++++++++++++++--------
3 files changed, 64 insertions(+), 10 deletions(-)
diff --git a/overlay/gpu-top.c b/overlay/gpu-top.c
index 22e9badb22c1..ca25e998e3d7 100644
--- a/overlay/gpu-top.c
+++ b/overlay/gpu-top.c
@@ -290,17 +290,35 @@ static void mmio_init(struct gpu_top *gt)
}
}
-void gpu_top_init(struct gpu_top *gt)
+void gpu_top_init(struct gpu_top *gt, unsigned int period_us)
{
+ const double period = (double)period_us / 1e6;
+ const double load_period[NUM_LOADS] = { 1.0, 30.0, 900.0 };
+ const char *load_names[NUM_LOADS] = { "1s", "30s", "15m" };
+ unsigned int i;
+
memset(gt, 0, sizeof(*gt));
gt->fd = -1;
+ for (i = 0; i < NUM_LOADS; i++) {
+ gt->load_name[i] = load_names[i];
+ gt->exp[i] = period / load_period[i];
+ }
+
if (perf_init(gt) == 0)
return;
mmio_init(gt);
}
+static double update_load(double load, double exp, double val)
+{
+ load *= 1.0 - exp;
+ load += exp * val;
+
+ return load;
+}
+
int gpu_top_update(struct gpu_top *gt)
{
uint32_t data[1024];
@@ -313,6 +331,8 @@ int gpu_top_update(struct gpu_top *gt)
struct gpu_top_stat *s = >->stat[gt->count++&1];
struct gpu_top_stat *d = >->stat[gt->count&1];
uint64_t *sample, d_time;
+ double gpu_qd = 0.0;
+ unsigned int i;
int n, m;
len = read(gt->fd, data, sizeof(data));
@@ -341,6 +361,8 @@ int gpu_top_update(struct gpu_top *gt)
d_time = s->time - d->time;
for (n = 0; n < gt->num_rings; n++) {
+ double qd = 0.0;
+
gt->ring[n].u.u.busy = (100 * (s->busy[n] - d->busy[n]) + d_time/2) / d_time;
if (gt->have_wait)
gt->ring[n].u.u.wait = (100 * (s->wait[n] - d->wait[n]) + d_time/2) / d_time;
@@ -353,6 +375,14 @@ int gpu_top_update(struct gpu_top *gt)
if (gt->have_running)
gt->ring[n].running = (double)((s->running[n] - d->running[n])) / I915_SAMPLE_RUNNING_DIVISOR * 1e9 / d_time;
+ qd = gt->ring[n].runnable + gt->ring[n].running;
+ gpu_qd += qd;
+
+ for (i = 0; i < NUM_LOADS; i++)
+ gt->ring[n].load[i] =
+ update_load(gt->ring[n].load[i],
+ gt->exp[i], qd);
+
/* in case of rounding + sampling errors, fudge */
if (gt->ring[n].u.u.busy > 100)
gt->ring[n].u.u.busy = 100;
@@ -362,6 +392,11 @@ int gpu_top_update(struct gpu_top *gt)
gt->ring[n].u.u.sema = 100;
}
+ for (i = 0; i < NUM_LOADS; i++) {
+ gt->load[i] = update_load(gt->load[i], gt->exp[i],
+ gpu_qd);
+ gt->norm_load[i] = gt->load[i] / gt->num_rings;
+ }
update = 1;
} else {
while ((len = read(gt->fd, data, sizeof(data))) > 0) {
diff --git a/overlay/gpu-top.h b/overlay/gpu-top.h
index cb4310c82a94..8fc617ce8492 100644
--- a/overlay/gpu-top.h
+++ b/overlay/gpu-top.h
@@ -26,6 +26,7 @@
#define GPU_TOP_H
#define MAX_RINGS 16
+#define NUM_LOADS 3
#include <stdint.h>
@@ -40,6 +41,11 @@ struct gpu_top {
int have_runnable;
int have_running;
+ double exp[NUM_LOADS];
+ double load[NUM_LOADS];
+ double norm_load[NUM_LOADS];
+ const char *load_name[NUM_LOADS];
+
struct gpu_top_ring {
const char *name;
union gpu_top_payload {
@@ -54,6 +60,8 @@ struct gpu_top {
double queued;
double runnable;
double running;
+
+ double load[NUM_LOADS];
} ring[MAX_RINGS];
struct gpu_top_stat {
@@ -69,7 +77,7 @@ struct gpu_top {
int count;
};
-void gpu_top_init(struct gpu_top *gt);
+void gpu_top_init(struct gpu_top *gt, unsigned int period_us);
int gpu_top_update(struct gpu_top *gt);
#endif /* GPU_TOP_H */
diff --git a/overlay/overlay.c b/overlay/overlay.c
index a639703ebcec..30f712e4415a 100644
--- a/overlay/overlay.c
+++ b/overlay/overlay.c
@@ -141,7 +141,8 @@ struct overlay_context {
};
static void init_gpu_top(struct overlay_context *ctx,
- struct overlay_gpu_top *gt)
+ struct overlay_gpu_top *gt,
+ unsigned int period_us)
{
const double rgba[][4] = {
{ 1, 0.25, 0.25, 1 },
@@ -152,7 +153,7 @@ static void init_gpu_top(struct overlay_context *ctx,
int n;
cpu_top_init(>->cpu_top);
- gpu_top_init(>->gpu_top);
+ gpu_top_init(>->gpu_top, period_us);
chart_init(>->cpu, "CPU", 120);
chart_set_position(>->cpu, PAD, PAD);
@@ -929,13 +930,13 @@ int main(int argc, char **argv)
debugfs_init();
- init_gpu_top(&ctx, &ctx.gpu_top);
+ sample_period = get_sample_period(&config);
+
+ init_gpu_top(&ctx, &ctx.gpu_top, sample_period);
init_gpu_perf(&ctx, &ctx.gpu_perf);
init_gpu_freq(&ctx, &ctx.gpu_freq);
init_gem_objects(&ctx, &ctx.gem_objects);
- sample_period = get_sample_period(&config);
-
i = 0;
while (1) {
ctx.time = time(NULL);
@@ -951,16 +952,26 @@ int main(int argc, char **argv)
show_gem_objects(&ctx, &ctx.gem_objects);
{
- char buf[80];
+ struct gpu_top *gt = &ctx.gpu_top.gpu_top;
+ char buf[80], buf2[256];
cairo_text_extents_t extents;
+
gethostname(buf, sizeof(buf));
+ snprintf(buf2, sizeof(buf2),
+ "%s; %u engines; load-avg %s %.2f, %s %.2f, %s %.2f",
+ buf,
+ gt->num_rings,
+ gt->load_name[0], gt->load[0],
+ gt->load_name[1], gt->load[1],
+ gt->load_name[2], gt->load[2]);
+
cairo_set_source_rgb(ctx.cr, .5, .5, .5);
cairo_set_font_size(ctx.cr, PAD-2);
- cairo_text_extents(ctx.cr, buf, &extents);
+ cairo_text_extents(ctx.cr, buf2, &extents);
cairo_move_to(ctx.cr,
(ctx.width-extents.width)/2.,
1+extents.height);
- cairo_show_text(ctx.cr, buf);
+ cairo_show_text(ctx.cr, buf2);
}
cairo_destroy(ctx.cr);
--
2.14.1
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [igt-dev] ✗ Fi.CI.BAT: failure for intel-gpu-overlay: Queued/runnable/running engine stats
2018-02-12 19:01 [igt-dev] [PATCH i-g-t 0/2] intel-gpu-overlay: Queued/runnable/running engine stats Tvrtko Ursulin
2018-02-12 19:01 ` [igt-dev] [PATCH i-g-t 1/2] intel-gpu-overlay: Add engine queue stats Tvrtko Ursulin
2018-02-12 19:01 ` [igt-dev] [PATCH i-g-t 2/2] intel-gpu-overlay: Show 1s, 30s and 15m GPU load Tvrtko Ursulin
@ 2018-02-12 19:39 ` Patchwork
2 siblings, 0 replies; 8+ messages in thread
From: Patchwork @ 2018-02-12 19:39 UTC (permalink / raw)
To: Tvrtko Ursulin; +Cc: igt-dev
== Series Details ==
Series: intel-gpu-overlay: Queued/runnable/running engine stats
URL : https://patchwork.freedesktop.org/series/38101/
State : failure
== Summary ==
IGT patchset tested on top of latest successful build
3f62e3da85b792ff74c0420e62f2d39a09ddcc1f tests/kms_rotation_crc: Test all pixel formats on all planes.
with latest DRM-Tip kernel build CI_DRM_3757
83878f486e68 drm-tip: 2018y-02m-12d-17h-43m-07s UTC integration manifest
No testlist changes.
Test kms_pipe_crc_basic:
Subgroup suspend-read-crc-pipe-b:
pass -> INCOMPLETE (fi-snb-2520m) fdo#103713
Test prime_vgem:
Subgroup basic-fence-flip:
fail -> PASS (fi-ilk-650)
pass -> FAIL (fi-hsw-4770)
fdo#103713 https://bugs.freedesktop.org/show_bug.cgi?id=103713
fi-bdw-5557u total:288 pass:265 dwarn:0 dfail:0 fail:2 skip:21 time:440s
fi-bdw-gvtdvm total:288 pass:264 dwarn:0 dfail:0 fail:0 skip:24 time:427s
fi-blb-e6850 total:288 pass:223 dwarn:1 dfail:0 fail:0 skip:64 time:377s
fi-bsw-n3050 total:288 pass:242 dwarn:0 dfail:0 fail:0 skip:46 time:493s
fi-bwr-2160 total:288 pass:183 dwarn:0 dfail:0 fail:0 skip:105 time:290s
fi-bxt-dsi total:288 pass:258 dwarn:0 dfail:0 fail:0 skip:30 time:485s
fi-bxt-j4205 total:288 pass:259 dwarn:0 dfail:0 fail:0 skip:29 time:492s
fi-byt-j1900 total:288 pass:253 dwarn:0 dfail:0 fail:0 skip:35 time:474s
fi-byt-n2820 total:288 pass:249 dwarn:0 dfail:0 fail:0 skip:39 time:465s
fi-cfl-s2 total:288 pass:262 dwarn:0 dfail:0 fail:0 skip:26 time:573s
fi-cnl-y3 total:288 pass:262 dwarn:0 dfail:0 fail:0 skip:26 time:577s
fi-elk-e7500 total:288 pass:229 dwarn:0 dfail:0 fail:0 skip:59 time:418s
fi-gdg-551 total:288 pass:179 dwarn:0 dfail:0 fail:1 skip:108 time:286s
fi-glk-1 total:288 pass:260 dwarn:0 dfail:0 fail:0 skip:28 time:516s
fi-hsw-4770 total:288 pass:258 dwarn:0 dfail:0 fail:3 skip:27 time:413s
fi-ilk-650 total:288 pass:228 dwarn:0 dfail:0 fail:0 skip:60 time:414s
fi-ivb-3520m total:288 pass:259 dwarn:0 dfail:0 fail:0 skip:29 time:461s
fi-ivb-3770 total:288 pass:255 dwarn:0 dfail:0 fail:0 skip:33 time:416s
fi-kbl-7500u total:288 pass:263 dwarn:1 dfail:0 fail:0 skip:24 time:459s
fi-kbl-7560u total:288 pass:269 dwarn:0 dfail:0 fail:0 skip:19 time:493s
fi-kbl-r total:288 pass:261 dwarn:0 dfail:0 fail:0 skip:27 time:501s
fi-pnv-d510 total:288 pass:222 dwarn:1 dfail:0 fail:0 skip:65 time:595s
fi-skl-6260u total:288 pass:268 dwarn:0 dfail:0 fail:0 skip:20 time:428s
fi-skl-6600u total:288 pass:261 dwarn:0 dfail:0 fail:0 skip:27 time:506s
fi-skl-6700hq total:288 pass:262 dwarn:0 dfail:0 fail:0 skip:26 time:529s
fi-skl-6700k2 total:288 pass:264 dwarn:0 dfail:0 fail:0 skip:24 time:487s
fi-skl-6770hq total:288 pass:268 dwarn:0 dfail:0 fail:0 skip:20 time:480s
fi-skl-guc total:288 pass:260 dwarn:0 dfail:0 fail:0 skip:28 time:419s
fi-skl-gvtdvm total:288 pass:265 dwarn:0 dfail:0 fail:0 skip:23 time:430s
fi-snb-2520m total:245 pass:211 dwarn:0 dfail:0 fail:0 skip:33
fi-snb-2600 total:288 pass:248 dwarn:0 dfail:0 fail:0 skip:40 time:410s
Blacklisted hosts:
fi-glk-dsi total:288 pass:258 dwarn:0 dfail:0 fail:0 skip:30 time:474s
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_904/issues.html
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [igt-dev] [PATCH i-g-t 2/2] intel-gpu-overlay: Show 1s, 30s and 15m GPU load
2018-02-12 19:01 ` [igt-dev] [PATCH i-g-t 2/2] intel-gpu-overlay: Show 1s, 30s and 15m GPU load Tvrtko Ursulin
@ 2018-02-12 21:00 ` Chris Wilson
2018-02-13 10:46 ` Chris Wilson
2018-02-13 11:19 ` Chris Wilson
2 siblings, 0 replies; 8+ messages in thread
From: Chris Wilson @ 2018-02-12 21:00 UTC (permalink / raw)
To: Tvrtko Ursulin, igt-dev; +Cc: Tvrtko Ursulin
Quoting Tvrtko Ursulin (2018-02-12 19:01:58)
> From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
>
> Show total GPU loads in the window banner.
>
> Engine load is defined as total of runnable and running requests on an
> engine.
>
> Total, non-normalized, load is display. In other words if N engines are
> busy with exactly one request, the load will be shown as N.
>
> Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
> ---
All matches my understanding, at least :)
> @@ -951,16 +952,26 @@ int main(int argc, char **argv)
> show_gem_objects(&ctx, &ctx.gem_objects);
>
> {
> - char buf[80];
> + struct gpu_top *gt = &ctx.gpu_top.gpu_top;
> + char buf[80], buf2[256];
> cairo_text_extents_t extents;
> +
> gethostname(buf, sizeof(buf));
len = strlen(buf);
snprintf(buf + len, sizeof(buf) - len, ?
-Chris
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [igt-dev] [PATCH i-g-t 2/2] intel-gpu-overlay: Show 1s, 30s and 15m GPU load
2018-02-12 19:01 ` [igt-dev] [PATCH i-g-t 2/2] intel-gpu-overlay: Show 1s, 30s and 15m GPU load Tvrtko Ursulin
2018-02-12 21:00 ` Chris Wilson
@ 2018-02-13 10:46 ` Chris Wilson
2018-02-13 11:19 ` Chris Wilson
2 siblings, 0 replies; 8+ messages in thread
From: Chris Wilson @ 2018-02-13 10:46 UTC (permalink / raw)
To: Tvrtko Ursulin, igt-dev; +Cc: Tvrtko Ursulin
Quoting Tvrtko Ursulin (2018-02-12 19:01:58)
> From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
>
> Show total GPU loads in the window banner.
>
> Engine load is defined as total of runnable and running requests on an
> engine.
>
> Total, non-normalized, load is display. In other words if N engines are
> busy with exactly one request, the load will be shown as N.
>
> Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
> ---
> overlay/gpu-top.c | 37 ++++++++++++++++++++++++++++++++++++-
> overlay/gpu-top.h | 10 +++++++++-
> overlay/overlay.c | 27 +++++++++++++++++++--------
> 3 files changed, 64 insertions(+), 10 deletions(-)
>
> diff --git a/overlay/gpu-top.c b/overlay/gpu-top.c
> index 22e9badb22c1..ca25e998e3d7 100644
> --- a/overlay/gpu-top.c
> +++ b/overlay/gpu-top.c
> @@ -290,17 +290,35 @@ static void mmio_init(struct gpu_top *gt)
> }
> }
>
> -void gpu_top_init(struct gpu_top *gt)
> +void gpu_top_init(struct gpu_top *gt, unsigned int period_us)
> {
> + const double period = (double)period_us / 1e6;
> + const double load_period[NUM_LOADS] = { 1.0, 30.0, 900.0 };
> + const char *load_names[NUM_LOADS] = { "1s", "30s", "15m" };
> + unsigned int i;
> +
> memset(gt, 0, sizeof(*gt));
> gt->fd = -1;
>
> + for (i = 0; i < NUM_LOADS; i++) {
> + gt->load_name[i] = load_names[i];
> + gt->exp[i] = period / load_period[i];
> + }
> +
> if (perf_init(gt) == 0)
> return;
>
> mmio_init(gt);
> }
>
> +static double update_load(double load, double exp, double val)
> +{
> + load *= 1.0 - exp;
> + load += exp * val;
> +
> + return load;
> +}
> +
> int gpu_top_update(struct gpu_top *gt)
> {
> uint32_t data[1024];
> @@ -313,6 +331,8 @@ int gpu_top_update(struct gpu_top *gt)
> struct gpu_top_stat *s = >->stat[gt->count++&1];
> struct gpu_top_stat *d = >->stat[gt->count&1];
> uint64_t *sample, d_time;
> + double gpu_qd = 0.0;
> + unsigned int i;
> int n, m;
>
> len = read(gt->fd, data, sizeof(data));
> @@ -341,6 +361,8 @@ int gpu_top_update(struct gpu_top *gt)
>
> d_time = s->time - d->time;
> for (n = 0; n < gt->num_rings; n++) {
> + double qd = 0.0;
> +
> gt->ring[n].u.u.busy = (100 * (s->busy[n] - d->busy[n]) + d_time/2) / d_time;
> if (gt->have_wait)
> gt->ring[n].u.u.wait = (100 * (s->wait[n] - d->wait[n]) + d_time/2) / d_time;
> @@ -353,6 +375,14 @@ int gpu_top_update(struct gpu_top *gt)
> if (gt->have_running)
> gt->ring[n].running = (double)((s->running[n] - d->running[n])) / I915_SAMPLE_RUNNING_DIVISOR * 1e9 / d_time;
>
> + qd = gt->ring[n].runnable + gt->ring[n].running;
> + gpu_qd += qd;
> +
> + for (i = 0; i < NUM_LOADS; i++)
> + gt->ring[n].load[i] =
> + update_load(gt->ring[n].load[i],
> + gt->exp[i], qd);
> +
> /* in case of rounding + sampling errors, fudge */
> if (gt->ring[n].u.u.busy > 100)
> gt->ring[n].u.u.busy = 100;
> @@ -362,6 +392,11 @@ int gpu_top_update(struct gpu_top *gt)
> gt->ring[n].u.u.sema = 100;
> }
>
> + for (i = 0; i < NUM_LOADS; i++) {
> + gt->load[i] = update_load(gt->load[i], gt->exp[i],
> + gpu_qd);
> + gt->norm_load[i] = gt->load[i] / gt->num_rings;
> + }
> update = 1;
> } else {
> while ((len = read(gt->fd, data, sizeof(data))) > 0) {
> diff --git a/overlay/gpu-top.h b/overlay/gpu-top.h
> index cb4310c82a94..8fc617ce8492 100644
> --- a/overlay/gpu-top.h
> +++ b/overlay/gpu-top.h
> @@ -26,6 +26,7 @@
> #define GPU_TOP_H
>
> #define MAX_RINGS 16
> +#define NUM_LOADS 3
>
> #include <stdint.h>
>
> @@ -40,6 +41,11 @@ struct gpu_top {
> int have_runnable;
> int have_running;
>
> + double exp[NUM_LOADS];
> + double load[NUM_LOADS];
> + double norm_load[NUM_LOADS];
> + const char *load_name[NUM_LOADS];
> +
> struct gpu_top_ring {
> const char *name;
> union gpu_top_payload {
> @@ -54,6 +60,8 @@ struct gpu_top {
> double queued;
> double runnable;
> double running;
> +
> + double load[NUM_LOADS];
> } ring[MAX_RINGS];
>
> struct gpu_top_stat {
> @@ -69,7 +77,7 @@ struct gpu_top {
> int count;
> };
>
> -void gpu_top_init(struct gpu_top *gt);
> +void gpu_top_init(struct gpu_top *gt, unsigned int period_us);
> int gpu_top_update(struct gpu_top *gt);
>
> #endif /* GPU_TOP_H */
> diff --git a/overlay/overlay.c b/overlay/overlay.c
> index a639703ebcec..30f712e4415a 100644
> --- a/overlay/overlay.c
> +++ b/overlay/overlay.c
> @@ -141,7 +141,8 @@ struct overlay_context {
> };
>
> static void init_gpu_top(struct overlay_context *ctx,
> - struct overlay_gpu_top *gt)
> + struct overlay_gpu_top *gt,
> + unsigned int period_us)
> {
> const double rgba[][4] = {
> { 1, 0.25, 0.25, 1 },
> @@ -152,7 +153,7 @@ static void init_gpu_top(struct overlay_context *ctx,
> int n;
>
> cpu_top_init(>->cpu_top);
> - gpu_top_init(>->gpu_top);
> + gpu_top_init(>->gpu_top, period_us);
>
> chart_init(>->cpu, "CPU", 120);
> chart_set_position(>->cpu, PAD, PAD);
> @@ -929,13 +930,13 @@ int main(int argc, char **argv)
>
> debugfs_init();
>
> - init_gpu_top(&ctx, &ctx.gpu_top);
> + sample_period = get_sample_period(&config);
> +
> + init_gpu_top(&ctx, &ctx.gpu_top, sample_period);
> init_gpu_perf(&ctx, &ctx.gpu_perf);
> init_gpu_freq(&ctx, &ctx.gpu_freq);
> init_gem_objects(&ctx, &ctx.gem_objects);
>
> - sample_period = get_sample_period(&config);
> -
> i = 0;
> while (1) {
> ctx.time = time(NULL);
> @@ -951,16 +952,26 @@ int main(int argc, char **argv)
> show_gem_objects(&ctx, &ctx.gem_objects);
>
> {
> - char buf[80];
> + struct gpu_top *gt = &ctx.gpu_top.gpu_top;
> + char buf[80], buf2[256];
> cairo_text_extents_t extents;
> +
> gethostname(buf, sizeof(buf));
> + snprintf(buf2, sizeof(buf2),
> + "%s; %u engines; load-avg %s %.2f, %s %.2f, %s %.2f",
> + buf,
> + gt->num_rings,
> + gt->load_name[0], gt->load[0],
> + gt->load_name[1], gt->load[1],
> + gt->load_name[2], gt->load[2]);
Too much text :)
"%s: %u engines, load %.2f %.2f %.2f" worksforme
diff --git a/overlay/overlay.c b/overlay/overlay.c
index 30f712e4..91f8d523 100644
--- a/overlay/overlay.c
+++ b/overlay/overlay.c
@@ -953,25 +953,27 @@ int main(int argc, char **argv)
{
struct gpu_top *gt = &ctx.gpu_top.gpu_top;
- char buf[80], buf2[256];
cairo_text_extents_t extents;
+ char buf[256];
gethostname(buf, sizeof(buf));
- snprintf(buf2, sizeof(buf2),
- "%s; %u engines; load-avg %s %.2f, %s %.2f, %s %.2f",
- buf,
- gt->num_rings,
- gt->load_name[0], gt->load[0],
- gt->load_name[1], gt->load[1],
- gt->load_name[2], gt->load[2]);
+ if (gt->load[2] > 0) { /* gt->has_load_avg */
+ int len = strlen(buf);
+ snprintf(buf + len, sizeof(buf) - len,
+ ": %u engines, load %.2f %.2f %.2f",
+ gt->num_rings,
+ gt->load[0],
+ gt->load[1],
+ gt->load[2]);
+ }
cairo_set_source_rgb(ctx.cr, .5, .5, .5);
cairo_set_font_size(ctx.cr, PAD-2);
- cairo_text_extents(ctx.cr, buf2, &extents);
+ cairo_text_extents(ctx.cr, buf, &extents);
cairo_move_to(ctx.cr,
(ctx.width-extents.width)/2.,
1+extents.height);
- cairo_show_text(ctx.cr, buf2);
+ cairo_show_text(ctx.cr, buf);
}
cairo_destroy(ctx.cr);
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [igt-dev] [PATCH i-g-t 1/2] intel-gpu-overlay: Add engine queue stats
2018-02-12 19:01 ` [igt-dev] [PATCH i-g-t 1/2] intel-gpu-overlay: Add engine queue stats Tvrtko Ursulin
@ 2018-02-13 10:49 ` Chris Wilson
0 siblings, 0 replies; 8+ messages in thread
From: Chris Wilson @ 2018-02-13 10:49 UTC (permalink / raw)
To: Tvrtko Ursulin, igt-dev; +Cc: Tvrtko Ursulin
Quoting Tvrtko Ursulin (2018-02-12 19:01:57)
> diff --git a/overlay/overlay.c b/overlay/overlay.c
> index 545af7bcb2f5..a639703ebcec 100644
> --- a/overlay/overlay.c
> +++ b/overlay/overlay.c
> @@ -255,6 +255,15 @@ static void show_gpu_top(struct overlay_context *ctx, struct overlay_gpu_top *gt
> len = sprintf(txt, "%s: %3d%% busy",
> gt->gpu_top.ring[n].name,
> gt->gpu_top.ring[n].u.u.busy);
> + if (gt->gpu_top.have_queued)
> + len += sprintf(txt + len, ", qd %.2f",
> + gt->gpu_top.ring[n].queued);
> + if (gt->gpu_top.have_runnable)
> + len += sprintf(txt + len, ", rd %.2f",
> + gt->gpu_top.ring[n].runnable);
> + if (gt->gpu_top.have_running)
> + len += sprintf(txt + len, ", ed %.2f",
> + gt->gpu_top.ring[n].running);
Hmm, I would like to compact this down to "%% busy (%.2f / %.2f / %.2f)"
with execution, runnable, queued respectively.
-Chris
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [igt-dev] [PATCH i-g-t 2/2] intel-gpu-overlay: Show 1s, 30s and 15m GPU load
2018-02-12 19:01 ` [igt-dev] [PATCH i-g-t 2/2] intel-gpu-overlay: Show 1s, 30s and 15m GPU load Tvrtko Ursulin
2018-02-12 21:00 ` Chris Wilson
2018-02-13 10:46 ` Chris Wilson
@ 2018-02-13 11:19 ` Chris Wilson
2 siblings, 0 replies; 8+ messages in thread
From: Chris Wilson @ 2018-02-13 11:19 UTC (permalink / raw)
To: Tvrtko Ursulin, igt-dev; +Cc: Tvrtko Ursulin
Quoting Tvrtko Ursulin (2018-02-12 19:01:58)
> From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
>
> Show total GPU loads in the window banner.
>
> Engine load is defined as total of runnable and running requests on an
> engine.
>
> Total, non-normalized, load is display. In other words if N engines are
> busy with exactly one request, the load will be shown as N.
>
> Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
> ---
> overlay/gpu-top.c | 37 ++++++++++++++++++++++++++++++++++++-
> overlay/gpu-top.h | 10 +++++++++-
> overlay/overlay.c | 27 +++++++++++++++++++--------
> 3 files changed, 64 insertions(+), 10 deletions(-)
>
> diff --git a/overlay/gpu-top.c b/overlay/gpu-top.c
> index 22e9badb22c1..ca25e998e3d7 100644
> --- a/overlay/gpu-top.c
> +++ b/overlay/gpu-top.c
> @@ -290,17 +290,35 @@ static void mmio_init(struct gpu_top *gt)
> }
> }
>
> -void gpu_top_init(struct gpu_top *gt)
> +void gpu_top_init(struct gpu_top *gt, unsigned int period_us)
> {
> + const double period = (double)period_us / 1e6;
> + const double load_period[NUM_LOADS] = { 1.0, 30.0, 900.0 };
> + const char *load_names[NUM_LOADS] = { "1s", "30s", "15m" };
> + unsigned int i;
> +
> memset(gt, 0, sizeof(*gt));
> gt->fd = -1;
>
> + for (i = 0; i < NUM_LOADS; i++) {
> + gt->load_name[i] = load_names[i];
> + gt->exp[i] = period / load_period[i];
> + }
> +
> if (perf_init(gt) == 0)
> return;
>
> mmio_init(gt);
> }
>
> +static double update_load(double load, double exp, double val)
> +{
> + load *= 1.0 - exp;
> + load += exp * val;
> +
> + return load;
> +}
I think you forgot the exp() here...
diff --git a/overlay/gpu-top.c b/overlay/gpu-top.c
index ca25e998..e40766fe 100644
--- a/overlay/gpu-top.c
+++ b/overlay/gpu-top.c
@@ -29,6 +29,7 @@
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
+#include <math.h>
#include <assert.h>
#include "igt_perf.h"
@@ -302,7 +303,7 @@ void gpu_top_init(struct gpu_top *gt, unsigned int period_us)
for (i = 0; i < NUM_LOADS; i++) {
gt->load_name[i] = load_names[i];
- gt->exp[i] = period / load_period[i];
+ gt->exp[i] = exp(-period / load_period[i]);
}
if (perf_init(gt) == 0)
@@ -313,10 +314,7 @@ void gpu_top_init(struct gpu_top *gt, unsigned int period_us)
static double update_load(double load, double exp, double val)
{
- load *= 1.0 - exp;
- load += exp * val;
-
- return load;
+ return val + exp * (load - val);
}
stops the loadavg from claiming to over 1M :)
-Chris
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply related [flat|nested] 8+ messages in thread
end of thread, other threads:[~2018-02-13 11:19 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-02-12 19:01 [igt-dev] [PATCH i-g-t 0/2] intel-gpu-overlay: Queued/runnable/running engine stats Tvrtko Ursulin
2018-02-12 19:01 ` [igt-dev] [PATCH i-g-t 1/2] intel-gpu-overlay: Add engine queue stats Tvrtko Ursulin
2018-02-13 10:49 ` Chris Wilson
2018-02-12 19:01 ` [igt-dev] [PATCH i-g-t 2/2] intel-gpu-overlay: Show 1s, 30s and 15m GPU load Tvrtko Ursulin
2018-02-12 21:00 ` Chris Wilson
2018-02-13 10:46 ` Chris Wilson
2018-02-13 11:19 ` Chris Wilson
2018-02-12 19:39 ` [igt-dev] ✗ Fi.CI.BAT: failure for intel-gpu-overlay: Queued/runnable/running engine stats Patchwork
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox