[Piglit] [PATCH 1/3] Make atomic counter tests more robust against race conditions.
Jordan Justen
jordan.l.justen at intel.com
Wed Oct 21 12:48:35 PDT 2015
Series Reviewed-by: Jordan Justen <jordan.l.justen at intel.com>
On 2015-10-21 01:11:25, Kenneth Graunke wrote:
> From: Chris Wilson <chris at chris-wilson.co.uk>
>
> Drivers with synchronization bugs could generate errors such as:
>
> Probe value at (0)
> Expected: 0x00000001
> Observed: 0x00000001
>
> This is because the initial comparison and the print statement access
> the buffer at different times, leading to the following scenario.
>
> 1. Comparison reads wrong value from the buffer (test properly fails).
> 2. Right value finally lands in buffer.
> 3. Error message prints the current value...which is the not the value
> used by the comparison. Instead, it's the expected value, so the
> message makes no sense.
>
> [Ken imported this patch from Chris Wilson's Bugzilla comment linked
> below and wrote a commit message.]
>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=91298
> Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>
> ---
> tests/spec/arb_shader_atomic_counters/common.c | 12 +++++++-----
> 1 file changed, 7 insertions(+), 5 deletions(-)
>
> Chris, I made you the author on this patch since it's your code.
> It didn't look like a patch ever hit the mailing list, so I went
> ahead and put one together...
>
> diff --git a/tests/spec/arb_shader_atomic_counters/common.c b/tests/spec/arb_shader_atomic_counters/common.c
> index b966009..c732699 100644
> --- a/tests/spec/arb_shader_atomic_counters/common.c
> +++ b/tests/spec/arb_shader_atomic_counters/common.c
> @@ -35,6 +35,7 @@ atomic_counters_probe_buffer(unsigned base, unsigned count,
> uint32_t *p = glMapBufferRange(
> GL_ATOMIC_COUNTER_BUFFER, base * sizeof(uint32_t),
> count * sizeof(uint32_t), GL_MAP_READ_BIT);
> + bool pass = true;
> unsigned i;
>
> if (!p) {
> @@ -43,17 +44,18 @@ atomic_counters_probe_buffer(unsigned base, unsigned count,
> }
>
> for (i = 0; i < count; ++i) {
> - if (p[i] != expected[i]) {
> + uint32_t found = p[i];
> + if (found != expected[i]) {
> printf("Probe value at (%i)\n", i);
> printf(" Expected: 0x%08x\n", expected[i]);
> - printf(" Observed: 0x%08x\n", p[i]);
> - glUnmapBuffer(GL_ATOMIC_COUNTER_BUFFER);
> - return false;
> + printf(" Observed: 0x%08x\n", found);
> + pass = false;
> + break;
> }
> }
>
> glUnmapBuffer(GL_ATOMIC_COUNTER_BUFFER);
> - return true;
> + return pass;
> }
>
> bool
> --
> 2.6.1
>
> _______________________________________________
> Piglit mailing list
> Piglit at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/piglit
More information about the Piglit
mailing list