[Intel-gfx] [RFC i-g-t 1/1] tests/gem_bad_address: Fix and update gem_bad_address

Petri Latvala petri.latvala at intel.com
Mon Jun 5 09:06:34 UTC 2017


If this ends up having further revisions, please split it into two
(three?) separate changes:

 1) Introduction of tests_hw directory
 2) Moving (and changing) gem_bad_address to tests_hw
[3) Changing gem_bad_address]


First target of bikeshedding is the directory name. I kind of like
hw_tests more, it flows nicely with BUILD_HW_TESTS and pals, but I'm
not too fuzzed about that.


More comments inline.


On Wed, May 31, 2017 at 10:00:37AM -0700, Antonio Argenziano wrote:
> When writing to an invalid memory location, the HW should be clever
> enough to silently discard the write without disrupting execution.
> gem_bad_address aim at just that. The test has been updated to move away
> from the libDrm wrappers and use the IOCTL wrappers instead. Also the
> invalid address has been updated to be just outside of the GTT space.
> 
> Since the test is considered to be HW focused, meaning that it doesn't
> really exercise the deriver but rather an HW feature, a new folder has
> been created to host such tests. The commit moves the test in the newly
> created folder for HW focused tests.
> 
> Signed-off-by: Antonio Argenziano <antonio.argenziano at intel.com>
> ---
>  Makefile.am                           |  4 ++
>  configure.ac                          | 11 ++++++
>  tests_hw/Makefile.am                  | 36 ++++++++++++++++++
>  tests_hw/Makefile.sources             |  8 ++++
>  {tests => tests_hw}/gem_bad_address.c | 69 ++++++++++++++++++++---------------
>  5 files changed, 98 insertions(+), 30 deletions(-)
>  create mode 100644 tests_hw/Makefile.am
>  create mode 100644 tests_hw/Makefile.sources
>  rename {tests => tests_hw}/gem_bad_address.c (50%)
> 
> diff --git a/Makefile.am b/Makefile.am
> index 60168628..dca76bf0 100644
> --- a/Makefile.am
> +++ b/Makefile.am
> @@ -23,6 +23,10 @@ ACLOCAL_AMFLAGS = ${ACLOCAL_FLAGS} -I m4
>  
>  SUBDIRS = lib man tools scripts benchmarks
>  
> +if BUILD_HW_TESTS
> +SUBDIRS += tests_hw
> +endif
> +
>  if BUILD_TESTS
>  SUBDIRS += tests
>  endif
> diff --git a/configure.ac b/configure.ac
> index 5342e33c..85885f25 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -333,6 +333,15 @@ fi
>  AM_CONDITIONAL(BUILD_TESTS, [test "x$BUILD_TESTS" = xyes])
>  AC_DEFINE_UNQUOTED(TARGET_CPU_PLATFORM, ["$host_cpu"], [Target platform])
>  
> +AC_ARG_ENABLE(tests_hw,
> +	      AS_HELP_STRING([--disable-hw-tests],
> +	      [Disable HW tests build (default: enabled)]),
> +	      [BUILD_HW_TESTS=$enableval], [BUILD_HW_TESTS="yes"])
> +if test "x$BUILD_TESTS" = xyes; then
> +	AC_DEFINE(BUILD_HW_TESTS, 1, [Build hw tests])
> +fi
> +AM_CONDITIONAL(BUILD_HW_TESTS, [test "x$BUILD_HW_TESTS" = xyes])
> +
>  files="broadwell cherryview haswell ivybridge sandybridge valleyview skylake"
>  for file in $files; do
>  	REGISTER_FILES="$REGISTER_FILES $file `cat $srcdir/tools/registers/$file`"
> @@ -353,6 +362,7 @@ AC_CONFIG_FILES([
>  		 man/Makefile
>  		 scripts/Makefile
>  		 tests/Makefile
> +		 tests_hw/Makefile
>  		 tools/Makefile
>  		 tools/null_state_gen/Makefile
>  		 tools/registers/Makefile
> @@ -376,6 +386,7 @@ echo "Intel GPU tools"
>  echo ""
>  echo " • Tests:"
>  echo "       Build tests        : ${BUILD_TESTS}"
> +echo "       Build hw tests     : ${BUILD_HW_TESTS}"
>  echo "       Compile prime tests: ${NOUVEAU}"
>  echo "       Print stack traces : ${with_libunwind}"
>  echo "       Debug flags        : ${DEBUG_CFLAGS}"
> diff --git a/tests_hw/Makefile.am b/tests_hw/Makefile.am
> new file mode 100644
> index 00000000..36ed9eb9
> --- /dev/null
> +++ b/tests_hw/Makefile.am
> @@ -0,0 +1,36 @@
> +include Makefile.sources
> +
> +if BUILD_HW_TESTS
> +
> +hw-test-list.txt: Makefile.sources
> +	@echo TESTLIST > $@
> +	@echo ${hw_tests_all} >> $@
> +	@echo TESTLIST >> $@
> +
> +all-local: .gitignore
> +.gitignore: Makefile.sources
> +	@echo "$(HW_TESTS_PROGS) hw-test-list.txt .gitignore" | sed 's/\s\+/\n/g' | sort > $@
> +
> +pkglibexec_PROGRAMS = \
> +	$(HW_TESTS_PROGS) \
> +	$(NULL)
> +
> +pkgdata_DATA = hw-test-list.txt
> +
> +CLEANFILES = hw-test-list.txt .gitignore
> +
> +AM_CFLAGS = $(DRM_CFLAGS) $(CWARNFLAGS) -Wno-unused-result $(DEBUG_CFLAGS)\
> +	-I$(srcdir)/.. \
> +	-I$(srcdir)/../lib \
> +	-include "$(srcdir)/../lib/check-ndebug.h" \
> +	-DIGT_SRCDIR=\""$(abs_srcdir)"\" \
> +	-DIGT_DATADIR=\""$(pkgdatadir)"\" \
> +	$(LIBUNWIND_CFLAGS) $(WERROR_CFLAGS) \
> +	$(NULL)
> +
> +LDADD = ../lib/libintel_tools.la $(GLIB_LIBS) $(XMLRPC_LIBS) $(DLOPEN_LIBS)
> +
> +AM_CFLAGS += $(CAIRO_CFLAGS) $(LIBUDEV_CFLAGS) $(GLIB_CFLAGS)
> +AM_LDFLAGS = -Wl,--as-needed
> +
> +endif
> diff --git a/tests_hw/Makefile.sources b/tests_hw/Makefile.sources
> new file mode 100644
> index 00000000..25d181c0
> --- /dev/null
> +++ b/tests_hw/Makefile.sources
> @@ -0,0 +1,8 @@
> +HW_TESTS_PROGS =	\
> +	gem_bad_address \
> +	$(NULL)
> +
> +#This target contains all testcases
> +hw_tests_all = \
> +	$(HW_TESTS_PROGS) \
> +	$(NULL)
> diff --git a/tests/gem_bad_address.c b/tests_hw/gem_bad_address.c
> similarity index 50%
> rename from tests/gem_bad_address.c
> rename to tests_hw/gem_bad_address.c
> index a970dfa4..c254f894 100644
> --- a/tests/gem_bad_address.c
> +++ b/tests_hw/gem_bad_address.c
> @@ -23,37 +23,53 @@
>   * Authors:
>   *    Eric Anholt <eric at anholt.net>
>   *    Jesse Barnes <jbarnes at virtuousgeek.org> (based on gem_bad_blit.c)
> + *    Antonio Argenziano <antonio.argenziano at intel.com>
>   *
>   */
>  
>  #include "igt.h"
> -#include <stdlib.h>
> -#include <stdio.h>
> -#include <string.h>
> -#include <fcntl.h>
> -#include <inttypes.h>
> -#include <errno.h>
> -#include <sys/stat.h>
> -#include <sys/time.h>
> -#include "drm.h"
> -#include "intel_bufmgr.h"
>  
> -static drm_intel_bufmgr *bufmgr;
> -struct intel_batchbuffer *batch;
> -
> -#define BAD_GTT_DEST ((512*1024*1024)) /* past end of aperture */
> +/*
> + * This test aims at verifying that writing to an invalid location in memory,
> + * doesn't cause hangs. The store command should be ignored completely by the
> + * HW and the whole process should be transparent to the user. Therefore,
> + * the test doesn't perform any validation check but expects the wrapping
> + * execution environment to check no hangs have occurred.


The situation today is that there is no execution environment to even
run this test when it's in tests_hw. Should probably mark the lack of
such an environment as a TODO here.

When this test fails, what actually happens? Hard system hang?
Recoverable gpu hang? Unrecoverable gpu hang?


> + *
> + * The test needs to send a privileged batch to be able to write to the GTT.
> + */
>  
>  static void
> -bad_store(void)
> +bad_store(uint32_t fd, uint32_t engine)
>  {
> -	BEGIN_BATCH(4, 0);
> -	OUT_BATCH(MI_STORE_DWORD_IMM | MI_MEM_VIRTUAL | 1 << 21);
> -	OUT_BATCH(0);
> -	OUT_BATCH(BAD_GTT_DEST);
> -	OUT_BATCH(0xdeadbeef);
> -	ADVANCE_BATCH();
> +    struct drm_i915_gem_exec_object2 obj;
> +    struct drm_i915_gem_execbuffer2 execbuf;
> +
> +    uint32_t batch[16];
> +    int i = 0;
> +
> +    memset(&obj, 0, sizeof(obj));
> +    memset(&execbuf, 0, sizeof(execbuf));
> +
> +    execbuf.buffers_ptr = to_user_pointer(&obj);
> +    execbuf.buffer_count = 1;
> +    execbuf.flags = engine;
> +    execbuf.flags |= I915_EXEC_SECURE;
>  
> -	intel_batchbuffer_flush(batch);
> +    obj.handle = gem_create(fd, 4096);
> +
> +    batch[i++] = MI_STORE_DWORD_IMM | MI_MEM_VIRTUAL;
> +    batch[i++] = 0x0; //Low part of the GTT address = 4GByte
> +    batch[i++] = 0x1; //High part of the GTT address > GTT size
> +    batch[i++] = 0xdeadbeef;
> +
> +    batch[i++] = MI_BATCH_BUFFER_END;
> +    batch[i++] = 0x0;
> +
> +    gem_write(fd, obj.handle, 0, batch, sizeof(batch));
> +    gem_execbuf(fd, &execbuf);
> +
> +    gem_close(fd, obj.handle);
>  }


Use tabs for indentation here.



-- 
Petri Latvala


More information about the Intel-gfx mailing list