From: Daniel Vetter Date: Sun, 19 Jan 2014 17:01:24 +0000 (+0100) Subject: tests: Add gem_fd_exhaustion X-Git-Tag: intel-gpu-tools-1.6~174 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=70082e3677711bc01330ba3483fbdce5779f915d;p=profile%2Fextras%2Fintel-gpu-tools.git tests: Add gem_fd_exhaustion Exhausts the system limit on open files and then tries to create a new shmem-backed gem object. Linus Torvalds reported that this blows up on a null obj->base.filp, but I can't reproduce this here: http://lists.freedesktop.org/archives/intel-gfx/2014-January/038433.html Signed-off-by: Daniel Vetter --- diff --git a/tests/.gitignore b/tests/.gitignore index 1e52c2f..7377275 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -35,6 +35,7 @@ gem_exec_blt gem_exec_faulting_reloc gem_exec_lut_handle gem_exec_nop +gem_fd_exhaustion gem_fenced_exec_thrash gem_fence_thrash gem_flink diff --git a/tests/Makefile.sources b/tests/Makefile.sources index 74ea1b5..a8c0c96 100644 --- a/tests/Makefile.sources +++ b/tests/Makefile.sources @@ -85,6 +85,7 @@ TESTS_progs = \ gem_exec_big \ gem_exec_blt \ gem_exec_lut_handle \ + gem_fd_exhaustion \ gem_gtt_cpu_tlb \ gem_gtt_hog \ gem_gtt_speed \ diff --git a/tests/gem_fd_exhaustion.c b/tests/gem_fd_exhaustion.c new file mode 100644 index 0000000..77faff2 --- /dev/null +++ b/tests/gem_fd_exhaustion.c @@ -0,0 +1,83 @@ +/* + * Copyright © 2014 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + * Authors: + * Daniel Vetter + * + */ + +#include +#include +#include +#include +#include +#include +#include "drmtest.h" + + +#define FD_ARR_SZ 100 +int fd_arr[FD_ARR_SZ]; + +igt_simple_main +{ + int fd, i; + struct rlimit rlim; + unsigned nofile_rlim; + FILE *file_max = fopen("/proc/sys/fs/file-max", "r"); + igt_assert(fscanf(file_max, "%u", &nofile_rlim) == 1); + fclose(file_max); + + printf("System limit for open files is %u\n", nofile_rlim); + + igt_assert(getrlimit(RLIMIT_NOFILE, &rlim) == 0); + rlim.rlim_cur = nofile_rlim; + rlim.rlim_max = nofile_rlim; + igt_assert(setrlimit(RLIMIT_NOFILE, &rlim) == 0); + + fd = drm_open_any(); + + igt_assert(open("/dev/null", O_RDONLY) >= 0); + + for (i = 0; ; i++) { + int tmp_fd = open("/dev/null", O_RDONLY); + uint32_t 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; + } + } + + /* 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]); + + close(fd); +}