tests/gem_fd_exhaustion: Make it work

- We need to drop root to actually hit the limits. This requires us to
  fork the actual test since otherwise the exit handlers (which
  require root) fail the entire test.
- Don't assert that the gem create ioctl succeeds, it won't on the
  final run of the loop.

Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
This commit is contained in:
Daniel Vetter 2014-01-19 22:15:13 +01:00
parent 7d2ba073ad
commit 5b91475130

View File

@ -57,27 +57,35 @@ igt_simple_main
igt_assert(open("/dev/null", O_RDONLY) >= 0);
for (i = 0; ; i++) {
int tmp_fd = open("/dev/null", O_RDONLY);
uint32_t handle;
igt_fork(n, 1) {
igt_drop_root();
if (tmp_fd >= 0 && i < FD_ARR_SZ)
fd_arr[i] = tmp_fd;
for (i = 0; ; i++) {
int tmp_fd = open("/dev/null", O_RDONLY);
uint32_t handle;
handle = gem_create(fd, 4096);
if (handle)
gem_close(fd, handle);
if (tmp_fd >= 0 && i < FD_ARR_SZ)
fd_arr[i] = tmp_fd;
handle = __gem_create(fd, 4096);
if (handle)
gem_close(fd, handle);
if (!handle || tmp_fd < 0) {
printf("fd exhaustion after %i rounds.\n", i);
break;
if (tmp_fd < 0) {
/* Ensure we actually hit the failure path ... */
igt_assert(handle == 0);
printf("fd exhaustion after %i rounds.\n", i);
break;
}
}
/* The child will free all the fds when exiting, so no need to
* clean up to mess to ensure that the parent can at least run
* the exit handlers. */
}
/* free a few fd so that the exit handlers can at least run. */
for (i = 0; i < FD_ARR_SZ; i++)
close(fd_arr[i]);
igt_waitchildren();
close(fd);
}