[igt-dev] [PATCH i-g-t] i915: Drop i915_hangman test case

Arjun Melkaveri arjun.melkaveri at intel.com
Sat Jan 30 14:51:01 UTC 2021


Removing i915_hangman as it have become redundant and broken.

Cc: Chris Wilson <chris at chris-wilson.co.uk>
Signed-off-by: Arjun Melkaveri <arjun.melkaveri at intel.com>
---
 tests/Makefile.sources                |   3 -
 tests/i915/i915_hangman.c             | 378 --------------------------
 tests/intel-ci/fast-feedback.testlist |   1 -
 tests/meson.build                     |   1 -
 4 files changed, 383 deletions(-)
 delete mode 100644 tests/i915/i915_hangman.c

diff --git a/tests/Makefile.sources b/tests/Makefile.sources
index 3f663fe7..3ae307b2 100644
--- a/tests/Makefile.sources
+++ b/tests/Makefile.sources
@@ -486,9 +486,6 @@ i915_fb_tiling_SOURCES = i915/i915_fb_tiling.c
 TESTS_progs += i915_getparams_basic
 i915_getparams_basic_SOURCES = i915/i915_getparams_basic.c
 
-TESTS_progs += i915_hangman
-i915_hangman_SOURCES = i915/i915_hangman.c
-
 TESTS_progs += i915_module_load
 i915_module_load_SOURCES = i915/i915_module_load.c
 
diff --git a/tests/i915/i915_hangman.c b/tests/i915/i915_hangman.c
deleted file mode 100644
index 72e4d8b8..00000000
--- a/tests/i915/i915_hangman.c
+++ /dev/null
@@ -1,378 +0,0 @@
-/*
- * Copyright © 2014 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:
- *    Mika Kuoppala <mika.kuoppala at intel.com>
- *    Oscar Mateo <oscar.mateo at intel.com>
- *
- */
-
-#include <limits.h>
-#include <sys/ioctl.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <fcntl.h>
-
-#include "i915/gem.h"
-#include "igt.h"
-#include "igt_sysfs.h"
-#include "igt_debugfs.h"
-#include "sw_sync.h"
-
-#ifndef I915_PARAM_CMD_PARSER_VERSION
-#define I915_PARAM_CMD_PARSER_VERSION       28
-#endif
-
-static int device = -1;
-static int sysfs = -1;
-
-static bool has_error_state(int dir)
-{
-	bool result;
-	int fd;
-
-	fd = openat(dir, "error", O_RDONLY);
-	if (fd < 0)
-		return false;
-
-	if (read(fd, &result, sizeof(result)) < 0)
-		result = false;
-	else
-		result = true;
-
-	close(fd);
-	return result;
-}
-
-static void assert_entry(const char *s, bool expect)
-{
-	char *error;
-
-	error = igt_sysfs_get(sysfs, "error");
-	igt_assert(error);
-
-	igt_assert_f(!!strcasecmp(error, s) != expect,
-		     "contents of error: '%s' (expected %s '%s')\n",
-		     error, expect ? "": "not", s);
-
-	free(error);
-}
-
-static void assert_error_state_clear(void)
-{
-	assert_entry("no error state collected", true);
-}
-
-static void assert_error_state_collected(void)
-{
-	assert_entry("no error state collected", false);
-}
-
-static void clear_error_state(void)
-{
-	igt_sysfs_write(sysfs, "error", "", 1);
-}
-
-static void test_error_state_basic(void)
-{
-	int fd;
-
-	clear_error_state();
-	assert_error_state_clear();
-
-	/* Manually trigger a hang by request a reset */
-	fd = igt_debugfs_open(device, "i915_wedged", O_WRONLY);
-	igt_ignore_warn(write(fd, "1\n", 2));
-	close(fd);
-
-	assert_error_state_collected();
-
-	clear_error_state();
-	assert_error_state_clear();
-}
-
-static FILE *open_error(void)
-{
-	int fd;
-
-	fd = openat(sysfs, "error", O_RDONLY);
-	if (fd < 0)
-		return NULL;
-
-	return fdopen(fd, "r");
-}
-
-static bool uses_cmd_parser(void)
-{
-	int parser_version = 0;
-	drm_i915_getparam_t gp;
-
-	gp.param = I915_PARAM_CMD_PARSER_VERSION;
-	gp.value = &parser_version;
-	drmIoctl(device, DRM_IOCTL_I915_GETPARAM, &gp);
-
-	return parser_version > 0;
-}
-
-static void check_error_state(const char *expected_ring_name,
-			      uint64_t expected_offset,
-			      const uint32_t *batch)
-{
-	bool cmd_parser = uses_cmd_parser();
-	FILE *file = open_error();
-	char *line = NULL;
-	size_t line_size = 0;
-	bool found = false;
-
-	igt_assert(getline(&line, &line_size, file) != -1);
-	igt_require(strcasecmp(line, "No error state collected"));
-
-	igt_debug("%s(expected ring name=%s, expected offset=%"PRIx64")\n",
-		  __func__, expected_ring_name, expected_offset);
-
-	while (getline(&line, &line_size, file) > 0) {
-		char *dashes;
-		uint32_t gtt_offset_upper, gtt_offset_lower;
-		int matched;
-
-		dashes = strstr(line, "---");
-		if (!dashes)
-			continue;
-
-		matched = sscanf(dashes, "--- gtt_offset = 0x%08x %08x\n",
-				 &gtt_offset_upper, &gtt_offset_lower);
-		if (!matched)
-			matched = sscanf(dashes, "--- batch = 0x%08x %08x\n",
-					 &gtt_offset_upper, &gtt_offset_lower);
-		if (matched) {
-			char expected_line[128];
-			uint64_t gtt_offset;
-			int i;
-
-			strncpy(expected_line, line, dashes - line);
-			expected_line[dashes - line - 1] = '\0';
-			igt_assert(strstr(expected_line, expected_ring_name));
-
-			gtt_offset = gtt_offset_upper;
-			if (matched == 2) {
-				gtt_offset <<= 32;
-				gtt_offset |= gtt_offset_lower;
-			}
-			if (!cmd_parser)
-				igt_assert_eq_u64(gtt_offset, expected_offset);
-
-			for (i = 0; i < 1024; i++) {
-				igt_assert(getline(&line, &line_size, file) > 0);
-				if (line[0] == ':' || line[0] == '~')
-					break;
-
-				snprintf(expected_line, sizeof(expected_line),
-					 "%08x :  %08x",
-					 4*i, batch[i]);
-				igt_assert(strstr(line, expected_line));
-			}
-
-			found = true;
-			break;
-		}
-	}
-
-	free(line);
-	fclose(file);
-
-	clear_error_state();
-
-	igt_assert(found);
-}
-
-static void test_error_state_capture(unsigned ring_id,
-				     const char *ring_name)
-{
-	uint32_t *batch;
-	igt_hang_t hang;
-	uint64_t offset;
-
-	clear_error_state();
-
-	hang = igt_hang_ctx(device, 0, ring_id, HANG_ALLOW_CAPTURE);
-	offset = hang.spin->obj[IGT_SPIN_BATCH].offset;
-
-	batch = gem_mmap__cpu(device, hang.spin->handle, 0, 4096, PROT_READ);
-	gem_set_domain(device, hang.spin->handle, I915_GEM_DOMAIN_CPU, 0);
-
-	igt_post_hang_ring(device, hang);
-
-	check_error_state(ring_name, offset, batch);
-	munmap(batch, 4096);
-}
-
-static void
-test_engine_hang(const struct intel_execution_engine2 *e, unsigned int flags)
-{
-	const struct intel_execution_engine2 *other;
-	igt_spin_t *spin, *next;
-	IGT_LIST_HEAD(list);
-	uint32_t ctx;
-
-	igt_skip_on(flags & IGT_SPIN_INVALID_CS &&
-		    gem_has_cmdparser(device, e->flags));
-
-	/* Fill all the other engines with background load */
-	__for_each_physical_engine(device, other) {
-		if (other->flags == e->flags)
-			continue;
-
-		ctx = gem_context_clone_with_engines(device, 0);
-		spin = __igt_spin_new(device, ctx,
-				      .engine = other->flags,
-				      .flags = IGT_SPIN_FENCE_OUT);
-		gem_context_destroy(device, ctx);
-
-		igt_list_move(&spin->link, &list);
-	}
-
-	/* And on the target engine, we hang */
-	spin = igt_spin_new(device,
-			    .engine = e->flags,
-			    .flags = (IGT_SPIN_FENCE_OUT |
-				      IGT_SPIN_NO_PREEMPTION |
-				      flags));
-
-	/* Wait for the hangcheck to terminate the hanger */
-	igt_assert(sync_fence_wait(spin->out_fence, 30000) == 0); /* 30s */
-	igt_assert_eq(sync_fence_status(spin->out_fence), -EIO);
-	igt_spin_free(device, spin);
-
-	/* But no other engines/clients should be affected */
-	igt_list_for_each_entry_safe(spin, next, &list, link) {
-		igt_assert(sync_fence_wait(spin->out_fence, 0) == -ETIME);
-		igt_spin_end(spin);
-
-		igt_assert(sync_fence_wait(spin->out_fence, 500) == 0);
-		igt_assert_eq(sync_fence_status(spin->out_fence), 1);
-		igt_spin_free(device, spin);
-	}
-}
-
-/* This test covers the case where we end up in an uninitialised area of the
- * ppgtt and keep executing through it. 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
- */
-static void hangcheck_unterminated(void)
-{
-	/* timeout needs to be greater than ~5*hangcheck */
-	int64_t timeout_ns = 100ull * NSEC_PER_SEC; /* 100 seconds */
-	struct drm_i915_gem_execbuffer2 execbuf;
-	struct drm_i915_gem_exec_object2 gem_exec;
-	uint32_t handle;
-
-	igt_require(gem_uses_full_ppgtt(device));
-	igt_require_hang_ring(device, 0);
-
-	handle = gem_create(device, 4096);
-
-	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;
-
-	gem_execbuf(device, &execbuf);
-	if (gem_wait(device, handle, &timeout_ns) != 0) {
-		/* need to manually trigger an hang to clean before failing */
-		igt_force_gpu_reset(device);
-		igt_assert_f(0, "unterminated batch did not trigger an hang!");
-	}
-}
-
-igt_main
-{
-	const struct intel_execution_engine2 *e;
-	igt_hang_t hang = {};
-
-	igt_fixture {
-		device = drm_open_driver(DRIVER_INTEL);
-		igt_require_gem(device);
-
-		hang = igt_allow_hang(device, 0, HANG_ALLOW_CAPTURE);
-
-		sysfs = igt_sysfs_open(device);
-		igt_assert(sysfs != -1);
-
-		igt_require(has_error_state(sysfs));
-	}
-
-	igt_subtest("error-state-basic")
-		test_error_state_basic();
-
-	igt_subtest_with_dynamic("error-state-capture") {
-		__for_each_physical_engine(device, e) {
-			igt_dynamic_f("%s", e->name)
-				test_error_state_capture(e->flags, e->name);
-		}
-	}
-
-	igt_subtest_with_dynamic("engine-hang") {
-                int has_gpu_reset = 0;
-		struct drm_i915_getparam gp = {
-			.param = I915_PARAM_HAS_GPU_RESET,
-			.value = &has_gpu_reset,
-		};
-
-		igt_require(gem_scheduler_has_preemption(device));
-		igt_params_set(device, "reset", "%u", -1);
-                ioctl(device, DRM_IOCTL_I915_GETPARAM, &gp);
-		igt_require(has_gpu_reset > 1);
-
-		__for_each_physical_engine(device, e) {
-			igt_dynamic_f("%s", e->name)
-				test_engine_hang(e, 0);
-		}
-	}
-
-	igt_subtest_with_dynamic("engine-error") {
-		int has_gpu_reset = 0;
-		struct drm_i915_getparam gp = {
-			.param = I915_PARAM_HAS_GPU_RESET,
-			.value = &has_gpu_reset,
-		};
-
-		igt_params_set(device, "reset", "%u", -1);
-		ioctl(device, DRM_IOCTL_I915_GETPARAM, &gp);
-		igt_require(has_gpu_reset > 1);
-
-		__for_each_physical_engine(device, e) {
-			igt_dynamic_f("%s", e->name)
-				test_engine_hang(e, IGT_SPIN_INVALID_CS);
-		}
-	}
-
-	igt_subtest("hangcheck-unterminated")
-		hangcheck_unterminated();
-
-	igt_fixture {
-		igt_disallow_hang(device, hang);
-	}
-}
diff --git a/tests/intel-ci/fast-feedback.testlist b/tests/intel-ci/fast-feedback.testlist
index eaa904fa..60d2ded6 100644
--- a/tests/intel-ci/fast-feedback.testlist
+++ b/tests/intel-ci/fast-feedback.testlist
@@ -48,7 +48,6 @@ igt at gem_wait@busy at all
 igt at gem_wait@wait at all
 igt at i915_getparams_basic@basic-eu-total
 igt at i915_getparams_basic@basic-subslice-total
-igt at i915_hangman@error-state-basic
 igt at kms_addfb_basic@addfb25-bad-modifier
 igt at kms_addfb_basic@addfb25-framebuffer-vs-set-tiling
 igt at kms_addfb_basic@addfb25-modifier-no-flag
diff --git a/tests/meson.build b/tests/meson.build
index 825e0183..a54e07f7 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -224,7 +224,6 @@ i915_progs = [
 	'gem_workarounds',
 	'i915_fb_tiling',
 	'i915_getparams_basic',
-	'i915_hangman',
 	'i915_module_load',
 	'i915_pciid',
 	'i915_pm_backlight',
-- 
2.25.1



More information about the igt-dev mailing list