On Fri, Jul 19, 2013 at 01:53:10PM +0800, Xiong Zhang wrote: > first disable prefault, then put relocate bo in gtt space and exec cmd, > so it will run relocate_object_slow path, finally enable prefault > > Signed-off-by: Xiong Zhang <xiong.y.zhang@xxxxxxxxx> Hm, my idea was something much simpler like diff --git a/tests/gem_exec_faulting_reloc.c b/tests/gem_exec_faulting_reloc.c index 863a1b0..c7f7b6b 100644 --- a/tests/gem_exec_faulting_reloc.c +++ b/tests/gem_exec_faulting_reloc.c @@ -220,7 +220,15 @@ static void run(int object_size) int main(int argc, char **argv) { - run(OBJECT_SIZE); + drmtest_subtest_init(argc, argv); + + if (drmtest_run_subtest("normal")) + run(OBJECT_SIZE); + if (drmtest_run_subtest("no-prefault")) { + drmtest_disable_prefault(); + run(OBJECT_SIZE); + drmtest_enable_prefault(); + } return 0; } diff --git a/tests/gem_mmap_gtt.c b/tests/gem_mmap_gtt.c index d759340..138476e 100644 --- a/tests/gem_mmap_gtt.c +++ b/tests/gem_mmap_gtt.c @@ -144,6 +144,14 @@ test_read(int fd) munmap(dst, OBJECT_SIZE); } +static void +run_without_prefault(int fd, void (*func)(int fd)) +{ + drmtest_disable_prefault(); + func(fd); + drmtest_enable_prefault(); +} + int main(int argc, char **argv) { int fd; @@ -160,6 +168,12 @@ int main(int argc, char **argv) test_write(fd); if (drmtest_run_subtest("write-gtt")) test_write_gtt(fd); + if (drmtest_run_subtest("read-no-prefault")) + run_without_prefault(fd, test_read); + if (drmtest_run_subtest("write-no-prefault")) + run_without_prefault(fd, test_write); + if (drmtest_run_subtest("write-gtt-no-prefault")) + run_without_prefault(fd, test_write_gtt); close(fd); Of course if that's not good enough to exercise the paths then we need to add more tests. But it'd be a bit less code ;-) Cheers, Daniel > --- > tests/Makefile.am | 1 + > tests/gem_disable_prefault.c | 168 +++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 169 insertions(+) > create mode 100644 tests/gem_disable_prefault.c > > diff --git a/tests/Makefile.am b/tests/Makefile.am > index 3003aa0..f0804b3 100644 > --- a/tests/Makefile.am > +++ b/tests/Makefile.am > @@ -106,6 +106,7 @@ TESTS_progs = \ > gem_reg_read \ > gem_tiling_max_stride \ > prime_udl \ > + gem_disable_prefault \ > $(NULL) > > # IMPORTANT: The ZZ_ tests need to be run last! > diff --git a/tests/gem_disable_prefault.c b/tests/gem_disable_prefault.c > new file mode 100644 > index 0000000..9e6f0ad > --- /dev/null > +++ b/tests/gem_disable_prefault.c > @@ -0,0 +1,168 @@ > +/* > + * Copyright © 2013 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: > + * Xiong Zhang <xiong.y.zhang@xxxxxxxxx> > + * > + */ > + > +#include <unistd.h> > +#include <stdlib.h> > +#include <stdio.h> > +#include <string.h> > +#include <assert.h> > +#include <fcntl.h> > +#include <inttypes.h> > +#include <errno.h> > +#include <sys/stat.h> > +#include <sys/ioctl.h> > +#include <sys/mman.h> > +#include "drm.h" > +#include "i915_drm.h" > +#include "drmtest.h" > +#include "intel_chipset.h" > +#include "intel_gpu_tools.h" > + > +#define OBJECT_SIZE (16*1024*1024) > + > +static void * > +mmap_bo(int fd, uint32_t handle, int size) > +{ > + void *ptr; > + > + ptr = gem_mmap(fd, handle, size, PROT_READ | PROT_WRITE); > + assert(ptr != MAP_FAILED); > + > + return ptr; > +} > + > +static void gem_exec(int fd, struct drm_i915_gem_execbuffer2 *execbuf) > +{ > + int ret; > + > + ret = drmIoctl(fd, > + DRM_IOCTL_I915_GEM_EXECBUFFER2, > + execbuf); > + assert(ret == 0); > +} > + > +static void > +test_disable_prefault_reloc(int fd) > +{ > + struct drm_i915_gem_execbuffer2 execbuf; > + struct drm_i915_gem_exec_object2 exec[3]; > + struct drm_i915_gem_relocation_entry reloc[4]; > + uint32_t buf[20]; > + uint32_t handle, handle_relocs, src, dst; > + void *gtt_relocs; > + int len; > + int ring; > + > + handle = gem_create(fd, 4096); > + src = gem_create(fd, OBJECT_SIZE); > + dst = gem_create(fd, OBJECT_SIZE); > + > + len = gem_linear_blt(buf, src, dst, OBJECT_SIZE, reloc); > + gem_write(fd, handle, 0, buf, len); > + > + exec[0].handle = src; > + exec[0].relocation_count = 0; > + exec[0].relocs_ptr = 0; > + exec[0].alignment = 0; > + exec[0].offset = 0; > + exec[0].flags = 0; > + exec[0].rsvd1 = 0; > + exec[0].rsvd2 = 0; > + > + exec[1].handle = dst; > + exec[1].relocation_count = 0; > + exec[1].relocs_ptr = 0; > + exec[1].alignment = 0; > + exec[1].offset = 0; > + exec[1].flags = 0; > + exec[1].rsvd1 = 0; > + exec[1].rsvd2 = 0; > + > + handle_relocs = gem_create(fd, 4096); > + gem_write(fd, handle_relocs, 0, reloc, sizeof(reloc)); > + gtt_relocs = mmap_bo(fd, handle_relocs, 4096); > + > + exec[2].handle = handle; > + exec[2].relocation_count = len > 40 ? 4 : 2; > + /* A newly mmap gtt bo will fault on first access. */ > + exec[2].relocs_ptr = (uintptr_t)gtt_relocs; > + exec[2].alignment = 0; > + exec[2].offset = 0; > + exec[2].flags = 0; > + exec[2].rsvd1 = 0; > + exec[2].rsvd2 = 0; > + > + ring = 0; > + if (HAS_BLT_RING(intel_get_drm_devid(fd))) > + ring = I915_EXEC_BLT; > + > + execbuf.buffers_ptr = (uintptr_t)exec; > + execbuf.buffer_count = 3; > + execbuf.batch_start_offset = 0; > + execbuf.batch_len = len; > + execbuf.cliprects_ptr = 0; > + execbuf.num_cliprects = 0; > + execbuf.DR1 = 0; > + execbuf.DR4 = 0; > + execbuf.flags = ring; > + i915_execbuffer2_set_context_id(execbuf, 0); > + execbuf.rsvd2 = 0; > + > + drmtest_disable_prefault(); > + gem_exec(fd, &execbuf); > + gem_sync(fd, handle); > + drmtest_enable_prefault(); > + > + munmap(gtt_relocs, 4096); > + gem_close(fd, handle_relocs); > + gem_close(fd, dst); > + gem_close(fd, src); > + gem_close(fd, handle); > +} > + > +int main(int argc, char **argv) > +{ > + int fd; > + > + /* if user isn't root or kernel doesn't supply > + * /sys/module/i915/parameters/prefault_disable, > + * program exit immediately. */ > + if (drmtest_enable_prefault() < 0) > + return 0; > + > + drmtest_subtest_init(argc, argv); > + > + fd = drm_open_any(); > + > + if (drmtest_run_subtest("reloc")) > + test_disable_prefault_reloc(fd); > + > + close(fd); > + > + return 0; > +} > + > -- > 1.8.3.2 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@xxxxxxxxxxxxxxxxxxxxx > http://lists.freedesktop.org/mailman/listinfo/intel-gfx -- Daniel Vetter Software Engineer, Intel Corporation +41 (0) 79 365 57 48 - http://blog.ffwll.ch _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/intel-gfx