Message ID | 20180713081453.30596-1-chris@chris-wilson.co.uk (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Quoting Chris Wilson (2018-07-13 09:14:53) > From: Antonio Argenziano <antonio.argenziano@intel.com> > > An hanging batch is nothing more than a spinning batch that never gets > stopped, so re-use the routines implemented in dummyload.c. > > v2: > - Let caller decide spin loop size > - Now builds with meson. > v3: > - Only use loose loops for hangs (Chris) > v4: > - No requires > > Signed-off-by: Antonio Argenziano <antonio.argenziano@intel.com> > Cc: Chris Wilson <chris@chris-wilson.co.uk> > Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> > --- > lib/igt_gt.c | 57 ++++++++-------------------------------------------- > 1 file changed, 8 insertions(+), 49 deletions(-) > > diff --git a/lib/igt_gt.c b/lib/igt_gt.c > index 89b318ae6..e2701fb21 100644 > --- a/lib/igt_gt.c > +++ b/lib/igt_gt.c > @@ -40,6 +40,7 @@ > #include "ioctl_wrappers.h" > #include "intel_reg.h" > #include "intel_chipset.h" > +#include "igt_dummyload.h" > > /** > * SECTION:igt_gt > @@ -271,14 +272,9 @@ igt_hang_t igt_hang_ctx(int fd, > unsigned flags, > uint64_t *offset) > { > - struct drm_i915_gem_relocation_entry reloc; > - struct drm_i915_gem_execbuffer2 execbuf; > - struct drm_i915_gem_exec_object2 exec; > struct drm_i915_gem_context_param param; > - uint32_t b[16]; > + igt_spin_t *spin; > unsigned ban; > - unsigned len; > - int gen; > > igt_require_hang_ring(fd, ring); > > @@ -302,52 +298,15 @@ igt_hang_t igt_hang_ctx(int fd, > if ((flags & HANG_ALLOW_BAN) == 0) > context_set_ban(fd, ctx, 0); > > - memset(&reloc, 0, sizeof(reloc)); > - memset(&exec, 0, sizeof(exec)); > - memset(&execbuf, 0, sizeof(execbuf)); > - > - exec.handle = gem_create(fd, 4096); > - exec.relocation_count = 1; > - exec.relocs_ptr = to_user_pointer(&reloc); > - > - memset(b, 0xc5, sizeof(b)); > - > - len = 0; > - gen = intel_gen(intel_get_drm_devid(fd)); > - if (gen >= 8) { > - b[len++] = MI_BATCH_BUFFER_START | 1 << 8 | 1; > - b[len++] = 0; > - b[len++] = 0; > - } else if (gen >= 6) { > - b[len++] = MI_BATCH_BUFFER_START | 1 << 8; > - b[len++] = 0; > - } else { > - b[len++] = MI_BATCH_BUFFER_START | 2 << 6; > - b[len] = 0; > - if (gen < 4) { > - b[len] |= 1; > - reloc.delta = 1; > - } > - len++; > - } > - b[len++] = MI_BATCH_BUFFER_END; > - b[len] = MI_NOOP; > - gem_write(fd, exec.handle, 0, b, sizeof(b)); > - > - reloc.offset = sizeof(uint32_t); > - reloc.target_handle = exec.handle; > - reloc.read_domains = I915_GEM_DOMAIN_COMMAND; > - > - execbuf.buffers_ptr = to_user_pointer(&exec); > - execbuf.buffer_count = 1; > - execbuf.flags = ring; > - i915_execbuffer2_set_context_id(execbuf, ctx); > - gem_execbuf(fd, &execbuf); > + spin = __igt_spin_batch_new(fd, > + .ctx = ctx, > + .engine = ring, > + .flags = IGT_SPIN_NO_PREEMPTION); > > if (offset) > - *offset = exec.offset; > + *offset = spin->obj[1].offset; > > - return (igt_hang_t){ exec.handle, ctx, ban, flags }; > + return (igt_hang_t){ spin->handle, ctx, ban, flags }; Oh, we shouldn't just leave it dangling. Drat. -Chris
diff --git a/lib/igt_gt.c b/lib/igt_gt.c index 89b318ae6..e2701fb21 100644 --- a/lib/igt_gt.c +++ b/lib/igt_gt.c @@ -40,6 +40,7 @@ #include "ioctl_wrappers.h" #include "intel_reg.h" #include "intel_chipset.h" +#include "igt_dummyload.h" /** * SECTION:igt_gt @@ -271,14 +272,9 @@ igt_hang_t igt_hang_ctx(int fd, unsigned flags, uint64_t *offset) { - struct drm_i915_gem_relocation_entry reloc; - struct drm_i915_gem_execbuffer2 execbuf; - struct drm_i915_gem_exec_object2 exec; struct drm_i915_gem_context_param param; - uint32_t b[16]; + igt_spin_t *spin; unsigned ban; - unsigned len; - int gen; igt_require_hang_ring(fd, ring); @@ -302,52 +298,15 @@ igt_hang_t igt_hang_ctx(int fd, if ((flags & HANG_ALLOW_BAN) == 0) context_set_ban(fd, ctx, 0); - memset(&reloc, 0, sizeof(reloc)); - memset(&exec, 0, sizeof(exec)); - memset(&execbuf, 0, sizeof(execbuf)); - - exec.handle = gem_create(fd, 4096); - exec.relocation_count = 1; - exec.relocs_ptr = to_user_pointer(&reloc); - - memset(b, 0xc5, sizeof(b)); - - len = 0; - gen = intel_gen(intel_get_drm_devid(fd)); - if (gen >= 8) { - b[len++] = MI_BATCH_BUFFER_START | 1 << 8 | 1; - b[len++] = 0; - b[len++] = 0; - } else if (gen >= 6) { - b[len++] = MI_BATCH_BUFFER_START | 1 << 8; - b[len++] = 0; - } else { - b[len++] = MI_BATCH_BUFFER_START | 2 << 6; - b[len] = 0; - if (gen < 4) { - b[len] |= 1; - reloc.delta = 1; - } - len++; - } - b[len++] = MI_BATCH_BUFFER_END; - b[len] = MI_NOOP; - gem_write(fd, exec.handle, 0, b, sizeof(b)); - - reloc.offset = sizeof(uint32_t); - reloc.target_handle = exec.handle; - reloc.read_domains = I915_GEM_DOMAIN_COMMAND; - - execbuf.buffers_ptr = to_user_pointer(&exec); - execbuf.buffer_count = 1; - execbuf.flags = ring; - i915_execbuffer2_set_context_id(execbuf, ctx); - gem_execbuf(fd, &execbuf); + spin = __igt_spin_batch_new(fd, + .ctx = ctx, + .engine = ring, + .flags = IGT_SPIN_NO_PREEMPTION); if (offset) - *offset = exec.offset; + *offset = spin->obj[1].offset; - return (igt_hang_t){ exec.handle, ctx, ban, flags }; + return (igt_hang_t){ spin->handle, ctx, ban, flags }; } /**