When we expect an engine to be busy, we check if its reported busy time falls within a +/-5% tolerance range of measurement time period. However, when we expect the engine to be idle, we compare its reported busy time against zero, still with a +/-5% tolerance range, but now calculated against the zero value, then no tolerance at all. Obviously, such check fails when the reported busy time is not exactly zero. Compare engine idle time against measurement time period instead of comparing its busy time against zero when we expect the busy time to be close to zero. As a debugging aid, display messages with the compared values when requested via --debug option or when a failure occurs. Closes: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/7742 Suggested-by: Chris Wilson <chris.p.wilson@xxxxxxxxxxxxxxx> Signed-off-by: Janusz Krzysztofik <janusz.krzysztofik@xxxxxxxxxxxxxxx> --- tests/intel/drm_fdinfo.c | 51 ++++++++++++++++++++-------------------- 1 file changed, 25 insertions(+), 26 deletions(-) diff --git a/tests/intel/drm_fdinfo.c b/tests/intel/drm_fdinfo.c index 43216a64e..45d17aaaa 100644 --- a/tests/intel/drm_fdinfo.c +++ b/tests/intel/drm_fdinfo.c @@ -107,12 +107,18 @@ static const char *engine_map[] = { }; #define __assert_within_epsilon(x, ref, tol_up, tol_down) \ - igt_assert_f((double)(x) <= (1.0 + (tol_up)) * (double)(ref) && \ - (double)(x) >= (1.0 - (tol_down)) * (double)(ref), \ - "'%s' != '%s' (%f not within +%.1f%%/-%.1f%% tolerance of %f)\n",\ - #x, #ref, (double)(x), \ - (tol_up) * 100.0, (tol_down) * 100.0, \ - (double)(ref)) + do { \ + igt_assert_f((double)(x) <= (1.0 + (tol_up)) * (double)(ref) && \ + (double)(x) >= (1.0 - (tol_down)) * (double)(ref), \ + "'%s' != '%s' (%f not within +%.1f%%/-%.1f%% tolerance of %f)\n",\ + #x, #ref, (double)(x), \ + (tol_up) * 100.0, (tol_down) * 100.0, \ + (double)(ref)); \ + igt_debug("%f within +%.1f%%/-%.1f%% tolerance of %f\n",\ + (double)(x), \ + (tol_up) * 100.0, (tol_down) * 100.0, \ + (double)(ref)); \ + } while (0) #define assert_within_epsilon(x, ref, tolerance) \ __assert_within_epsilon(x, ref, tolerance, tolerance) @@ -241,10 +247,8 @@ single(int gem_fd, const intel_ctx_t *ctx, else end_spin(spin_fd, spin, FLAG_SYNC); - assert_within_epsilon(val, - (flags & TEST_BUSY) && !(flags & TEST_ISOLATION) ? - slept : 0.0f, - tolerance); + assert_within_epsilon((flags & TEST_BUSY) && !(flags & TEST_ISOLATION) ? val : slept - val, + slept, tolerance); /* Check for idle after hang. */ if (flags & FLAG_HANG) { @@ -255,7 +259,7 @@ single(int gem_fd, const intel_ctx_t *ctx, slept = measured_usleep(batch_duration_ns / 1000); val = read_engine_time(gem_fd, e->class) - val; - assert_within_epsilon(val, 0, tolerance); + assert_within_epsilon(slept - val, slept, tolerance); } igt_spin_free(spin_fd, spin); @@ -328,11 +332,8 @@ busy_check_all(int gem_fd, const intel_ctx_t *ctx, log_busy(num_classes, val); - for (i = 0; i < num_classes; i++) { - double target = i == e->class ? slept : 0.0f; - - assert_within_epsilon(val[i], target, tolerance); - } + for (i = 0; i < num_classes; i++) + assert_within_epsilon(i == e->class ? val[i] : slept - val[i], slept, tolerance); gem_quiescent_gpu(gem_fd); } @@ -405,9 +406,9 @@ most_busy_check_all(int gem_fd, const intel_ctx_t *ctx, log_busy(num_classes, val); for (i = 0; i < num_classes; i++) { - double target = slept * busy_class[i]; + double target = slept * busy_class[i] ?: slept; - assert_within_epsilon(val[i], target, tolerance); + assert_within_epsilon(busy_class[i] ? val[i] : slept - val[i], target, tolerance); } gem_quiescent_gpu(gem_fd); } @@ -460,9 +461,9 @@ all_busy_check_all(int gem_fd, const intel_ctx_t *ctx, log_busy(num_classes, val); for (i = 0; i < num_classes; i++) { - double target = slept * busy_class[i]; + double target = slept * busy_class[i] ?: slept; - assert_within_epsilon(val[i], target, tolerance); + assert_within_epsilon(busy_class[i] ? val[i] : slept - val[i], target, tolerance); } gem_quiescent_gpu(gem_fd); } @@ -601,10 +602,8 @@ virtual(int i915, const intel_ctx_cfg_t *base_cfg, unsigned int flags) else end_spin(i915, spin, FLAG_SYNC); - assert_within_epsilon(val, - flags & TEST_BUSY ? - slept : 0.0f, - tolerance); + assert_within_epsilon(flags & TEST_BUSY ? val : slept - val, + slept, tolerance); /* Check for idle after hang. */ if (flags & FLAG_HANG) { @@ -616,7 +615,7 @@ virtual(int i915, const intel_ctx_cfg_t *base_cfg, unsigned int flags) 1000); val = read_engine_time(i915, class) - val; - assert_within_epsilon(val, 0, tolerance); + assert_within_epsilon(slept - val, slept, tolerance); } igt_spin_free(i915, spin); @@ -724,7 +723,7 @@ virtual_all(int i915, const intel_ctx_cfg_t *base_cfg, unsigned int flags) 1000); val = read_engine_time(i915, class) - val; - assert_within_epsilon(val, 0, tolerance); + assert_within_epsilon(slept - val, slept, tolerance); } igt_spin_free(i915, spin); -- 2.45.2