summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2014-05-28 09:01:56 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2014-05-28 09:05:57 +0100
commit321273ff76fa16aabec0c6b0a63039525a4fec1b (patch)
tree6dcb68f3acbe1cfcc5695f5eda270e71338f5a46
parente4ba3b75e6de35483b2edea21ceda145ef0b3311 (diff)
Factor in kernel object overhead when checking available memory for tests
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r--lib/igt_aux.h4
-rw-r--r--lib/intel_os.c30
-rw-r--r--tests/eviction_common.c25
-rw-r--r--tests/gem_evict_everything.c4
-rw-r--r--tests/gem_tiled_swapping.c3
5 files changed, 49 insertions, 17 deletions
diff --git a/lib/igt_aux.h b/lib/igt_aux.h
index 597580da..db0dea84 100644
--- a/lib/igt_aux.h
+++ b/lib/igt_aux.h
@@ -77,4 +77,8 @@ uint64_t intel_get_avail_ram_mb(void);
uint64_t intel_get_total_ram_mb(void);
uint64_t intel_get_total_swap_mb(void);
+bool intel_check_memory(uint32_t count, uint32_t size, unsigned mode);
+#define CHECK_RAM 0x1
+#define CHECK_SWAP 0x2
+
#endif /* IGT_AUX_H */
diff --git a/lib/intel_os.c b/lib/intel_os.c
index 7d9a703a..e717c7b5 100644
--- a/lib/intel_os.c
+++ b/lib/intel_os.c
@@ -185,6 +185,36 @@ intel_get_total_swap_mb(void)
return retval / (1024*1024);
}
+bool intel_check_memory(uint32_t count, uint32_t size, unsigned mode)
+{
+/* rough estimate of how many bytes the kernel requires to track each object */
+#define KERNEL_BO_OVERHEAD 512
+ uint64_t required, total;
+
+ required = count;
+ required *= size + KERNEL_BO_OVERHEAD;
+ required = ALIGN(required, 4096);
+
+ total = 0;
+ if (mode & (CHECK_RAM | CHECK_SWAP))
+ total += intel_get_avail_ram_mb();
+ if (mode & CHECK_SWAP)
+ total += intel_get_total_swap_mb();
+ total *= 1024 * 1024;
+
+ if (total <= required) {
+ igt_log(IGT_LOG_INFO,
+ "Estimated that we need %llu bytes for the test, but only have %llu bytes available (%s%s)\n",
+ (long long)required, (long long)total,
+ mode & CHECK_RAM ? "RAM" : "",
+ mode & CHECK_SWAP ? " + swap": "");
+ return 0;
+ }
+
+ return 1;
+}
+
+
void
intel_purge_vm_caches(void)
{
diff --git a/tests/eviction_common.c b/tests/eviction_common.c
index 2d8e60ad..76cf26b8 100644
--- a/tests/eviction_common.c
+++ b/tests/eviction_common.c
@@ -101,13 +101,12 @@ static int minor_evictions(int fd, struct igt_eviction_test_ops *ops,
}
static int major_evictions(int fd, struct igt_eviction_test_ops *ops,
- int surface_size, int nr_surfaces)
+ int surface_size, int nr_surfaces)
{
int n, m, loop;
uint32_t *bo;
- igt_require((uint64_t)nr_surfaces * surface_size / (1024 * 1024)
- < intel_get_total_ram_mb() * 9 / 10);
+ igt_require(intel_check_memory(nr_surfaces, surface_size, CHECK_RAM));
bo = malloc(nr_surfaces*sizeof(*bo));
igt_assert(bo);
@@ -128,19 +127,20 @@ static int major_evictions(int fd, struct igt_eviction_test_ops *ops,
}
static int swapping_evictions(int fd, struct igt_eviction_test_ops *ops,
- int surface_size,
- int working_surfaces,
- int trash_surfaces)
+ int surface_size,
+ int working_surfaces,
+ int trash_surfaces)
{
uint32_t *bo;
int i, n, pass;
- igt_require((uint64_t)working_surfaces * surface_size / (1024 * 1024)
- < intel_get_total_ram_mb() * 9 / 10);
+ igt_require(intel_check_memory(working_surfaces, surface_size, CHECK_RAM));
if (trash_surfaces < working_surfaces)
trash_surfaces = working_surfaces;
+ igt_require(intel_check_memory(trash_surfaces, surface_size, CHECK_RAM | CHECK_SWAP));
+
bo = malloc(trash_surfaces*sizeof(*bo));
igt_assert(bo);
@@ -173,19 +173,18 @@ static int forking_evictions(int fd, struct igt_eviction_test_ops *ops,
int num_threads = sysconf(_SC_NPROCESSORS_ONLN);
int bo_count;
- igt_require((uint64_t)working_surfaces * surface_size / (1024 * 1024)
- < intel_get_total_ram_mb() * 9 / 10);
+ igt_require(intel_check_memory(working_surfaces, surface_size, CHECK_RAM));
if (flags & FORKING_EVICTIONS_SWAPPING) {
- igt_require(intel_get_total_ram_mb() / 4
- < intel_get_total_swap_mb());
bo_count = trash_surfaces;
-
if (bo_count < working_surfaces)
bo_count = working_surfaces;
+
} else
bo_count = working_surfaces;
+ igt_require(intel_check_memory(bo_count, surface_size, CHECK_RAM | CHECK_SWAP));
+
bo = malloc(bo_count*sizeof(*bo));
igt_assert(bo);
diff --git a/tests/gem_evict_everything.c b/tests/gem_evict_everything.c
index c595302e..6daf6c06 100644
--- a/tests/gem_evict_everything.c
+++ b/tests/gem_evict_everything.c
@@ -150,6 +150,7 @@ static void test_forking_evictions(int fd, int size, int count,
int trash_count;
trash_count = intel_get_total_ram_mb() * 11 / 10;
+ igt_require(intel_check_memory(trash_count, size, CHECK_RAM | CHECK_SWAP));
forking_evictions(fd, &fault_ops, size, count, trash_count, flags);
}
@@ -158,9 +159,8 @@ static void test_swapping_evictions(int fd, int size, int count)
{
int trash_count;
- igt_require(intel_get_total_ram_mb() / 4 < intel_get_total_swap_mb());
-
trash_count = intel_get_total_ram_mb() * 11 / 10;
+ igt_require(intel_check_memory(trash_count, size, CHECK_RAM | CHECK_SWAP));
swapping_evictions(fd, &fault_ops, size, count, trash_count);
}
diff --git a/tests/gem_tiled_swapping.c b/tests/gem_tiled_swapping.c
index 3bd2fa7e..86c79f2d 100644
--- a/tests/gem_tiled_swapping.c
+++ b/tests/gem_tiled_swapping.c
@@ -171,8 +171,7 @@ igt_simple_main
(long)intel_get_avail_ram_mb(),
(long)intel_get_total_ram_mb(),
(long)intel_get_total_swap_mb());
-
- igt_require(count < intel_get_avail_ram_mb() + intel_get_total_swap_mb());
+ igt_require(intel_check_memory(count, 1024*1024, CHECK_RAM | CHECK_SWAP));
for (n = 0; n < count; n++) {
bo_handles[n] = create_bo_and_fill(fd);