* [igt-dev] [PATCH i-g-t 1/2] lib/dummyload: Allow spin batches to be restarted
@ 2018-01-31 12:34 Tvrtko Ursulin
2018-01-31 12:34 ` [igt-dev] [PATCH i-g-t 2/2] tests/perf_pmu: Verify engine busyness accuracy Tvrtko Ursulin
` (3 more replies)
0 siblings, 4 replies; 9+ messages in thread
From: Tvrtko Ursulin @ 2018-01-31 12:34 UTC (permalink / raw)
To: igt-dev; +Cc: Tvrtko Ursulin
From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
This adds the igt_spin_batch_restart API so same spin batch can be
re-used in tests which care about low setup cost.
Batch will be re-submited in the manner completely identical to as
it was originally submitted.
Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
---
lib/igt_dummyload.c | 150 +++++++++++++++++++++++++++++++++-------------------
lib/igt_dummyload.h | 9 ++++
2 files changed, 106 insertions(+), 53 deletions(-)
diff --git a/lib/igt_dummyload.c b/lib/igt_dummyload.c
index 27eb402bb699..102efd197e5b 100644
--- a/lib/igt_dummyload.c
+++ b/lib/igt_dummyload.c
@@ -71,6 +71,35 @@ fill_reloc(struct drm_i915_gem_relocation_entry *reloc,
reloc->write_domain = write_domains;
}
+static int __igt_spin_batch_submit(int fd, igt_spin_t *spin)
+{
+ int fence_fd = -1;
+ unsigned int i;
+
+ for (i = 0; i < spin->nengine; i++) {
+ spin->execbuf.flags &= ~ENGINE_MASK;
+ spin->execbuf.flags |= spin->engines[i];
+ gem_execbuf_wr(fd, &spin->execbuf);
+ if (spin->out_fence_requested) {
+ int _fd = spin->execbuf.rsvd2 >> 32;
+
+ igt_assert(_fd >= 0);
+ if (fence_fd == -1) {
+ fence_fd = _fd;
+ } else {
+ int old_fd = fence_fd;
+
+ fence_fd = sync_fence_merge(old_fd, _fd);
+ close(old_fd);
+ close(_fd);
+ }
+ igt_assert(fence_fd >= 0);
+ }
+ }
+
+ return fence_fd;
+}
+
static int emit_recursive_batch(igt_spin_t *spin,
int fd, uint32_t ctx, unsigned engine,
uint32_t dep, bool out_fence)
@@ -78,52 +107,46 @@ static int emit_recursive_batch(igt_spin_t *spin,
#define SCRATCH 0
#define BATCH 1
const int gen = intel_gen(intel_get_drm_devid(fd));
- struct drm_i915_gem_exec_object2 obj[2];
- struct drm_i915_gem_relocation_entry relocs[2];
- struct drm_i915_gem_execbuffer2 execbuf;
- unsigned int engines[16];
- unsigned int nengine;
- int fence_fd = -1;
uint32_t *batch;
- int i;
- nengine = 0;
+ spin->nengine = 0;
if (engine == -1) {
for_each_engine(fd, engine)
if (engine)
- engines[nengine++] = engine;
+ spin->engines[spin->nengine++] = engine;
} else {
gem_require_ring(fd, engine);
- engines[nengine++] = engine;
+ spin->engines[spin->nengine++] = engine;
}
- igt_require(nengine);
+ igt_require(spin->nengine);
- memset(&execbuf, 0, sizeof(execbuf));
- memset(obj, 0, sizeof(obj));
- memset(relocs, 0, sizeof(relocs));
+ memset(&spin->execbuf, 0, sizeof(spin->execbuf));
+ memset(spin->obj, 0, sizeof(spin->obj));
+ memset(spin->relocs, 0, sizeof(spin->relocs));
- obj[BATCH].handle = gem_create(fd, BATCH_SIZE);
- batch = __gem_mmap__wc(fd, obj[BATCH].handle,
+ spin->obj[BATCH].handle = gem_create(fd, BATCH_SIZE);
+ batch = __gem_mmap__wc(fd, spin->obj[BATCH].handle,
0, BATCH_SIZE, PROT_WRITE);
if (!batch)
- batch = __gem_mmap__gtt(fd, obj[BATCH].handle,
+ batch = __gem_mmap__gtt(fd, spin->obj[BATCH].handle,
BATCH_SIZE, PROT_WRITE);
- gem_set_domain(fd, obj[BATCH].handle,
+ gem_set_domain(fd, spin->obj[BATCH].handle,
I915_GEM_DOMAIN_GTT, I915_GEM_DOMAIN_GTT);
- execbuf.buffer_count++;
+ spin->execbuf.buffer_count++;
if (dep) {
/* dummy write to dependency */
- obj[SCRATCH].handle = dep;
- fill_reloc(&relocs[obj[BATCH].relocation_count++],
+ spin->obj[SCRATCH].handle = dep;
+ fill_reloc(&spin->relocs[spin->obj[BATCH].relocation_count++],
dep, 1020,
I915_GEM_DOMAIN_RENDER,
I915_GEM_DOMAIN_RENDER);
- execbuf.buffer_count++;
+ spin->execbuf.buffer_count++;
}
spin->batch = batch;
- spin->handle = obj[BATCH].handle;
+ spin->handle = spin->obj[BATCH].handle;
+ spin->out_fence_requested = out_fence;
/* Allow ourselves to be preempted */
*batch++ = MI_ARB_CHK;
@@ -142,8 +165,8 @@ static int emit_recursive_batch(igt_spin_t *spin,
batch += 1000;
/* recurse */
- fill_reloc(&relocs[obj[BATCH].relocation_count],
- obj[BATCH].handle, (batch - spin->batch) + 1,
+ fill_reloc(&spin->relocs[spin->obj[BATCH].relocation_count],
+ spin->obj[BATCH].handle, (batch - spin->batch) + 1,
I915_GEM_DOMAIN_COMMAND, 0);
if (gen >= 8) {
*batch++ = MI_BATCH_BUFFER_START | 1 << 8 | 1;
@@ -157,41 +180,21 @@ static int emit_recursive_batch(igt_spin_t *spin,
*batch = 0;
if (gen < 4) {
*batch |= 1;
- relocs[obj[BATCH].relocation_count].delta = 1;
+ spin->relocs[spin->obj[BATCH].relocation_count].delta = 1;
}
batch++;
}
- obj[BATCH].relocation_count++;
- obj[BATCH].relocs_ptr = to_user_pointer(relocs);
+ spin->obj[BATCH].relocation_count++;
+ spin->obj[BATCH].relocs_ptr = to_user_pointer(spin->relocs);
- execbuf.buffers_ptr = to_user_pointer(obj + (2 - execbuf.buffer_count));
- execbuf.rsvd1 = ctx;
+ spin->execbuf.buffers_ptr =
+ to_user_pointer(spin->obj + (2 - spin->execbuf.buffer_count));
+ spin->execbuf.rsvd1 = ctx;
if (out_fence)
- execbuf.flags |= I915_EXEC_FENCE_OUT;
-
- for (i = 0; i < nengine; i++) {
- execbuf.flags &= ~ENGINE_MASK;
- execbuf.flags |= engines[i];
- gem_execbuf_wr(fd, &execbuf);
- if (out_fence) {
- int _fd = execbuf.rsvd2 >> 32;
-
- igt_assert(_fd >= 0);
- if (fence_fd == -1) {
- fence_fd = _fd;
- } else {
- int old_fd = fence_fd;
-
- fence_fd = sync_fence_merge(old_fd, _fd);
- close(old_fd);
- close(_fd);
- }
- igt_assert(fence_fd >= 0);
- }
- }
+ spin->execbuf.flags |= I915_EXEC_FENCE_OUT;
- return fence_fd;
+ return __igt_spin_batch_submit(fd, spin);
}
static igt_spin_t *
@@ -273,6 +276,47 @@ igt_spin_batch_new_fence(int fd, uint32_t ctx, unsigned engine)
return __igt_spin_batch_new_fence(fd, ctx, engine);
}
+/**
+ * __igt_spin_batch_restart:
+ * @fd: open i915 drm file descriptor
+ * @spin: spin batch state from igt_spin_batch_new()
+ *
+ * Restarts the spin batch which was previously ended either explicitly
+ * or via timeout.
+ *
+ * This version does not verify that the batch is currently idle.
+ *
+ * Returns:
+ * New fence fd if spin batch was originaly created as requesting the
+ * output fence.
+ */
+int __igt_spin_batch_restart(int fd, igt_spin_t *spin)
+{
+ *spin->batch = MI_ARB_CHK;
+ __sync_synchronize();
+
+ return __igt_spin_batch_submit(fd, spin);
+}
+
+/**
+ * igt_spin_batch_restart:
+ * @fd: open i915 drm file descriptor
+ * @spin: spin batch state from igt_spin_batch_new()
+ *
+ * Restarts the spin batch which was previously ended either explicitly
+ * or via timeout.
+ *
+ * Returns:
+ * New fence fd if spin batch was originaly created as requesting the
+ * output fence.
+ */
+int igt_spin_batch_restart(int fd, igt_spin_t *spin)
+{
+ igt_assert(!gem_bo_busy(fd, spin->handle));
+
+ return __igt_spin_batch_restart(fd, spin);
+}
+
static void notify(union sigval arg)
{
igt_spin_t *spin = arg.sival_ptr;
diff --git a/lib/igt_dummyload.h b/lib/igt_dummyload.h
index ffa7e351dea3..b9f201d4afb6 100644
--- a/lib/igt_dummyload.h
+++ b/lib/igt_dummyload.h
@@ -36,6 +36,12 @@ typedef struct igt_spin {
struct igt_list link;
uint32_t *batch;
int out_fence;
+ struct drm_i915_gem_exec_object2 obj[2];
+ struct drm_i915_gem_relocation_entry relocs[2];
+ struct drm_i915_gem_execbuffer2 execbuf;
+ unsigned int engines[16];
+ unsigned int nengine;
+ bool out_fence_requested;
} igt_spin_t;
igt_spin_t *__igt_spin_batch_new(int fd,
@@ -55,6 +61,9 @@ igt_spin_t *igt_spin_batch_new_fence(int fd,
uint32_t ctx,
unsigned engine);
+int __igt_spin_batch_restart(int fd, igt_spin_t *spin);
+int igt_spin_batch_restart(int fd, igt_spin_t *spin);
+
void igt_spin_batch_set_timeout(igt_spin_t *spin, int64_t ns);
void igt_spin_batch_end(igt_spin_t *spin);
void igt_spin_batch_free(int fd, igt_spin_t *spin);
--
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] 9+ messages in thread
* [igt-dev] [PATCH i-g-t 2/2] tests/perf_pmu: Verify engine busyness accuracy
2018-01-31 12:34 [igt-dev] [PATCH i-g-t 1/2] lib/dummyload: Allow spin batches to be restarted Tvrtko Ursulin
@ 2018-01-31 12:34 ` Tvrtko Ursulin
2018-01-31 13:18 ` [igt-dev] ✓ Fi.CI.BAT: success for series starting with [i-g-t,1/2] lib/dummyload: Allow spin batches to be restarted Patchwork
` (2 subsequent siblings)
3 siblings, 0 replies; 9+ messages in thread
From: Tvrtko Ursulin @ 2018-01-31 12:34 UTC (permalink / raw)
To: igt-dev; +Cc: Tvrtko Ursulin
From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
A subtest to verify that the engine busyness is reported with expected
accuracy on platforms where the feature is available.
We test three patterns: 2%, 50% and 98% load per engine.
v2:
* Use spin batch instead of nop calibration.
* Various tweaks.
v3:
* Change loops to be time based.
* Use __igt_spin_batch_new inside timing sensitive loops.
* Fixed PWM sleep handling.
v4:
* Use restarting spin batch.
* Calibrate more carefully by looking at the real PWM loop.
Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
---
tests/perf_pmu.c | 167 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 167 insertions(+)
diff --git a/tests/perf_pmu.c b/tests/perf_pmu.c
index 2f7d33414a53..ffba750ef3a5 100644
--- a/tests/perf_pmu.c
+++ b/tests/perf_pmu.c
@@ -35,6 +35,7 @@
#include <dirent.h>
#include <time.h>
#include <poll.h>
+#include <sched.h>
#include "igt.h"
#include "igt_core.h"
@@ -1169,6 +1170,162 @@ test_rc6(int gem_fd)
assert_within_epsilon(busy - prev, 0.0, tolerance);
}
+static uint64_t __pmu_read_single(int fd, uint64_t *ts)
+{
+ uint64_t data[2];
+
+ igt_assert_eq(read(fd, data, sizeof(data)), sizeof(data));
+
+ *ts = data[1];
+
+ return data[0];
+}
+
+static double __error(double val, double ref)
+{
+ igt_assert(ref != 0.0);
+ return (100.0 * val / ref) - 100.0;
+}
+
+static void debug_error(const char *str, double val, double ref)
+{
+ igt_debug("%s=%.2f%% (%.2f/%.2f)\n", str, __error(val, ref), val, ref);
+}
+
+static void log_error(const char *str, double val, double ref)
+{
+ debug_error(str, val, ref);
+ igt_info("%s=%.2f%%\n", str, __error(val, ref));
+}
+
+#define div_round_up(a, b) (((a) + (b) - 1) / (b))
+
+static void
+accuracy(int gem_fd, const struct intel_execution_engine2 *e,
+ unsigned long target_busy_pct)
+{
+ const unsigned int min_test_loops = 7;
+ const unsigned long min_test_us = 1e6;
+ unsigned long busy_us = 2500;
+ unsigned long idle_us = 100 * (busy_us - target_busy_pct *
+ busy_us / 100) / target_busy_pct;
+ unsigned long pwm_calibration_us;
+ unsigned long test_us;
+ double busy_r;
+ uint64_t val[2];
+ uint64_t ts[2];
+ int fd;
+
+ /* Sampling platforms cannot reach the high accuracy criteria. */
+ igt_require(intel_gen(intel_get_drm_devid(gem_fd)) >= 8);
+
+ while (idle_us < 2500) {
+ busy_us *= 2;
+ idle_us *= 2;
+ }
+
+ pwm_calibration_us = min_test_loops * (busy_us + idle_us);
+ while (pwm_calibration_us < min_test_us)
+ pwm_calibration_us += busy_us + idle_us;
+ test_us = min_test_loops * (idle_us + busy_us);
+ while (test_us < min_test_us)
+ test_us += busy_us + idle_us;
+
+ igt_info("calibration=%luus, test=%luus; busy=%luus, idle=%luus\n",
+ pwm_calibration_us, test_us, busy_us, idle_us);
+
+ assert_within_epsilon((double)busy_us / (busy_us + idle_us),
+ (double)target_busy_pct / 100.0, tolerance);
+
+ /* Emit PWM pattern on the engine from a child. */
+ igt_fork(child, 1) {
+ struct sched_param rt = { .sched_priority = 99 };
+ const unsigned long timeout[] = { pwm_calibration_us * 1000,
+ test_us * 2 * 1000 };
+ unsigned long sleep_busy = busy_us;
+ unsigned long sleep_idle = idle_us;
+ igt_spin_t *spin;
+
+ /* We need the best sleep accuracy we can get. */
+ igt_require(sched_setscheduler(0,
+ SCHED_FIFO | SCHED_RESET_ON_FORK,
+ &rt) == 0);
+
+ /* Allocate our spin batch and idle it. */
+ spin = igt_spin_batch_new(gem_fd, 0, e2ring(gem_fd, e), 0);
+ igt_spin_batch_end(spin);
+ gem_sync(gem_fd, spin->handle);
+
+ /* 1st pass is calibration, second pass is the test. */
+ for (int pass = 0; pass < ARRAY_SIZE(timeout); pass++) {
+ unsigned long busy_ns = 0, idle_ns = 0;
+ struct timespec test_start = { };
+ unsigned long loops = 0;
+ double err_busy, err_idle;
+ long get_time_d;
+
+ igt_nsec_elapsed(&test_start);
+ do {
+ struct timespec t_busy = { };
+
+ igt_nsec_elapsed(&t_busy);
+ __igt_spin_batch_restart(gem_fd, spin);
+ measured_usleep(sleep_busy);
+ igt_spin_batch_end(spin);
+ gem_sync(gem_fd, spin->handle);
+ busy_ns += igt_nsec_elapsed(&t_busy);
+
+ idle_ns += measured_usleep(sleep_idle);
+
+ loops++;
+ } while (igt_nsec_elapsed(&test_start) < timeout[pass]);
+
+ /* igt_nsec_elapsed overhead from measured_usleep. */
+ get_time_d = idle_ns - loops * sleep_idle * 1000;
+ busy_ns -= get_time_d;
+ busy_ns = div_round_up(busy_ns, loops);
+ idle_ns = div_round_up(idle_ns, loops);
+
+ err_busy = __error(busy_ns / 1000, busy_us);
+ err_idle = __error(idle_ns / 1000, idle_us);
+
+ igt_info("%u: busy %lu/%lu %.2f%%, idle %lu/%lu %.2f%%\n",
+ pass,
+ busy_ns / 1000, busy_us, err_busy,
+ idle_ns / 1000, idle_us, err_idle);
+
+ if (pass == 0) {
+ sleep_busy = (double)busy_us -
+ (double)busy_us * err_busy / 100.0;
+ sleep_idle = (double)idle_us -
+ (double)idle_us * err_idle / 100.0;
+ igt_info("calibrated sleeps: busy=%lu, idle=%lu\n",
+ sleep_busy, sleep_idle);
+ }
+ }
+
+ igt_spin_batch_free(gem_fd, spin);
+ }
+
+ /* Let the child run. */
+ usleep(pwm_calibration_us * 2);
+
+ /* Collect engine busyness for an interesting part of child runtime. */
+ fd = open_pmu(I915_PMU_ENGINE_BUSY(e->class, e->instance));
+ val[0] = __pmu_read_single(fd, &ts[0]);
+ usleep(test_us / 2);
+ val[1] = __pmu_read_single(fd, &ts[1]);
+ close(fd);
+
+ igt_waitchildren();
+
+ busy_r = (double)(val[1] - val[0]) / (ts[1] - ts[0]);
+
+ log_error("error", busy_r, target_busy_pct / 100.0);
+
+ assert_within_epsilon(busy_r, (double)target_busy_pct / 100.0, 0.15);
+}
+
igt_main
{
const unsigned int num_other_metrics =
@@ -1197,6 +1354,8 @@ igt_main
invalid_init();
for_each_engine_class_instance(fd, e) {
+ const unsigned int pct[] = { 2, 50, 98 };
+
/**
* Test that a single engine metric can be initialized.
*/
@@ -1277,6 +1436,14 @@ igt_main
*/
igt_subtest_f("busy-double-start-%s", e->name)
busy_double_start(fd, e);
+
+ /**
+ * Check engine busyness accuracy is as expected.
+ */
+ for (i = 0; i < ARRAY_SIZE(pct); i++) {
+ igt_subtest_f("busy-accuracy-%u-%s", pct[i], e->name)
+ accuracy(fd, e, pct[i]);
+ }
}
/**
--
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] 9+ messages in thread
* [igt-dev] ✓ Fi.CI.BAT: success for series starting with [i-g-t,1/2] lib/dummyload: Allow spin batches to be restarted
2018-01-31 12:34 [igt-dev] [PATCH i-g-t 1/2] lib/dummyload: Allow spin batches to be restarted Tvrtko Ursulin
2018-01-31 12:34 ` [igt-dev] [PATCH i-g-t 2/2] tests/perf_pmu: Verify engine busyness accuracy Tvrtko Ursulin
@ 2018-01-31 13:18 ` Patchwork
2018-01-31 15:44 ` [igt-dev] [PATCH i-g-t 1/2] " Chris Wilson
2018-01-31 16:47 ` [igt-dev] ✗ Fi.CI.IGT: failure for series starting with [i-g-t,1/2] " Patchwork
3 siblings, 0 replies; 9+ messages in thread
From: Patchwork @ 2018-01-31 13:18 UTC (permalink / raw)
To: Tvrtko Ursulin; +Cc: igt-dev
== Series Details ==
Series: series starting with [i-g-t,1/2] lib/dummyload: Allow spin batches to be restarted
URL : https://patchwork.freedesktop.org/series/37406/
State : success
== Summary ==
IGT patchset tested on top of latest successful build
3f820260ce660cdff7fb803237c57554a29498c0 tests/kms_atomic_transition: Don't abuse the HSKEW flag to force a modeset
with latest DRM-Tip kernel build CI_DRM_3707
badc0398a060 drm-tip: 2018y-01m-31d-12h-17m-12s UTC integration manifest
Testlist changes:
+igt@perf_pmu@busy-accuracy-2-bcs0
+igt@perf_pmu@busy-accuracy-2-rcs0
+igt@perf_pmu@busy-accuracy-2-vcs0
+igt@perf_pmu@busy-accuracy-2-vcs1
+igt@perf_pmu@busy-accuracy-2-vecs0
+igt@perf_pmu@busy-accuracy-50-bcs0
+igt@perf_pmu@busy-accuracy-50-rcs0
+igt@perf_pmu@busy-accuracy-50-vcs0
+igt@perf_pmu@busy-accuracy-50-vcs1
+igt@perf_pmu@busy-accuracy-50-vecs0
+igt@perf_pmu@busy-accuracy-98-bcs0
+igt@perf_pmu@busy-accuracy-98-rcs0
+igt@perf_pmu@busy-accuracy-98-vcs0
+igt@perf_pmu@busy-accuracy-98-vcs1
+igt@perf_pmu@busy-accuracy-98-vecs0
Test debugfs_test:
Subgroup read_all_entries:
dmesg-warn -> FAIL (fi-elk-e7500) fdo#103989 +1
fdo#103989 https://bugs.freedesktop.org/show_bug.cgi?id=103989
fi-bdw-5557u total:288 pass:267 dwarn:0 dfail:0 fail:0 skip:21 time:420s
fi-bdw-gvtdvm total:288 pass:264 dwarn:0 dfail:0 fail:0 skip:24 time:425s
fi-blb-e6850 total:288 pass:223 dwarn:1 dfail:0 fail:0 skip:64 time:378s
fi-bsw-n3050 total:288 pass:242 dwarn:0 dfail:0 fail:0 skip:46 time:489s
fi-bwr-2160 total:288 pass:183 dwarn:0 dfail:0 fail:0 skip:105 time:286s
fi-bxt-dsi total:288 pass:258 dwarn:0 dfail:0 fail:0 skip:30 time:481s
fi-bxt-j4205 total:288 pass:259 dwarn:0 dfail:0 fail:0 skip:29 time:487s
fi-byt-j1900 total:288 pass:253 dwarn:0 dfail:0 fail:0 skip:35 time:470s
fi-byt-n2820 total:288 pass:249 dwarn:0 dfail:0 fail:0 skip:39 time:456s
fi-cfl-s2 total:288 pass:262 dwarn:0 dfail:0 fail:0 skip:26 time:566s
fi-elk-e7500 total:224 pass:167 dwarn:10 dfail:0 fail:1 skip:45
fi-gdg-551 total:288 pass:179 dwarn:0 dfail:0 fail:1 skip:108 time:280s
fi-glk-1 total:288 pass:260 dwarn:0 dfail:0 fail:0 skip:28 time:521s
fi-hsw-4770 total:288 pass:261 dwarn:0 dfail:0 fail:0 skip:27 time:391s
fi-hsw-4770r total:288 pass:261 dwarn:0 dfail:0 fail:0 skip:27 time:399s
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:457s
fi-ivb-3770 total:288 pass:255 dwarn:0 dfail:0 fail:0 skip:33 time:412s
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:494s
fi-kbl-7567u total:288 pass:268 dwarn:0 dfail:0 fail:0 skip:20 time:452s
fi-kbl-r total:288 pass:261 dwarn:0 dfail:0 fail:0 skip:27 time:503s
fi-pnv-d510 total:288 pass:222 dwarn:1 dfail:0 fail:0 skip:65 time:579s
fi-skl-6260u total:288 pass:268 dwarn:0 dfail:0 fail:0 skip:20 time:429s
fi-skl-6600u total:288 pass:261 dwarn:0 dfail:0 fail:0 skip:27 time:510s
fi-skl-6700hq total:288 pass:262 dwarn:0 dfail:0 fail:0 skip:26 time:525s
fi-skl-6700k2 total:288 pass:264 dwarn:0 dfail:0 fail:0 skip:24 time:489s
fi-skl-6770hq total:288 pass:268 dwarn:0 dfail:0 fail:0 skip:20 time:487s
fi-skl-guc total:288 pass:260 dwarn:0 dfail:0 fail:0 skip:28 time:417s
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:398s
Blacklisted hosts:
fi-glk-dsi total:288 pass:258 dwarn:0 dfail:0 fail:0 skip:30 time:471s
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_841/issues.html
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [igt-dev] [PATCH i-g-t 1/2] lib/dummyload: Allow spin batches to be restarted
2018-01-31 12:34 [igt-dev] [PATCH i-g-t 1/2] lib/dummyload: Allow spin batches to be restarted Tvrtko Ursulin
2018-01-31 12:34 ` [igt-dev] [PATCH i-g-t 2/2] tests/perf_pmu: Verify engine busyness accuracy Tvrtko Ursulin
2018-01-31 13:18 ` [igt-dev] ✓ Fi.CI.BAT: success for series starting with [i-g-t,1/2] lib/dummyload: Allow spin batches to be restarted Patchwork
@ 2018-01-31 15:44 ` Chris Wilson
2018-01-31 15:49 ` Chris Wilson
2018-01-31 16:47 ` [igt-dev] ✗ Fi.CI.IGT: failure for series starting with [i-g-t,1/2] " Patchwork
3 siblings, 1 reply; 9+ messages in thread
From: Chris Wilson @ 2018-01-31 15:44 UTC (permalink / raw)
To: Tvrtko Ursulin, igt-dev; +Cc: Tvrtko Ursulin
Quoting Tvrtko Ursulin (2018-01-31 12:34:40)
> From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
>
> This adds the igt_spin_batch_restart API so same spin batch can be
> re-used in tests which care about low setup cost.
>
> Batch will be re-submited in the manner completely identical to as
> it was originally submitted.
Heh, I would have just marked the objects as EXEC_OBJECT_PINNED after
execution and dropped the relocs :)
>
> Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
> ---
> lib/igt_dummyload.c | 150 +++++++++++++++++++++++++++++++++-------------------
> lib/igt_dummyload.h | 9 ++++
> 2 files changed, 106 insertions(+), 53 deletions(-)
>
> diff --git a/lib/igt_dummyload.c b/lib/igt_dummyload.c
> index 27eb402bb699..102efd197e5b 100644
> --- a/lib/igt_dummyload.c
> +++ b/lib/igt_dummyload.c
> @@ -71,6 +71,35 @@ fill_reloc(struct drm_i915_gem_relocation_entry *reloc,
> reloc->write_domain = write_domains;
> }
>
> +static int __igt_spin_batch_submit(int fd, igt_spin_t *spin)
> +{
> + int fence_fd = -1;
> + unsigned int i;
> +
> + for (i = 0; i < spin->nengine; i++) {
> + spin->execbuf.flags &= ~ENGINE_MASK;
> + spin->execbuf.flags |= spin->engines[i];
> + gem_execbuf_wr(fd, &spin->execbuf);
> + if (spin->out_fence_requested) {
> + int _fd = spin->execbuf.rsvd2 >> 32;
> +
> + igt_assert(_fd >= 0);
> + if (fence_fd == -1) {
> + fence_fd = _fd;
> + } else {
> + int old_fd = fence_fd;
> +
> + fence_fd = sync_fence_merge(old_fd, _fd);
> + close(old_fd);
> + close(_fd);
> + }
> + igt_assert(fence_fd >= 0);
> + }
> + }
> +
> + return fence_fd;
> +}
> +
> static int emit_recursive_batch(igt_spin_t *spin,
> int fd, uint32_t ctx, unsigned engine,
> uint32_t dep, bool out_fence)
> @@ -78,52 +107,46 @@ static int emit_recursive_batch(igt_spin_t *spin,
> #define SCRATCH 0
> #define BATCH 1
> const int gen = intel_gen(intel_get_drm_devid(fd));
> - struct drm_i915_gem_exec_object2 obj[2];
> - struct drm_i915_gem_relocation_entry relocs[2];
> - struct drm_i915_gem_execbuffer2 execbuf;
> - unsigned int engines[16];
> - unsigned int nengine;
> - int fence_fd = -1;
> uint32_t *batch;
> - int i;
>
> - nengine = 0;
> + spin->nengine = 0;
> if (engine == -1) {
> for_each_engine(fd, engine)
> if (engine)
> - engines[nengine++] = engine;
> + spin->engines[spin->nengine++] = engine;
> } else {
> gem_require_ring(fd, engine);
> - engines[nengine++] = engine;
> + spin->engines[spin->nengine++] = engine;
> }
> - igt_require(nengine);
> + igt_require(spin->nengine);
>
> - memset(&execbuf, 0, sizeof(execbuf));
> - memset(obj, 0, sizeof(obj));
> - memset(relocs, 0, sizeof(relocs));
> + memset(&spin->execbuf, 0, sizeof(spin->execbuf));
> + memset(spin->obj, 0, sizeof(spin->obj));
> + memset(spin->relocs, 0, sizeof(spin->relocs));
>
> - obj[BATCH].handle = gem_create(fd, BATCH_SIZE);
> - batch = __gem_mmap__wc(fd, obj[BATCH].handle,
> + spin->obj[BATCH].handle = gem_create(fd, BATCH_SIZE);
> + batch = __gem_mmap__wc(fd, spin->obj[BATCH].handle,
> 0, BATCH_SIZE, PROT_WRITE);
> if (!batch)
> - batch = __gem_mmap__gtt(fd, obj[BATCH].handle,
> + batch = __gem_mmap__gtt(fd, spin->obj[BATCH].handle,
> BATCH_SIZE, PROT_WRITE);
> - gem_set_domain(fd, obj[BATCH].handle,
> + gem_set_domain(fd, spin->obj[BATCH].handle,
> I915_GEM_DOMAIN_GTT, I915_GEM_DOMAIN_GTT);
> - execbuf.buffer_count++;
> + spin->execbuf.buffer_count++;
>
> if (dep) {
> /* dummy write to dependency */
> - obj[SCRATCH].handle = dep;
> - fill_reloc(&relocs[obj[BATCH].relocation_count++],
> + spin->obj[SCRATCH].handle = dep;
> + fill_reloc(&spin->relocs[spin->obj[BATCH].relocation_count++],
> dep, 1020,
> I915_GEM_DOMAIN_RENDER,
> I915_GEM_DOMAIN_RENDER);
> - execbuf.buffer_count++;
> + spin->execbuf.buffer_count++;
> }
>
> spin->batch = batch;
> - spin->handle = obj[BATCH].handle;
> + spin->handle = spin->obj[BATCH].handle;
> + spin->out_fence_requested = out_fence;
>
> /* Allow ourselves to be preempted */
> *batch++ = MI_ARB_CHK;
> @@ -142,8 +165,8 @@ static int emit_recursive_batch(igt_spin_t *spin,
> batch += 1000;
>
> /* recurse */
> - fill_reloc(&relocs[obj[BATCH].relocation_count],
> - obj[BATCH].handle, (batch - spin->batch) + 1,
> + fill_reloc(&spin->relocs[spin->obj[BATCH].relocation_count],
> + spin->obj[BATCH].handle, (batch - spin->batch) + 1,
> I915_GEM_DOMAIN_COMMAND, 0);
> if (gen >= 8) {
> *batch++ = MI_BATCH_BUFFER_START | 1 << 8 | 1;
> @@ -157,41 +180,21 @@ static int emit_recursive_batch(igt_spin_t *spin,
> *batch = 0;
> if (gen < 4) {
> *batch |= 1;
> - relocs[obj[BATCH].relocation_count].delta = 1;
> + spin->relocs[spin->obj[BATCH].relocation_count].delta = 1;
> }
> batch++;
> }
> - obj[BATCH].relocation_count++;
> - obj[BATCH].relocs_ptr = to_user_pointer(relocs);
> + spin->obj[BATCH].relocation_count++;
> + spin->obj[BATCH].relocs_ptr = to_user_pointer(spin->relocs);
>
> - execbuf.buffers_ptr = to_user_pointer(obj + (2 - execbuf.buffer_count));
> - execbuf.rsvd1 = ctx;
> + spin->execbuf.buffers_ptr =
> + to_user_pointer(spin->obj + (2 - spin->execbuf.buffer_count));
> + spin->execbuf.rsvd1 = ctx;
>
> if (out_fence)
> - execbuf.flags |= I915_EXEC_FENCE_OUT;
> -
> - for (i = 0; i < nengine; i++) {
> - execbuf.flags &= ~ENGINE_MASK;
> - execbuf.flags |= engines[i];
> - gem_execbuf_wr(fd, &execbuf);
> - if (out_fence) {
> - int _fd = execbuf.rsvd2 >> 32;
> -
> - igt_assert(_fd >= 0);
> - if (fence_fd == -1) {
> - fence_fd = _fd;
> - } else {
> - int old_fd = fence_fd;
> -
> - fence_fd = sync_fence_merge(old_fd, _fd);
> - close(old_fd);
> - close(_fd);
> - }
> - igt_assert(fence_fd >= 0);
> - }
> - }
> + spin->execbuf.flags |= I915_EXEC_FENCE_OUT;
>
> - return fence_fd;
> + return __igt_spin_batch_submit(fd, spin);
> }
>
> static igt_spin_t *
> @@ -273,6 +276,47 @@ igt_spin_batch_new_fence(int fd, uint32_t ctx, unsigned engine)
> return __igt_spin_batch_new_fence(fd, ctx, engine);
> }
>
> +/**
> + * __igt_spin_batch_restart:
> + * @fd: open i915 drm file descriptor
> + * @spin: spin batch state from igt_spin_batch_new()
> + *
> + * Restarts the spin batch which was previously ended either explicitly
> + * or via timeout.
> + *
> + * This version does not verify that the batch is currently idle.
> + *
> + * Returns:
> + * New fence fd if spin batch was originaly created as requesting the
> + * output fence.
> + */
> +int __igt_spin_batch_restart(int fd, igt_spin_t *spin)
> +{
> + *spin->batch = MI_ARB_CHK;
> + __sync_synchronize();
Hmm, I would maybe assert(*spin->batch == MI_BBE), but the mfence here
is a part of the following submit (i.e. as this batch is idle, and can
only be to work reliably, we don't need an explicit mfence as that is
handled for us by submit.)
> +
> + return __igt_spin_batch_submit(fd, spin);
> +}
> +
> +/**
> + * igt_spin_batch_restart:
> + * @fd: open i915 drm file descriptor
> + * @spin: spin batch state from igt_spin_batch_new()
> + *
> + * Restarts the spin batch which was previously ended either explicitly
> + * or via timeout.
> + *
> + * Returns:
> + * New fence fd if spin batch was originaly created as requesting the
> + * output fence.
> + */
> +int igt_spin_batch_restart(int fd, igt_spin_t *spin)
> +{
> + igt_assert(!gem_bo_busy(fd, spin->handle));
> +
> + return __igt_spin_batch_restart(fd, spin);
> +}
> +
> static void notify(union sigval arg)
> {
> igt_spin_t *spin = arg.sival_ptr;
> diff --git a/lib/igt_dummyload.h b/lib/igt_dummyload.h
> index ffa7e351dea3..b9f201d4afb6 100644
> --- a/lib/igt_dummyload.h
> +++ b/lib/igt_dummyload.h
> @@ -36,6 +36,12 @@ typedef struct igt_spin {
> struct igt_list link;
> uint32_t *batch;
> int out_fence;
> + struct drm_i915_gem_exec_object2 obj[2];
> + struct drm_i915_gem_relocation_entry relocs[2];
> + struct drm_i915_gem_execbuffer2 execbuf;
I'm dubious whether we want to emit the dependency obj on resubmit. I
can see where it may be desired, and where it may be a hindrance.
I think I'm coming down on the side that to reemit the dependency is
surprising, and would argue that if that is desired it should be an
explicit parameter to restart().
-Chris
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [igt-dev] [PATCH i-g-t 1/2] lib/dummyload: Allow spin batches to be restarted
2018-01-31 15:44 ` [igt-dev] [PATCH i-g-t 1/2] " Chris Wilson
@ 2018-01-31 15:49 ` Chris Wilson
2018-01-31 17:24 ` Tvrtko Ursulin
0 siblings, 1 reply; 9+ messages in thread
From: Chris Wilson @ 2018-01-31 15:49 UTC (permalink / raw)
To: Tvrtko Ursulin, igt-dev; +Cc: Tvrtko Ursulin
Quoting Chris Wilson (2018-01-31 15:44:41)
> Quoting Tvrtko Ursulin (2018-01-31 12:34:40)
> > diff --git a/lib/igt_dummyload.h b/lib/igt_dummyload.h
> > index ffa7e351dea3..b9f201d4afb6 100644
> > --- a/lib/igt_dummyload.h
> > +++ b/lib/igt_dummyload.h
> > @@ -36,6 +36,12 @@ typedef struct igt_spin {
> > struct igt_list link;
> > uint32_t *batch;
> > int out_fence;
> > + struct drm_i915_gem_exec_object2 obj[2];
> > + struct drm_i915_gem_relocation_entry relocs[2];
> > + struct drm_i915_gem_execbuffer2 execbuf;
>
> I'm dubious whether we want to emit the dependency obj on resubmit. I
> can see where it may be desired, and where it may be a hindrance.
>
> I think I'm coming down on the side that to reemit the dependency is
> surprising, and would argue that if that is desired it should be an
> explicit parameter to restart().
Stronger hint that it is surprising to remit the dependency obj is that
it is owned by the caller, who may not realise it has been captured by
the spin batch and will call gem_close() on it.
-Chris
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply [flat|nested] 9+ messages in thread
* [igt-dev] ✗ Fi.CI.IGT: failure for series starting with [i-g-t,1/2] lib/dummyload: Allow spin batches to be restarted
2018-01-31 12:34 [igt-dev] [PATCH i-g-t 1/2] lib/dummyload: Allow spin batches to be restarted Tvrtko Ursulin
` (2 preceding siblings ...)
2018-01-31 15:44 ` [igt-dev] [PATCH i-g-t 1/2] " Chris Wilson
@ 2018-01-31 16:47 ` Patchwork
2018-01-31 17:26 ` Tvrtko Ursulin
3 siblings, 1 reply; 9+ messages in thread
From: Patchwork @ 2018-01-31 16:47 UTC (permalink / raw)
To: Tvrtko Ursulin; +Cc: igt-dev
== Series Details ==
Series: series starting with [i-g-t,1/2] lib/dummyload: Allow spin batches to be restarted
URL : https://patchwork.freedesktop.org/series/37406/
State : failure
== Summary ==
Test perf_pmu:
Subgroup semaphore-wait-bcs0:
fail -> PASS (shard-apl) fdo#104829
Subgroup busy-check-all-vcs0:
pass -> FAIL (shard-apl)
Test drv_suspend:
Subgroup forcewake:
pass -> SKIP (shard-snb)
Test kms_flip:
Subgroup plain-flip-fb-recreate:
pass -> FAIL (shard-hsw) fdo#100368
Subgroup blocking-wf_vblank:
pass -> FAIL (shard-hsw) fdo#103928
Test kms_flip_tiling:
Subgroup flip-changes-tiling-y:
pass -> FAIL (shard-apl) fdo#103822
fdo#104829 https://bugs.freedesktop.org/show_bug.cgi?id=104829
fdo#100368 https://bugs.freedesktop.org/show_bug.cgi?id=100368
fdo#103928 https://bugs.freedesktop.org/show_bug.cgi?id=103928
fdo#103822 https://bugs.freedesktop.org/show_bug.cgi?id=103822
shard-apl total:2853 pass:1763 dwarn:1 dfail:0 fail:22 skip:1067 time:12801s
shard-hsw total:2853 pass:1734 dwarn:1 dfail:0 fail:12 skip:1105 time:11954s
shard-snb total:2853 pass:1329 dwarn:1 dfail:0 fail:10 skip:1513 time:6568s
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_841/shards.html
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [igt-dev] [PATCH i-g-t 1/2] lib/dummyload: Allow spin batches to be restarted
2018-01-31 15:49 ` Chris Wilson
@ 2018-01-31 17:24 ` Tvrtko Ursulin
0 siblings, 0 replies; 9+ messages in thread
From: Tvrtko Ursulin @ 2018-01-31 17:24 UTC (permalink / raw)
To: Chris Wilson, Tvrtko Ursulin, igt-dev; +Cc: Tvrtko Ursulin
On 31/01/2018 15:49, Chris Wilson wrote:
> Quoting Chris Wilson (2018-01-31 15:44:41)
>> Quoting Tvrtko Ursulin (2018-01-31 12:34:40)
>>> diff --git a/lib/igt_dummyload.h b/lib/igt_dummyload.h
>>> index ffa7e351dea3..b9f201d4afb6 100644
>>> --- a/lib/igt_dummyload.h
>>> +++ b/lib/igt_dummyload.h
>>> @@ -36,6 +36,12 @@ typedef struct igt_spin {
>>> struct igt_list link;
>>> uint32_t *batch;
>>> int out_fence;
>>> + struct drm_i915_gem_exec_object2 obj[2];
>>> + struct drm_i915_gem_relocation_entry relocs[2];
>>> + struct drm_i915_gem_execbuffer2 execbuf;
>>
>> I'm dubious whether we want to emit the dependency obj on resubmit. I
>> can see where it may be desired, and where it may be a hindrance.
>>
>> I think I'm coming down on the side that to reemit the dependency is
>> surprising, and would argue that if that is desired it should be an
>> explicit parameter to restart().
>
> Stronger hint that it is surprising to remit the dependency obj is that
> it is owned by the caller, who may not realise it has been captured by
> the spin batch and will call gem_close() on it.
Hm, I kind of cannot bring myself to care, or at least see it as a
problem. My thinking is, that if userspace uses restarts and nukes the
dependency object in the meantime, it will get to know its mistake soon
enough.
In other words, the only way in which the dependency has been "captured"
is if caller explicitly uses the API.
So to me it still sounds logical to repeat the exactly same submission
as was the original one.
But ultimately I care much more about getting this test done over API
details so can change this if you insist.
Regards,
Tvrtko
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [igt-dev] ✗ Fi.CI.IGT: failure for series starting with [i-g-t,1/2] lib/dummyload: Allow spin batches to be restarted
2018-01-31 16:47 ` [igt-dev] ✗ Fi.CI.IGT: failure for series starting with [i-g-t,1/2] " Patchwork
@ 2018-01-31 17:26 ` Tvrtko Ursulin
2018-01-31 21:21 ` Chris Wilson
0 siblings, 1 reply; 9+ messages in thread
From: Tvrtko Ursulin @ 2018-01-31 17:26 UTC (permalink / raw)
To: igt-dev, Patchwork, Tvrtko Ursulin
On 31/01/2018 16:47, Patchwork wrote:
> == Series Details ==
>
> Series: series starting with [i-g-t,1/2] lib/dummyload: Allow spin batches to be restarted
> URL : https://patchwork.freedesktop.org/series/37406/
> State : failure
>
> == Summary ==
>
> Test perf_pmu:
> Subgroup semaphore-wait-bcs0:
> fail -> PASS (shard-apl) fdo#104829
> Subgroup busy-check-all-vcs0:
> pass -> FAIL (shard-apl)
Bah this needs a revisit.
But the accuracy tests have all passes on APL!
To bad KBL is AWOL(?!) so I cannot marvel at the PWM accuracy on a big
core. :)
Regards,
Tvrtko
> Test drv_suspend:
> Subgroup forcewake:
> pass -> SKIP (shard-snb)
> Test kms_flip:
> Subgroup plain-flip-fb-recreate:
> pass -> FAIL (shard-hsw) fdo#100368
> Subgroup blocking-wf_vblank:
> pass -> FAIL (shard-hsw) fdo#103928
> Test kms_flip_tiling:
> Subgroup flip-changes-tiling-y:
> pass -> FAIL (shard-apl) fdo#103822
>
> fdo#104829 https://bugs.freedesktop.org/show_bug.cgi?id=104829
> fdo#100368 https://bugs.freedesktop.org/show_bug.cgi?id=100368
> fdo#103928 https://bugs.freedesktop.org/show_bug.cgi?id=103928
> fdo#103822 https://bugs.freedesktop.org/show_bug.cgi?id=103822
>
> shard-apl total:2853 pass:1763 dwarn:1 dfail:0 fail:22 skip:1067 time:12801s
> shard-hsw total:2853 pass:1734 dwarn:1 dfail:0 fail:12 skip:1105 time:11954s
> shard-snb total:2853 pass:1329 dwarn:1 dfail:0 fail:10 skip:1513 time:6568s
>
> == Logs ==
>
> For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_841/shards.html
> _______________________________________________
> igt-dev mailing list
> igt-dev@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/igt-dev
>
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [igt-dev] ✗ Fi.CI.IGT: failure for series starting with [i-g-t,1/2] lib/dummyload: Allow spin batches to be restarted
2018-01-31 17:26 ` Tvrtko Ursulin
@ 2018-01-31 21:21 ` Chris Wilson
0 siblings, 0 replies; 9+ messages in thread
From: Chris Wilson @ 2018-01-31 21:21 UTC (permalink / raw)
To: Tvrtko Ursulin, igt-dev, Patchwork, Tvrtko Ursulin
Quoting Tvrtko Ursulin (2018-01-31 17:26:24)
>
> On 31/01/2018 16:47, Patchwork wrote:
> > == Series Details ==
> >
> > Series: series starting with [i-g-t,1/2] lib/dummyload: Allow spin batches to be restarted
> > URL : https://patchwork.freedesktop.org/series/37406/
> > State : failure
> >
> > == Summary ==
> >
> > Test perf_pmu:
> > Subgroup semaphore-wait-bcs0:
> > fail -> PASS (shard-apl) fdo#104829
> > Subgroup busy-check-all-vcs0:
> > pass -> FAIL (shard-apl)
>
> Bah this needs a revisit.
Throw in the towel and run as RT? But take a look through them and see
if you can spot where we lose track of time. :|
-Chris
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2018-01-31 21:21 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-01-31 12:34 [igt-dev] [PATCH i-g-t 1/2] lib/dummyload: Allow spin batches to be restarted Tvrtko Ursulin
2018-01-31 12:34 ` [igt-dev] [PATCH i-g-t 2/2] tests/perf_pmu: Verify engine busyness accuracy Tvrtko Ursulin
2018-01-31 13:18 ` [igt-dev] ✓ Fi.CI.BAT: success for series starting with [i-g-t,1/2] lib/dummyload: Allow spin batches to be restarted Patchwork
2018-01-31 15:44 ` [igt-dev] [PATCH i-g-t 1/2] " Chris Wilson
2018-01-31 15:49 ` Chris Wilson
2018-01-31 17:24 ` Tvrtko Ursulin
2018-01-31 16:47 ` [igt-dev] ✗ Fi.CI.IGT: failure for series starting with [i-g-t,1/2] " Patchwork
2018-01-31 17:26 ` Tvrtko Ursulin
2018-01-31 21:21 ` Chris Wilson
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.