From e8869c4bc439de941be399d156323620a2d6ecda Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Thu, 3 Apr 2014 09:43:58 +0100 Subject: gem_tiled_swapping: Limit to available memory If there is not enough free RAM+swap for us to execute our test, we will hit OOM, so check first. Signed-off-by: Chris Wilson --- lib/igt_aux.h | 1 + lib/intel_os.c | 34 ++++++++++++++++++++++++++++++++++ tests/gem_tiled_swapping.c | 13 ++++++++++--- 3 files changed, 45 insertions(+), 3 deletions(-) diff --git a/lib/igt_aux.h b/lib/igt_aux.h index 25a479f2..948101d2 100644 --- a/lib/igt_aux.h +++ b/lib/igt_aux.h @@ -61,6 +61,7 @@ void igt_wait_for_keypress(void); /* These are separate to allow easier testing when porting, see the comment at * the bottom of intel_os.c. */ +uint64_t intel_get_avail_ram_mb(void); uint64_t intel_get_total_ram_mb(void); uint64_t intel_get_total_swap_mb(void); diff --git a/lib/intel_os.c b/lib/intel_os.c index fb9f19cb..6f0621c7 100644 --- a/lib/intel_os.c +++ b/lib/intel_os.c @@ -85,6 +85,40 @@ intel_get_total_ram_mb(void) return retval / (1024*1024); } +/** + * intel_get_avail_ram_mb: + * + * Returns: + * The amount of unused system RAM available in MB. + */ +uint64_t +intel_get_avail_ram_mb(void) +{ + uint64_t retval; + +#ifdef HAVE_STRUCT_SYSINFO_TOTALRAM /* Linux */ + struct sysinfo sysinf; + int ret; + + ret = sysinfo(&sysinf); + assert(ret == 0); + + retval = sysinf.freeram; + retval *= sysinf.mem_unit; +#elif defined(_SC_PAGESIZE) && defined(_SC_PHYS_PAGES) /* Solaris */ + long pagesize, npages; + + pagesize = sysconf(_SC_PAGESIZE); + npages = sysconf(_SC_AVPHYS_PAGES); + + retval = (uint64_t) pagesize * npages; +#else +#error "Unknown how to get available RAM for this OS" +#endif + + return retval / (1024*1024); +} + /** * intel_get_total_swap_mb: * diff --git a/tests/gem_tiled_swapping.c b/tests/gem_tiled_swapping.c index 74723645..eb1453ca 100644 --- a/tests/gem_tiled_swapping.c +++ b/tests/gem_tiled_swapping.c @@ -104,15 +104,22 @@ igt_simple_main igt_skip_on_simulation(); fd = drm_open_any(); - /* need slightly more than total ram */ - count = intel_get_total_ram_mb() * 11 / 10; + /* need slightly more than available memory */ + count = intel_get_total_ram_mb() + intel_get_total_swap_mb() / 4; bo_handles = calloc(count, sizeof(uint32_t)); igt_assert(bo_handles); idx_arr = calloc(count, sizeof(int)); igt_assert(idx_arr); - igt_require(intel_get_total_ram_mb() / 4 < intel_get_total_swap_mb()); + igt_log(IGT_LOG_INFO, + "Using %d 1MiB objects (available RAM: %ld/%ld, swap: %ld)\n", + count, + (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()); for (i = 0; i < count; i++) { bo_handles[i] = create_bo_and_fill(fd); -- cgit v1.2.3