On 15 October 2015 at 09:05, Derek Morton <derek.j.morton@xxxxxxxxx> wrote: > This test is based on gem_exec_nop but submits nop batch buffers concurrently > from different threads to check for ring hangs and other issues during > concurrent submissions. Is there any reason not to include this as extra subtests in gem_exec_nop so that related tests are grouped together? > > Signed-off-by: Derek Morton <derek.j.morton@xxxxxxxxx> > --- > tests/.gitignore | 1 + > tests/Makefile.sources | 1 + > tests/gem_exec_nop_concurrent.c | 172 ++++++++++++++++++++++++++++++++++++++++ > 3 files changed, 174 insertions(+) > create mode 100644 tests/gem_exec_nop_concurrent.c > > diff --git a/tests/.gitignore b/tests/.gitignore > index dc8bb53..0ad36f3 100644 > --- a/tests/.gitignore > +++ b/tests/.gitignore > @@ -46,6 +46,7 @@ gem_exec_blt > gem_exec_faulting_reloc > gem_exec_lut_handle > gem_exec_nop > +gem_exec_nop_concurrent > gem_exec_params > gem_exec_parse > gem_fd_exhaustion > diff --git a/tests/Makefile.sources b/tests/Makefile.sources > index 2e2e088..aece831 100644 > --- a/tests/Makefile.sources > +++ b/tests/Makefile.sources > @@ -27,6 +27,7 @@ TESTS_progs_M = \ > gem_exec_bad_domains \ > gem_exec_faulting_reloc \ > gem_exec_nop \ > + gem_exec_nop_concurrent \ > gem_exec_params \ > gem_exec_parse \ > gem_fenced_exec_thrash \ > diff --git a/tests/gem_exec_nop_concurrent.c b/tests/gem_exec_nop_concurrent.c > new file mode 100644 > index 0000000..578f651 > --- /dev/null > +++ b/tests/gem_exec_nop_concurrent.c > @@ -0,0 +1,172 @@ > +/* > + * Copyright © 2015 Intel Corporation > + * > + * Permission is hereby granted, free of charge, to any person obtaining a > + * copy of this software and associated documentation files (the "Software"), > + * to deal in the Software without restriction, including without limitation > + * the rights to use, copy, modify, merge, publish, distribute, sublicense, > + * and/or sell copies of the Software, and to permit persons to whom the > + * Software is furnished to do so, subject to the following conditions: > + * > + * The above copyright notice and this permission notice (including the next > + * paragraph) shall be included in all copies or substantial portions of the > + * Software. > + * > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR > + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, > + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL > + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER > + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING > + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS > + * IN THE SOFTWARE. > + * > + * Authors: > + * Derek Morton <derek.j.morton@xxxxxxxxx> > + * > + * This test is based on gem_exec_nop but submits nop batch buffers concurrently > + * from different threads to check for ring hangs and other issues during > + * concurrent submissions. > + * > + */ > + > +#include "igt.h" > +#include <unistd.h> > +#include <stdlib.h> > +#include <stdint.h> > +#include <stdio.h> > +#include <string.h> > +#include <fcntl.h> > +#include <inttypes.h> > +#include <errno.h> > +#include <sys/stat.h> > +#include <sys/ioctl.h> > +#include <sys/time.h> > +#include <time.h> > +#include "drm.h" > + > +#define LOCAL_I915_EXEC_NO_RELOC (1<<11) > +#define LOCAL_I915_EXEC_HANDLE_LUT (1<<12) > + > +#define LOCAL_I915_EXEC_VEBOX (4<<0) > + > +IGT_TEST_DESCRIPTION( > + "This Test will submit nop batch buffers concurrently to the same ring " > + "and different rings in an attempt to trigger ring hangs."); > + > +const uint32_t batch[2] = {MI_BATCH_BUFFER_END}; > + > +struct ring > +{ > + unsigned ring_id; > + const char *ring_name; > + bool direction; > +}; > + > +static void loop(int fd, uint32_t handle, int child_nbr, struct ring* ring, bool up) > +{ > + struct drm_i915_gem_execbuffer2 execbuf; > + struct drm_i915_gem_exec_object2 gem_exec[1]; > + int count; > + int max_count = SLOW_QUICK(15, 4); > + > + gem_require_ring(fd, ring->ring_id); > + > + memset(&gem_exec, 0, sizeof(gem_exec)); > + gem_exec[0].handle = handle; > + > + memset(&execbuf, 0, sizeof(execbuf)); > + execbuf.buffers_ptr = (uintptr_t)gem_exec; > + execbuf.buffer_count = 1; > + execbuf.flags = ring->ring_id; > + execbuf.flags |= LOCAL_I915_EXEC_HANDLE_LUT; > + execbuf.flags |= LOCAL_I915_EXEC_NO_RELOC; > + if (drmIoctl(fd, DRM_IOCTL_I915_GEM_EXECBUFFER2, &execbuf)) { > + execbuf.flags = ring->ring_id; > + do_ioctl(fd, DRM_IOCTL_I915_GEM_EXECBUFFER2, &execbuf); > + } > + gem_sync(fd, handle); > + > + for (count = 0; count <= max_count; count++) { > + const int reps = 7; > + int n, nbr_loops; > + > + if (up) > + nbr_loops = 1 << count; > + else > + nbr_loops = 1 << (max_count - count); > + > + igt_info("Thread %d: starting submitting batches of %d batch buffers (ring=%s)\n", > + child_nbr, nbr_loops, ring->ring_name); > + fflush(stdout); > + > + for (n = 0; n < reps; n++) { > + int loops = nbr_loops; > + > + while (loops--) > + do_ioctl(fd, DRM_IOCTL_I915_GEM_EXECBUFFER2, &execbuf); > + gem_sync(fd, handle); > + } > + > + igt_info("Thread %d: finished submitting batches of %d batch buffers (ring=%s)\n", > + child_nbr, nbr_loops, ring->ring_name); > + fflush(stdout); > + } > +} > + > +static void run_forked(struct ring rings[]) > +{ > + int nbr_rings = 0; > + while (rings[nbr_rings].ring_name != NULL) > + nbr_rings++; > + > + igt_fork(child, nbr_rings) { > + int fd; > + uint32_t handle; > + > + fd = drm_open_driver(DRIVER_INTEL); > + > + handle = gem_create(fd, 4096); > + gem_write(fd, handle, 0, batch, sizeof(batch)); > + > + igt_info("Starting thread %d on ring %s\n", child, rings[child].ring_name); > + fflush(stdout); > + loop(fd, handle, child, &rings[child], rings[child].direction); > + > + gem_close(fd, handle); > + > + close(fd); > + } > + igt_waitchildren(); > +} > + > +igt_main > +{ > + struct ring all_rings[] = { > + {I915_EXEC_RENDER, "render", 1}, > + {I915_EXEC_BSD, "bsd", 1}, > + {I915_EXEC_BLT, "blt", 1}, > + {LOCAL_I915_EXEC_VEBOX, "vebox", 1}, > + { 0, NULL, 0 }, > + }, > + rings[] = { > + { 0, NULL, 1 }, > + { 0, NULL, 0 }, > + { 0, NULL, 0 }, > + }, *t1, *t2; > + > + for (t1 = all_rings; t1->ring_name; t1++) { > + rings[0].ring_id = t1->ring_id; > + rings[0].ring_name = t1->ring_name; > + > + for (t2 = all_rings; t2->ring_name; t2++) { > + rings[1].ring_id = t2->ring_id; > + rings[1].ring_name = t2->ring_name; > + > + igt_subtest_f("%s-%s",t1->ring_name, t2->ring_name) > + run_forked(rings); > + } > + } > + igt_subtest("all-rings") > + run_forked(all_rings); > + > +} > -- > 1.9.1 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@xxxxxxxxxxxxxxxxxxxxx > http://lists.freedesktop.org/mailman/listinfo/intel-gfx _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/intel-gfx