diff options
-rw-r--r-- | lib/igt_aux.c | 58 | ||||
-rw-r--r-- | lib/igt_aux.h | 3 | ||||
-rw-r--r-- | tests/gem_tiled_swapping.c | 10 |
3 files changed, 70 insertions, 1 deletions
diff --git a/lib/igt_aux.c b/lib/igt_aux.c index 3051d84c..11618282 100644 --- a/lib/igt_aux.c +++ b/lib/igt_aux.c @@ -601,3 +601,61 @@ struct type_name connector_type_names[] = { }; type_name_fn(connector_type) + + +/** + * igt_lock_mem: + * @size: the amount of memory to lock into RAM, in MB + * + * Allocate @size MB of memory and lock it into RAM. This releases any + * previously locked memory. + * + * Use #igt_unlock_mem to release the currently locked memory. + */ +static char *locked_mem; +static size_t locked_size; + +void igt_lock_mem(size_t size) +{ + long pagesize = sysconf(_SC_PAGESIZE); + size_t i; + int ret; + + if (size == 0) { + return; + } + + if (locked_mem) { + igt_unlock_mem(); + igt_warn("Unlocking previously locked memory.\n"); + } + + locked_size = size * 1024 * 1024; + + locked_mem = malloc(locked_size); + igt_require_f(locked_mem, + "Could not allocate enough memory to lock.\n"); + + /* write into each page to ensure it is allocated */ + for (i = 0; i < locked_size; i += pagesize) + locked_mem[i] = i; + + ret = mlock(locked_mem, locked_size); + igt_assert_f(ret == 0, "Could not lock memory into RAM.\n"); +} + +/** + * igt_unlock_mem: + * + * Release and free the RAM used by #igt_lock_mem. + */ +void igt_unlock_mem(void) +{ + if (!locked_mem) + return; + + munlock(locked_mem, locked_size); + + free(locked_mem); + locked_mem = NULL; +} diff --git a/lib/igt_aux.h b/lib/igt_aux.h index 63e1b06a..c420b3ff 100644 --- a/lib/igt_aux.h +++ b/lib/igt_aux.h @@ -96,4 +96,7 @@ void intel_require_memory(uint32_t count, uint32_t size, unsigned mode); (b) = _tmp; \ } while (0) +void igt_lock_mem(size_t size); +void igt_unlock_mem(void); + #endif /* IGT_AUX_H */ diff --git a/tests/gem_tiled_swapping.c b/tests/gem_tiled_swapping.c index b92c9d79..d4ffd65e 100644 --- a/tests/gem_tiled_swapping.c +++ b/tests/gem_tiled_swapping.c @@ -70,6 +70,7 @@ IGT_TEST_DESCRIPTION("Exercise swizzle code for swapping."); static uint32_t current_tiling_mode; #define PAGE_SIZE 4096 +#define AVAIL_RAM 512 static uint32_t create_bo_and_fill(int fd) @@ -151,13 +152,20 @@ igt_main int fd, n, count, num_threads; igt_fixture { + size_t lock_size; + current_tiling_mode = I915_TILING_X; intel_purge_vm_caches(); fd = drm_open_any(); + + /* lock RAM, leaving only 512MB available */ + lock_size = max(0, intel_get_total_ram_mb() - AVAIL_RAM); + igt_lock_mem(lock_size); + /* need slightly more than available memory */ - count = intel_get_total_ram_mb() + intel_get_total_swap_mb() / 4; + count = min(intel_get_total_ram_mb(), AVAIL_RAM) * 1.25; bo_handles = calloc(count, sizeof(uint32_t)); igt_assert(bo_handles); |