diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/igt_aux.h | 2 | ||||
| -rw-r--r-- | lib/intel_os.c | 53 |
2 files changed, 36 insertions, 19 deletions
diff --git a/lib/igt_aux.h b/lib/igt_aux.h index 95028665..82bd5962 100644 --- a/lib/igt_aux.h +++ b/lib/igt_aux.h @@ -86,6 +86,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); +int __intel_check_memory(uint32_t count, uint64_t size, unsigned mode, + uint64_t *out_required, uint64_t *out_total); void intel_require_memory(uint32_t count, uint64_t size, unsigned mode); #define CHECK_RAM 0x1 #define CHECK_SWAP 0x2 diff --git a/lib/intel_os.c b/lib/intel_os.c index 06361f4c..64e37222 100644 --- a/lib/intel_os.c +++ b/lib/intel_os.c @@ -192,6 +192,38 @@ intel_get_total_swap_mb(void) return retval / (1024*1024); } +int __intel_check_memory(uint32_t count, uint64_t size, unsigned mode, + uint64_t *out_required, uint64_t *out_total) +{ +/* 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); + + igt_debug("Checking %'u surfaces of size %'llu bytes (total %'llu) against %s%s\n", + count, (long long)size, (long long)required, + mode & (CHECK_RAM | CHECK_SWAP) ? "RAM" : "", + mode & CHECK_SWAP ? " + swap": ""); + + 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 (out_required) + *out_required = required; + + if (out_total) + *out_total = total; + + return required < total; +} + /** * intel_require_memory: * @count: number of surfaces that will be created @@ -217,27 +249,10 @@ intel_get_total_swap_mb(void) */ void intel_require_memory(uint32_t count, uint64_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); - - igt_debug("Checking %'u surfaces of size %'llu bytes (total %'llu) against %s%s\n", - count, (long long)size, (long long)required, - mode & (CHECK_RAM | CHECK_SWAP) ? "RAM" : "", - mode & CHECK_SWAP ? " + swap": ""); - - 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; - - igt_skip_on_f(total <= required, + igt_skip_on_f(!__intel_check_memory(count, size, mode, + &required, &total), "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 | CHECK_SWAP) ? "RAM" : "", |
