summaryrefslogtreecommitdiff
path: root/tests/prime_vgem.c
diff options
context:
space:
mode:
authorJanusz Krzysztofik <janusz.krzysztofik@linux.intel.com>2019-07-11 10:39:58 +0200
committerSimon Ser <simon.ser@intel.com>2019-07-11 14:15:05 +0300
commitd7f140b5b02d054183a74842b4579cf7f5533927 (patch)
tree3e7e1cd6317e1fa14d40c01429d11bc48fee2ab2 /tests/prime_vgem.c
parent86dc48ede7c33bf69e15f84179d2f9e5b84c179b (diff)
tests/prime_vgem: Fix broken handling of interprocess pipes
If a child process dies for any reason while basic-fence-read or basic-fence-mmap subtest is run, the subtest may hang indefinitely on read() from a pipe which is supposed to be written to by that child (can be interrupted though). Fix it by first closing unused pipe ends on both parent and child side before using the pipe, as recommended by pipe(2) manual page. Please note that due to the IGT library way of handling signals, now the subtests may fail with error code 141 (128 + SIGPIPE) and no usual DEBUG message block on stderr nor FAIL message line on stdout, however some meaningful error messages will still be printed on stderr by the failing child processes. Signed-off-by: Janusz Krzysztofik <janusz.krzysztofik@linux.intel.com> Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'tests/prime_vgem.c')
-rw-r--r--tests/prime_vgem.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/tests/prime_vgem.c b/tests/prime_vgem.c
index 69ae8c9b..bebf9edc 100644
--- a/tests/prime_vgem.c
+++ b/tests/prime_vgem.c
@@ -82,6 +82,8 @@ static void test_fence_read(int i915, int vgem)
close(dmabuf);
igt_fork(child, 1) {
+ close(master[0]);
+ close(slave[1]);
for (i = 0; i < 1024; i++) {
uint32_t tmp;
gem_read(i915, handle, 4096*i, &tmp, sizeof(tmp));
@@ -97,6 +99,8 @@ static void test_fence_read(int i915, int vgem)
gem_close(i915, handle);
}
+ close(master[1]);
+ close(slave[0]);
read(master[0], &i, sizeof(i));
fence = vgem_fence_attach(vgem, &scratch, VGEM_FENCE_WRITE);
write(slave[1], &i, sizeof(i));
@@ -110,8 +114,6 @@ static void test_fence_read(int i915, int vgem)
igt_waitchildren();
close(master[0]);
- close(master[1]);
- close(slave[0]);
close(slave[1]);
}
@@ -137,6 +139,8 @@ static void test_fence_mmap(int i915, int vgem)
close(dmabuf);
igt_fork(child, 1) {
+ close(master[0]);
+ close(slave[1]);
ptr = gem_mmap__gtt(i915, handle, 4096*1024, PROT_READ);
gem_set_domain(i915, handle, I915_GEM_DOMAIN_GTT, 0);
@@ -153,6 +157,8 @@ static void test_fence_mmap(int i915, int vgem)
gem_close(i915, handle);
}
+ close(master[1]);
+ close(slave[0]);
read(master[0], &i, sizeof(i));
fence = vgem_fence_attach(vgem, &scratch, VGEM_FENCE_WRITE);
write(slave[1], &i, sizeof(i));
@@ -166,8 +172,6 @@ static void test_fence_mmap(int i915, int vgem)
igt_waitchildren();
close(master[0]);
- close(master[1]);
- close(slave[0]);
close(slave[1]);
}