* [igt-dev] [PATCH igt v3] igt/perf_pmu: Use a self-correcting busy pwm
@ 2018-02-21 12:10 Chris Wilson
2018-02-21 13:00 ` Tvrtko Ursulin
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Chris Wilson @ 2018-02-21 12:10 UTC (permalink / raw)
To: intel-gfx; +Cc: igt-dev, Tvrtko Ursulin
Convert the busy pwm from using a single calibration pass with a fixed
target into a self-correcting pwm that tries to adjust how long to sleep
on each pwm in order to converge at the target busy %%.
Being self-correcting, it should fare better against the more variable
systems CI presents.
v2: Be fair and equally strict for low/high busy %%
v3: target_idle_us and calculate expected from timing of each individual pass
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=105157
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
---
tests/perf_pmu.c | 74 ++++++++++++++++++++++++++------------------------------
1 file changed, 34 insertions(+), 40 deletions(-)
diff --git a/tests/perf_pmu.c b/tests/perf_pmu.c
index 7fab73e2..98d8dbff 100644
--- a/tests/perf_pmu.c
+++ b/tests/perf_pmu.c
@@ -1422,9 +1422,10 @@ accuracy(int gem_fd, const struct intel_execution_engine2 *e,
busy_us / 100) / target_busy_pct;
unsigned long pwm_calibration_us;
unsigned long test_us;
- double busy_r;
+ double busy_r, expected;
uint64_t val[2];
uint64_t ts[2];
+ int link[2];
int fd;
/* Sampling platforms cannot reach the high accuracy criteria. */
@@ -1450,14 +1451,16 @@ accuracy(int gem_fd, const struct intel_execution_engine2 *e,
assert_within_epsilon((double)busy_us / (busy_us + idle_us),
(double)target_busy_pct / 100.0, tolerance);
+ igt_assert(pipe(link) == 0);
+
/* 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;
+ const unsigned long timeout[] = {
+ pwm_calibration_us * 1000, test_us * 2 * 1000
+ };
struct drm_i915_gem_exec_object2 obj = {};
+ uint64_t total_busy_ns = 0, total_idle_ns = 0;
igt_spin_t *spin;
int ret;
@@ -1478,76 +1481,67 @@ accuracy(int gem_fd, const struct intel_execution_engine2 *e,
/* 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;
+ uint64_t busy_ns = -total_busy_ns;
+ uint64_t idle_ns = -total_idle_ns;
struct timespec test_start = { };
- unsigned long loops = 0;
- double err_busy, err_idle;
igt_nsec_elapsed(&test_start);
do {
struct timespec t_busy = { };
+ unsigned int target_idle_us;
igt_nsec_elapsed(&t_busy);
/* Restart the spinbatch. */
__rearm_spin_batch(spin);
__submit_spin_batch(gem_fd, &obj, e);
- measured_usleep(sleep_busy);
+ measured_usleep(busy_us);
igt_spin_batch_end(spin);
gem_sync(gem_fd, obj.handle);
- busy_ns += igt_nsec_elapsed(&t_busy);
+ total_busy_ns += igt_nsec_elapsed(&t_busy);
- idle_ns += measured_usleep(sleep_idle);
-
- loops++;
+ target_idle_us =
+ (100 * total_busy_ns / target_busy_pct - (total_busy_ns + total_idle_ns)) / 1000;
+ total_idle_ns += measured_usleep(target_idle_us);
} while (igt_nsec_elapsed(&test_start) < timeout[pass]);
- 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 ratio %.2f%% (%lu/%lu)\n",
- (double)sleep_busy /
- (sleep_busy + sleep_idle) * 100.0,
- sleep_busy, sleep_idle);
- }
+ busy_ns += total_busy_ns;
+ idle_ns += total_idle_ns;
+
+ expected = (double)busy_ns / (busy_ns + idle_ns);
+ igt_info("%u: busy %luus, idle %luus: %.2f%% (target: %lu%%)\n",
+ pass, busy_ns / 1000, idle_ns / 1000,
+ 100 * expected, target_busy_pct);
+ write(link[1], &expected, sizeof(expected));
}
igt_spin_batch_free(gem_fd, spin);
}
/* Let the child run. */
- usleep(pwm_calibration_us * 2);
+ read(link[0], &expected, sizeof(expected));
+ assert_within_epsilon(expected, target_busy_pct/100., 0.05);
/* 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);
+ read(link[0], &expected, sizeof(expected));
val[1] = __pmu_read_single(fd, &ts[1]);
close(fd);
+ close(link[1]);
+ close(link[0]);
+
igt_waitchildren();
busy_r = (double)(val[1] - val[0]) / (ts[1] - ts[0]);
- igt_info("error=%.2f%% (%.2f%% vs %lu%%)\n",
- __error(busy_r, target_busy_pct / 100.0),
- busy_r * 100.0, target_busy_pct);
+ igt_info("error=%.2f%% (%.2f%% vs %.2f%%)\n",
+ __error(busy_r, expected), 100 * busy_r, 100 * expected);
- assert_within_epsilon(busy_r, (double)target_busy_pct / 100.0, 0.15);
+ assert_within_epsilon(busy_r, expected, 0.15);
+ assert_within_epsilon(1 - busy_r, 1 - expected, 0.15);
}
igt_main
--
2.16.1
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply related [flat|nested] 4+ messages in thread* Re: [igt-dev] [PATCH igt v3] igt/perf_pmu: Use a self-correcting busy pwm
2018-02-21 12:10 [igt-dev] [PATCH igt v3] igt/perf_pmu: Use a self-correcting busy pwm Chris Wilson
@ 2018-02-21 13:00 ` Tvrtko Ursulin
2018-02-21 17:37 ` [igt-dev] ✓ Fi.CI.BAT: success for igt/perf_pmu: Use a self-correcting busy pwm (rev3) Patchwork
2018-02-21 22:43 ` [igt-dev] ✓ Fi.CI.IGT: " Patchwork
2 siblings, 0 replies; 4+ messages in thread
From: Tvrtko Ursulin @ 2018-02-21 13:00 UTC (permalink / raw)
To: Chris Wilson, intel-gfx; +Cc: igt-dev, Tvrtko Ursulin
On 21/02/2018 12:10, Chris Wilson wrote:
> Convert the busy pwm from using a single calibration pass with a fixed
> target into a self-correcting pwm that tries to adjust how long to sleep
> on each pwm in order to converge at the target busy %%.
>
> Being self-correcting, it should fare better against the more variable
> systems CI presents.
>
> v2: Be fair and equally strict for low/high busy %%
> v3: target_idle_us and calculate expected from timing of each individual pass
>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=105157
> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
> Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
> ---
> tests/perf_pmu.c | 74 ++++++++++++++++++++++++++------------------------------
> 1 file changed, 34 insertions(+), 40 deletions(-)
>
> diff --git a/tests/perf_pmu.c b/tests/perf_pmu.c
> index 7fab73e2..98d8dbff 100644
> --- a/tests/perf_pmu.c
> +++ b/tests/perf_pmu.c
> @@ -1422,9 +1422,10 @@ accuracy(int gem_fd, const struct intel_execution_engine2 *e,
> busy_us / 100) / target_busy_pct;
> unsigned long pwm_calibration_us;
> unsigned long test_us;
> - double busy_r;
> + double busy_r, expected;
> uint64_t val[2];
> uint64_t ts[2];
> + int link[2];
> int fd;
>
> /* Sampling platforms cannot reach the high accuracy criteria. */
> @@ -1450,14 +1451,16 @@ accuracy(int gem_fd, const struct intel_execution_engine2 *e,
> assert_within_epsilon((double)busy_us / (busy_us + idle_us),
> (double)target_busy_pct / 100.0, tolerance);
>
> + igt_assert(pipe(link) == 0);
> +
> /* 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;
> + const unsigned long timeout[] = {
> + pwm_calibration_us * 1000, test_us * 2 * 1000
> + };
> struct drm_i915_gem_exec_object2 obj = {};
> + uint64_t total_busy_ns = 0, total_idle_ns = 0;
> igt_spin_t *spin;
> int ret;
>
> @@ -1478,76 +1481,67 @@ accuracy(int gem_fd, const struct intel_execution_engine2 *e,
>
> /* 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;
> + uint64_t busy_ns = -total_busy_ns;
> + uint64_t idle_ns = -total_idle_ns;
> struct timespec test_start = { };
> - unsigned long loops = 0;
> - double err_busy, err_idle;
>
> igt_nsec_elapsed(&test_start);
> do {
> struct timespec t_busy = { };
> + unsigned int target_idle_us;
>
> igt_nsec_elapsed(&t_busy);
>
> /* Restart the spinbatch. */
> __rearm_spin_batch(spin);
> __submit_spin_batch(gem_fd, &obj, e);
> - measured_usleep(sleep_busy);
> + measured_usleep(busy_us);
> igt_spin_batch_end(spin);
> gem_sync(gem_fd, obj.handle);
>
> - busy_ns += igt_nsec_elapsed(&t_busy);
> + total_busy_ns += igt_nsec_elapsed(&t_busy);
>
> - idle_ns += measured_usleep(sleep_idle);
> -
> - loops++;
> + target_idle_us =
> + (100 * total_busy_ns / target_busy_pct - (total_busy_ns + total_idle_ns)) / 1000;
> + total_idle_ns += measured_usleep(target_idle_us);
> } while (igt_nsec_elapsed(&test_start) < timeout[pass]);
>
> - 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 ratio %.2f%% (%lu/%lu)\n",
> - (double)sleep_busy /
> - (sleep_busy + sleep_idle) * 100.0,
> - sleep_busy, sleep_idle);
> - }
> + busy_ns += total_busy_ns;
> + idle_ns += total_idle_ns;
> +
> + expected = (double)busy_ns / (busy_ns + idle_ns);
> + igt_info("%u: busy %luus, idle %luus: %.2f%% (target: %lu%%)\n",
> + pass, busy_ns / 1000, idle_ns / 1000,
> + 100 * expected, target_busy_pct);
> + write(link[1], &expected, sizeof(expected));
> }
>
> igt_spin_batch_free(gem_fd, spin);
> }
>
> /* Let the child run. */
> - usleep(pwm_calibration_us * 2);
> + read(link[0], &expected, sizeof(expected));
> + assert_within_epsilon(expected, target_busy_pct/100., 0.05);
>
> /* 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);
> + read(link[0], &expected, sizeof(expected));
> val[1] = __pmu_read_single(fd, &ts[1]);
> close(fd);
>
> + close(link[1]);
> + close(link[0]);
> +
> igt_waitchildren();
>
> busy_r = (double)(val[1] - val[0]) / (ts[1] - ts[0]);
>
> - igt_info("error=%.2f%% (%.2f%% vs %lu%%)\n",
> - __error(busy_r, target_busy_pct / 100.0),
> - busy_r * 100.0, target_busy_pct);
> + igt_info("error=%.2f%% (%.2f%% vs %.2f%%)\n",
> + __error(busy_r, expected), 100 * busy_r, 100 * expected);
>
> - assert_within_epsilon(busy_r, (double)target_busy_pct / 100.0, 0.15);
> + assert_within_epsilon(busy_r, expected, 0.15);
> + assert_within_epsilon(1 - busy_r, 1 - expected, 0.15);
> }
>
> igt_main
>
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Regards,
Tvrtko
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply [flat|nested] 4+ messages in thread* [igt-dev] ✓ Fi.CI.BAT: success for igt/perf_pmu: Use a self-correcting busy pwm (rev3)
2018-02-21 12:10 [igt-dev] [PATCH igt v3] igt/perf_pmu: Use a self-correcting busy pwm Chris Wilson
2018-02-21 13:00 ` Tvrtko Ursulin
@ 2018-02-21 17:37 ` Patchwork
2018-02-21 22:43 ` [igt-dev] ✓ Fi.CI.IGT: " Patchwork
2 siblings, 0 replies; 4+ messages in thread
From: Patchwork @ 2018-02-21 17:37 UTC (permalink / raw)
To: Chris Wilson; +Cc: igt-dev
== Series Details ==
Series: igt/perf_pmu: Use a self-correcting busy pwm (rev3)
URL : https://patchwork.freedesktop.org/series/38590/
State : success
== Summary ==
IGT patchset tested on top of latest successful build
960e55a87d7b7d7385063e37cc9f281df2be8037 igt/gem_ctx_isolation: Check isolation of registers between contexts
with latest DRM-Tip kernel build CI_DRM_3816
42d073db2a85 drm-tip: 2018y-02m-21d-14h-03m-58s UTC integration manifest
No testlist changes.
Test gem_mmap_gtt:
Subgroup basic-small-bo-tiledx:
pass -> FAIL (fi-gdg-551) fdo#102575
Test kms_pipe_crc_basic:
Subgroup suspend-read-crc-pipe-a:
fail -> PASS (fi-ivb-3520m)
Subgroup suspend-read-crc-pipe-b:
incomplete -> PASS (fi-snb-2520m) fdo#103713
fail -> PASS (fi-ivb-3520m)
Subgroup suspend-read-crc-pipe-c:
fail -> PASS (fi-ivb-3520m)
fdo#102575 https://bugs.freedesktop.org/show_bug.cgi?id=102575
fdo#103713 https://bugs.freedesktop.org/show_bug.cgi?id=103713
fi-bdw-5557u total:288 pass:267 dwarn:0 dfail:0 fail:0 skip:21 time:416s
fi-bdw-gvtdvm total:288 pass:264 dwarn:0 dfail:0 fail:0 skip:24 time:435s
fi-blb-e6850 total:288 pass:223 dwarn:1 dfail:0 fail:0 skip:64 time:375s
fi-bsw-n3050 total:288 pass:242 dwarn:0 dfail:0 fail:0 skip:46 time:495s
fi-bwr-2160 total:288 pass:183 dwarn:0 dfail:0 fail:0 skip:105 time:285s
fi-bxt-dsi total:288 pass:258 dwarn:0 dfail:0 fail:0 skip:30 time:476s
fi-bxt-j4205 total:288 pass:259 dwarn:0 dfail:0 fail:0 skip:29 time:481s
fi-byt-j1900 total:288 pass:253 dwarn:0 dfail:0 fail:0 skip:35 time:477s
fi-byt-n2820 total:288 pass:249 dwarn:0 dfail:0 fail:0 skip:39 time:458s
fi-cfl-s2 total:288 pass:262 dwarn:0 dfail:0 fail:0 skip:26 time:570s
fi-elk-e7500 total:288 pass:229 dwarn:0 dfail:0 fail:0 skip:59 time:415s
fi-gdg-551 total:288 pass:179 dwarn:0 dfail:0 fail:1 skip:108 time:285s
fi-glk-1 total:288 pass:260 dwarn:0 dfail:0 fail:0 skip:28 time:506s
fi-hsw-4770 total:288 pass:261 dwarn:0 dfail:0 fail:0 skip:27 time:385s
fi-ilk-650 total:288 pass:228 dwarn:0 dfail:0 fail:0 skip:60 time:410s
fi-ivb-3520m total:288 pass:259 dwarn:0 dfail:0 fail:0 skip:29 time:452s
fi-ivb-3770 total:288 pass:255 dwarn:0 dfail:0 fail:0 skip:33 time:413s
fi-kbl-7500u total:288 pass:263 dwarn:1 dfail:0 fail:0 skip:24 time:449s
fi-kbl-7560u total:288 pass:269 dwarn:0 dfail:0 fail:0 skip:19 time:493s
fi-kbl-7567u total:288 pass:268 dwarn:0 dfail:0 fail:0 skip:20 time:454s
fi-kbl-r total:288 pass:261 dwarn:0 dfail:0 fail:0 skip:27 time:494s
fi-pnv-d510 total:288 pass:222 dwarn:1 dfail:0 fail:0 skip:65 time:588s
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:500s
fi-skl-6700hq total:288 pass:262 dwarn:0 dfail:0 fail:0 skip:26 time:526s
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:468s
fi-skl-guc total:288 pass:260 dwarn:0 dfail:0 fail:0 skip:28 time:407s
fi-skl-gvtdvm total:288 pass:265 dwarn:0 dfail:0 fail:0 skip:23 time:431s
fi-snb-2520m total:288 pass:248 dwarn:0 dfail:0 fail:0 skip:40 time:525s
fi-snb-2600 total:288 pass:248 dwarn:0 dfail:0 fail:0 skip:40 time:396s
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_973/issues.html
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply [flat|nested] 4+ messages in thread* [igt-dev] ✓ Fi.CI.IGT: success for igt/perf_pmu: Use a self-correcting busy pwm (rev3)
2018-02-21 12:10 [igt-dev] [PATCH igt v3] igt/perf_pmu: Use a self-correcting busy pwm Chris Wilson
2018-02-21 13:00 ` Tvrtko Ursulin
2018-02-21 17:37 ` [igt-dev] ✓ Fi.CI.BAT: success for igt/perf_pmu: Use a self-correcting busy pwm (rev3) Patchwork
@ 2018-02-21 22:43 ` Patchwork
2 siblings, 0 replies; 4+ messages in thread
From: Patchwork @ 2018-02-21 22:43 UTC (permalink / raw)
To: Chris Wilson; +Cc: igt-dev
== Series Details ==
Series: igt/perf_pmu: Use a self-correcting busy pwm (rev3)
URL : https://patchwork.freedesktop.org/series/38590/
State : success
== Summary ==
Test kms_vblank:
Subgroup pipe-b-wait-busy-hang:
skip -> PASS (shard-snb)
Test kms_flip:
Subgroup flip-vs-panning-vs-hang-interruptible:
pass -> DMESG-WARN (shard-snb) fdo#103821
Subgroup 2x-flip-vs-absolute-wf_vblank-interruptible:
fail -> PASS (shard-hsw) fdo#100368 +2
Subgroup modeset-vs-vblank-race-interruptible:
fail -> PASS (shard-apl) fdo#103060
Test kms_rotation_crc:
Subgroup sprite-rotation-180:
fail -> PASS (shard-snb) fdo#103925 +1
Test perf:
Subgroup oa-exponents:
pass -> INCOMPLETE (shard-apl) fdo#102254
Test kms_sysfs_edid_timing:
pass -> WARN (shard-apl) fdo#100047
Test kms_atomic_transition:
Subgroup 1x-modeset-transitions-nonblocking-fencing:
fail -> PASS (shard-apl) fdo#103207
Test kms_pipe_crc_basic:
Subgroup read-crc-pipe-c-frame-sequence:
fail -> PASS (shard-apl) fdo#103481
Test kms_plane_multiple:
Subgroup legacy-pipe-b-tiling-none:
skip -> PASS (shard-snb)
fdo#103821 https://bugs.freedesktop.org/show_bug.cgi?id=103821
fdo#100368 https://bugs.freedesktop.org/show_bug.cgi?id=100368
fdo#103060 https://bugs.freedesktop.org/show_bug.cgi?id=103060
fdo#103925 https://bugs.freedesktop.org/show_bug.cgi?id=103925
fdo#102254 https://bugs.freedesktop.org/show_bug.cgi?id=102254
fdo#100047 https://bugs.freedesktop.org/show_bug.cgi?id=100047
fdo#103207 https://bugs.freedesktop.org/show_bug.cgi?id=103207
fdo#103481 https://bugs.freedesktop.org/show_bug.cgi?id=103481
shard-apl total:3333 pass:1751 dwarn:1 dfail:0 fail:11 skip:1567 time:11615s
shard-hsw total:3465 pass:1767 dwarn:1 dfail:0 fail:3 skip:1693 time:11626s
shard-snb total:3465 pass:1356 dwarn:2 dfail:0 fail:3 skip:2104 time:6611s
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_973/shards.html
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2018-02-21 22:43 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-02-21 12:10 [igt-dev] [PATCH igt v3] igt/perf_pmu: Use a self-correcting busy pwm Chris Wilson
2018-02-21 13:00 ` Tvrtko Ursulin
2018-02-21 17:37 ` [igt-dev] ✓ Fi.CI.BAT: success for igt/perf_pmu: Use a self-correcting busy pwm (rev3) Patchwork
2018-02-21 22:43 ` [igt-dev] ✓ Fi.CI.IGT: " Patchwork
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox