summaryrefslogtreecommitdiff
path: root/tests/gem_partial_pwrite_pread.c
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2016-01-08 10:40:33 +0000
committerChris Wilson <chris@chris-wilson.co.uk>2016-01-20 07:53:22 +0000
commit47b61378426002c0f71644c65c73477265a5751d (patch)
tree74a2c5e5d963f74a98d6d9c2e37ff1f64180b6cd /tests/gem_partial_pwrite_pread.c
parent6bada3e2d494e0823a31773e916c62bd36facbe7 (diff)
igt/gem_partial_pwrite_pread: Fix range computation
The range we chose to overwrite in the target had an off-by-one error that could cause it to compute a size that went past the end of the buffer (and so trigger EINVAL). Fortuituously with our seed this did not occur. Whilst changing the range calculation, update the error logging to include the range information. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'tests/gem_partial_pwrite_pread.c')
-rw-r--r--tests/gem_partial_pwrite_pread.c78
1 files changed, 37 insertions, 41 deletions
diff --git a/tests/gem_partial_pwrite_pread.c b/tests/gem_partial_pwrite_pread.c
index 0f431663..bc63910b 100644
--- a/tests/gem_partial_pwrite_pread.c
+++ b/tests/gem_partial_pwrite_pread.c
@@ -78,12 +78,12 @@ copy_bo(drm_intel_bo *src, drm_intel_bo *dst)
}
static void
-blt_bo_fill(drm_intel_bo *tmp_bo, drm_intel_bo *bo, int val)
+blt_bo_fill(drm_intel_bo *tmp_bo, drm_intel_bo *bo, uint8_t val)
{
uint8_t *gtt_ptr;
int i;
- drm_intel_gem_bo_map_gtt(tmp_bo);
+ do_or_die(drm_intel_gem_bo_map_gtt(tmp_bo));
gtt_ptr = tmp_bo->virtual;
for (i = 0; i < BO_SIZE; i++)
@@ -102,30 +102,33 @@ blt_bo_fill(drm_intel_bo *tmp_bo, drm_intel_bo *bo, int val)
#define ROUNDS 1000
uint8_t tmp[BO_SIZE];
+static void get_range(int *start, int *len)
+{
+ *start = random() % (BO_SIZE - 1);
+ *len = random() % (BO_SIZE - *start - 1) + 1;
+}
+
static void test_partial_reads(void)
{
int i, j;
igt_info("checking partial reads\n");
for (i = 0; i < ROUNDS; i++) {
+ uint8_t val = i;
int start, len;
- int val = i % 256;
-
- blt_bo_fill(staging_bo, scratch_bo, i);
- start = random() % BO_SIZE;
- len = random() % (BO_SIZE-start) + 1;
+ blt_bo_fill(staging_bo, scratch_bo, val);
- drm_intel_bo_get_subdata(scratch_bo, start, len, tmp);
+ get_range(&start, &len);
+ do_or_die(drm_intel_bo_get_subdata(scratch_bo, start, len, tmp));
for (j = 0; j < len; j++) {
igt_assert_f(tmp[j] == val,
- "mismatch at %i, got: %i, expected: %i\n",
- j, tmp[j], val);
+ "mismatch at %i [%i + %i], got: %i, expected: %i\n",
+ j, start, len, tmp[j], val);
}
igt_progress("partial reads test: ", i, ROUNDS);
}
-
}
static void test_partial_writes(void)
@@ -135,16 +138,14 @@ static void test_partial_writes(void)
igt_info("checking partial writes\n");
for (i = 0; i < ROUNDS; i++) {
+ uint8_t val = i;
int start, len;
- int val = i % 256;
- blt_bo_fill(staging_bo, scratch_bo, i);
-
- start = random() % BO_SIZE;
- len = random() % (BO_SIZE-start) + 1;
+ blt_bo_fill(staging_bo, scratch_bo, val);
memset(tmp, i + 63, BO_SIZE);
+ get_range(&start, &len);
drm_intel_bo_subdata(scratch_bo, start, len, tmp);
copy_bo(scratch_bo, staging_bo);
@@ -153,24 +154,23 @@ static void test_partial_writes(void)
for (j = 0; j < start; j++) {
igt_assert_f(gtt_ptr[j] == val,
- "mismatch at %i, got: %i, expected: %i\n",
- j, tmp[j], val);
+ "mismatch at %i (start=%i), got: %i, expected: %i\n",
+ j, start, tmp[j], val);
}
for (; j < start + len; j++) {
igt_assert_f(gtt_ptr[j] == tmp[0],
- "mismatch at %i, got: %i, expected: %i\n",
- j, tmp[j], i);
+ "mismatch at %i (%i/%i), got: %i, expected: %i\n",
+ j, j-start, len, tmp[j], i);
}
for (; j < BO_SIZE; j++) {
igt_assert_f(gtt_ptr[j] == val,
- "mismatch at %i, got: %i, expected: %i\n",
- j, tmp[j], val);
+ "mismatch at %i (end=%i), got: %i, expected: %i\n",
+ j, start+len, tmp[j], val);
}
drm_intel_gem_bo_unmap_gtt(staging_bo);
igt_progress("partial writes test: ", i, ROUNDS);
}
-
}
static void test_partial_read_writes(void)
@@ -180,53 +180,49 @@ static void test_partial_read_writes(void)
igt_info("checking partial writes after partial reads\n");
for (i = 0; i < ROUNDS; i++) {
+ uint8_t val = i;
int start, len;
- int val = i % 256;
- blt_bo_fill(staging_bo, scratch_bo, i);
+ blt_bo_fill(staging_bo, scratch_bo, val);
/* partial read */
- start = random() % BO_SIZE;
- len = random() % (BO_SIZE-start) + 1;
-
+ get_range(&start, &len);
drm_intel_bo_get_subdata(scratch_bo, start, len, tmp);
for (j = 0; j < len; j++) {
igt_assert_f(tmp[j] == val,
- "mismatch in read at %i, got: %i, expected: %i\n",
- j, tmp[j], val);
+ "mismatch in read at %i [%i + %i], got: %i, expected: %i\n",
+ j, start, len, tmp[j], val);
}
/* Change contents through gtt to make the pread cachelines
* stale. */
- val = (i + 17) % 256;
+ val += 17;
blt_bo_fill(staging_bo, scratch_bo, val);
/* partial write */
- start = random() % BO_SIZE;
- len = random() % (BO_SIZE-start) + 1;
-
memset(tmp, i + 63, BO_SIZE);
+ get_range(&start, &len);
drm_intel_bo_subdata(scratch_bo, start, len, tmp);
copy_bo(scratch_bo, staging_bo);
- drm_intel_gem_bo_map_gtt(staging_bo);
+ do_or_die(drm_intel_gem_bo_map_gtt(staging_bo));
gtt_ptr = staging_bo->virtual;
for (j = 0; j < start; j++) {
igt_assert_f(gtt_ptr[j] == val,
- "mismatch at %i, got: %i, expected: %i\n",
- j, tmp[j], val);
+ "mismatch at %i (start=%i), got: %i, expected: %i\n",
+ j, start, tmp[j], val);
}
for (; j < start + len; j++) {
igt_assert_f(gtt_ptr[j] == tmp[0],
- "mismatch at %i, got: %i, expected: %i\n",
- j, tmp[j], tmp[0]);
+ "mismatch at %i (%i/%i), got: %i, expected: %i\n",
+ j, j - start, len, tmp[j], tmp[0]);
}
for (; j < BO_SIZE; j++) {
igt_assert_f(gtt_ptr[j] == val,
- "mismatch at %i, got: %i, expected: %i\n",
- j, tmp[j], val);
+ "mismatch at %i (end=%i), got: %i, expected: %i\n",
+ j, start + len, tmp[j], val);
}
drm_intel_gem_bo_unmap_gtt(staging_bo);