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

Caz Yokoyama
2019-04-16T19:24:59Z

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

Signed-off-by: Caz Yokoyama <caz.yokoyama@intel.com>
Cc: Stuart Summers <stuart.summers@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