igt/gem_userptr_blits: Limit amount of mlocked surfaces

When testing surface eviction we don't need that many surfaces as we
mlock surplus memory. Reducing the number of surfaces speeds up the test
and prevents a couple of integer overflow bugs.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=94004
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
Chris Wilson 2016-02-04 17:41:05 +00:00
parent 7b5a818581
commit 0e96238bf3
2 changed files with 11 additions and 28 deletions

View File

@ -133,7 +133,7 @@ static void mlocked_evictions(int fd, struct igt_eviction_test_ops *ops,
uint64_t surface_size,
uint64_t surface_count)
{
size_t sz, pin;
uint64_t sz, pin;
void *locked;
intel_require_memory(surface_count, surface_size, CHECK_RAM);
@ -142,10 +142,11 @@ static void mlocked_evictions(int fd, struct igt_eviction_test_ops *ops,
pin = intel_get_avail_ram_mb();
pin *= 1024 * 1024;
igt_require(pin > sz);
pin -= 3*sz/2;
pin -= sz;
igt_debug("Pinning [%ld, %ld] MiB\n",
(long)pin/(1024*1024), (long)(pin + sz)/(1024*1024));
igt_debug("Pinning [%'lld, %'lld] MiB\n",
(long long)pin/(1024*1024),
(long long)(pin + sz)/(1024*1024));
locked = malloc(pin + sz);
if (locked != NULL && mlock(locked, pin + sz)) {
@ -185,7 +186,7 @@ static void mlocked_evictions(int fd, struct igt_eviction_test_ops *ops,
locked = malloc(surface_size);
if (locked == NULL || mlock(locked, surface_size))
exit(ENOSPC);
free(locked);
}
for (n = 0; n < surface_count; n++)

View File

@ -173,8 +173,8 @@ copy(int fd, uint32_t dst, uint32_t src, unsigned int error)
reloc[1].read_domains = I915_GEM_DOMAIN_RENDER;
reloc[1].write_domain = 0;
memset(&exec, 0, sizeof(exec));
memset(obj, 0, sizeof(obj));
exec.buffer_count = 0;
obj[exec.buffer_count++].handle = dst;
if (src != dst)
obj[exec.buffer_count++].handle = src;
@ -183,19 +183,9 @@ copy(int fd, uint32_t dst, uint32_t src, unsigned int error)
obj[exec.buffer_count].relocs_ptr = (uintptr_t)reloc;
exec.buffer_count++;
exec.buffers_ptr = (uintptr_t)obj;
exec.batch_start_offset = 0;
exec.batch_len = i * 4;
exec.DR1 = exec.DR4 = 0;
exec.num_cliprects = 0;
exec.cliprects_ptr = 0;
exec.flags = HAS_BLT_RING(intel_get_drm_devid(fd)) ? I915_EXEC_BLT : 0;
i915_execbuffer2_set_context_id(exec, 0);
exec.rsvd2 = 0;
ret = drmIoctl(fd, DRM_IOCTL_I915_GEM_EXECBUFFER2, &exec);
if (ret)
ret = errno;
ret = __gem_execbuf(fd, &exec);
if (error == ~0)
igt_assert_neq(ret, 0);
@ -257,6 +247,7 @@ blit(int fd, uint32_t dst, uint32_t src, uint32_t *all_bo, int n_bo)
reloc[1].read_domains = I915_GEM_DOMAIN_RENDER;
reloc[1].write_domain = 0;
memset(&exec, 0, sizeof(exec));
obj = calloc(n_bo + 1, sizeof(*obj));
for (n = 0; n < n_bo; n++)
obj[n].handle = all_bo[n];
@ -266,19 +257,9 @@ blit(int fd, uint32_t dst, uint32_t src, uint32_t *all_bo, int n_bo)
exec.buffers_ptr = (uintptr_t)obj;
exec.buffer_count = n_bo + 1;
exec.batch_start_offset = 0;
exec.batch_len = i * 4;
exec.DR1 = exec.DR4 = 0;
exec.num_cliprects = 0;
exec.cliprects_ptr = 0;
exec.flags = HAS_BLT_RING(intel_get_drm_devid(fd)) ? I915_EXEC_BLT : 0;
i915_execbuffer2_set_context_id(exec, 0);
exec.rsvd2 = 0;
ret = drmIoctl(fd, DRM_IOCTL_I915_GEM_EXECBUFFER2, &exec);
if (ret)
ret = errno;
ret = __gem_execbuf(fd, &exec);
gem_close(fd, handle);
free(obj);
@ -1067,6 +1048,7 @@ static void test_forking_evictions(int fd, int size, int count,
static void test_mlocked_evictions(int fd, int size, int count)
{
count = min(256, count/2);
mlocked_evictions(fd, &fault_ops, size, count);
reset_handle_ptr();
}