On Thu, Feb 25, 2016 at 10:32:11AM +0000, daniele.ceraolospurio@xxxxxxxxx wrote: > +/* This test covers the case where we end up in an uninitialised area of the > + * ppgtt at an offset greater than the one where the last buffer is mapped. This > + * is particularly relevant if 48b ppgtt is enabled because the ppgtt is > + * massively bigger compared to the 32b case and it takes a lot more time to > + * wrap, so the acthd can potentially keep increasing for a long time > + */ > +#define NSEC_PER_SEC 1000000000L > +static void ppgtt_walking(void) > +{ > + int fd; > + int64_t timeout_ns = 100 * NSEC_PER_SEC; /* 100 seconds */ This needs a note that this has to be greater than ~5*hangcheck. > + struct drm_i915_gem_execbuffer2 execbuf; > + struct drm_i915_gem_exec_object2 gem_exec; > + uint32_t handle; > + uint32_t batch[4]; > + > + fd = drm_open_driver(DRIVER_INTEL); > + igt_require(gem_gtt_type(fd) > 2); Nope, just full-ppgtt is required (and provides a sensible hangcheck test if !48bit as well). Note this does require that the hangcheck is enabled, so igt_require(). > + > + /* the batch will be mapped to an offset < 4GB because the flag to allow > + * 48b offsets is not specified, so jump to address 0x00000001 00000000 > + */ > + batch[0] = MI_BATCH_BUFFER_START | 1; > + batch[1] = 0; > + batch[2] = 1; > + batch[3] = MI_BATCH_BUFFER_END; The vm is entirely empty. Just submit an unterminated (empty) batch, and it will walk from 0 to 1<<48bit and around and around and around and around... > + > + handle = gem_create(fd, 4096); > + gem_write(fd, handle, 0, batch, sizeof(batch)); > + > + memset(&gem_exec, 0, sizeof(gem_exec)); > + gem_exec.handle = handle; > + > + memset(&execbuf, 0, sizeof(execbuf)); > + execbuf.buffers_ptr = (uintptr_t)&gem_exec; > + execbuf.buffer_count = 1; > + execbuf.batch_len = 16; > + > + gem_execbuf(fd, &execbuf); > + > + igt_assert(gem_wait(fd, handle, &timeout_ns) == 0); igt_assert_eq(gem_wait(), 0); so you get the information about the failure. > + igt_assert(timeout_ns > 0); Redundant. gem_wait() returns ETIME if we wait for timeout_ns without completion. > + > + gem_close(fd, handle); Irrelevant, it will be closed with close(fd). > + close(fd); > +} > + > igt_main > { > const struct intel_execution_engine *e; > @@ -314,4 +361,7 @@ igt_main > test_error_state_capture(e->exec_id | e->flags, > e->full_name); > } > + > + igt_subtest("ppgtt-walking") > + ppgtt_walking(); This is a hangcheck test, "hangcheck-unterminated" -Chris -- Chris Wilson, Intel Open Source Technology Centre _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx