[igt-dev] [PATCH 1/1] lib/gem_cs_prefetch: enable on Simics Simulator.

Caz Yokoyama caz.yokoyama at intel.com
Tue Apr 16 19:12:52 UTC 2019


As its comment says, _intel_require_memory() wll be removed when all test
calls _intel_require_memory().

Signed-off-by: Caz Yokoyama <caz.yokoyama at intel.com>
Cc: Stuart Summers <stuart.summers at intel.com>
---
 lib/intel_os.c               | 42 ++++++++++++++++++++++++++++++++++++
 tests/i915/gem_cs_prefetch.c | 21 ++++++++++++++----
 2 files changed, 59 insertions(+), 4 deletions(-)

diff --git a/lib/intel_os.c b/lib/intel_os.c
index dd93bea1..c1aab19a 100644
--- a/lib/intel_os.c
+++ b/lib/intel_os.c
@@ -414,6 +414,48 @@ void intel_require_memory(uint64_t count, uint64_t size, unsigned mode)
 		      (long long)vfs_file_max());
 }
 
+/*
+ * same as intel_require_memory() except for no igt_skip_on_simulation()
+ * Will be removed when all test calls _intel_require_memory().
+ */
+void _intel_require_memory(uint64_t count, uint64_t size, unsigned mode)
+{
+	uint64_t required, total;
+	bool sufficient_memory;
+
+	sufficient_memory = __intel_check_memory(count, size, mode,
+						 &required, &total);
+	if (!sufficient_memory) {
+		int dir = open("/proc", O_RDONLY);
+		char *info;
+
+		info = igt_sysfs_get(dir, "meminfo");
+		if (info) {
+			igt_warn("Insufficient free memory; /proc/meminfo:\n%s",
+				 info);
+			free(info);
+		}
+
+		info = igt_sysfs_get(dir, "slabinfo");
+		if (info) {
+			igt_warn("Insufficient free memory; /proc/slabinfo:\n%s",
+				 info);
+			free(info);
+		}
+
+		close(dir);
+	}
+
+	igt_require_f(sufficient_memory,
+		      "Estimated that we need %'llu objects and %'llu MiB for the test, but only have %'llu MiB available (%s%s) and a maximum of %'llu objects\n",
+		      (long long)count,
+		      (long long)((required + ((1<<20) - 1)) >> 20),
+		      (long long)(total >> 20),
+		      mode & (CHECK_RAM | CHECK_SWAP) ? "RAM" : "",
+		      mode & CHECK_SWAP ? " + swap": "",
+		      (long long)vfs_file_max());
+}
+
 void intel_purge_vm_caches(int drm_fd)
 {
 	int fd;
diff --git a/tests/i915/gem_cs_prefetch.c b/tests/i915/gem_cs_prefetch.c
index 2b865368..26ff1bc2 100644
--- a/tests/i915/gem_cs_prefetch.c
+++ b/tests/i915/gem_cs_prefetch.c
@@ -92,13 +92,20 @@ static void can_test_ring(unsigned ring)
 	close(fd);
 }
 
+/*
+ * Following number is calculated from actual execution in Simics, i.e.
+ * __intel_check_memory() reports 7948206080 byte of main memory in total
+ * gem_create() reports ENOMEM on 14279th execution.
+ */
+#define KERNEL_BO_OVERHEAD_SIMICS (7948206080 / 14279-1 - BATCH_SIZE)
 static void test_ring(unsigned ring)
 {
 	struct drm_i915_gem_execbuffer2 execbuf;
 	struct drm_i915_gem_exec_object2 obj[2];
 	struct shadow shadow;
-	uint64_t i, count;
+	uint64_t i, count, required, total;
 	int fd, gen;
+	bool sufficient_memory;
 
 	can_test_ring(ring);
 
@@ -107,7 +114,15 @@ static void test_ring(unsigned ring)
 	setup(fd, gen, &shadow);
 
 	count = gem_aperture_size(fd) / BATCH_SIZE;
-	intel_require_memory(count, BATCH_SIZE, CHECK_RAM);
+	if (igt_run_in_simulation()) {
+		sufficient_memory = __intel_check_memory(count, BATCH_SIZE,
+							 CHECK_RAM, &required,
+							 &total);
+		if (!sufficient_memory)
+			count = total /
+			  (BATCH_SIZE + KERNEL_BO_OVERHEAD_SIMICS);
+	}
+	_intel_require_memory(count, BATCH_SIZE, CHECK_RAM);
 	/* Fill the entire gart with batches and run them. */
 	memset(obj, 0, sizeof(obj));
 	obj[1].handle = shadow.handle;
@@ -141,8 +156,6 @@ igt_main
 {
 	const struct intel_execution_engine *e;
 
-	igt_skip_on_simulation();
-
 	for (e = intel_execution_engines; e->name; e++)
 		igt_subtest_f("%s", e->name)
 			test_ring(e->exec_id | e->flags);
-- 
2.17.1



More information about the igt-dev mailing list