From: Chris Wilson Date: Wed, 28 May 2014 08:01:56 +0000 (+0100) Subject: Factor in kernel object overhead when checking available memory for tests X-Git-Tag: intel-gpu-tools-1.7~40 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=321273ff76fa16aabec0c6b0a63039525a4fec1b;p=profile%2Fextras%2Fintel-gpu-tools.git Factor in kernel object overhead when checking available memory for tests Signed-off-by: Chris Wilson --- diff --git a/lib/igt_aux.h b/lib/igt_aux.h index 597580d..db0dea8 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 7d9a703..e717c7b 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 2d8e60a..76cf26b 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 c595302..6daf6c0 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 3bd2fa7..86c79f2 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);