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 <daniel.vetter@ffwll.ch>
This commit is contained in:
Daniel Vetter 2014-01-19 18:01:24 +01:00
parent 36106004e0
commit 70082e3677
3 changed files with 85 additions and 0 deletions

1
tests/.gitignore vendored
View File

@ -35,6 +35,7 @@ gem_exec_blt
gem_exec_faulting_reloc gem_exec_faulting_reloc
gem_exec_lut_handle gem_exec_lut_handle
gem_exec_nop gem_exec_nop
gem_fd_exhaustion
gem_fenced_exec_thrash gem_fenced_exec_thrash
gem_fence_thrash gem_fence_thrash
gem_flink gem_flink

View File

@ -85,6 +85,7 @@ TESTS_progs = \
gem_exec_big \ gem_exec_big \
gem_exec_blt \ gem_exec_blt \
gem_exec_lut_handle \ gem_exec_lut_handle \
gem_fd_exhaustion \
gem_gtt_cpu_tlb \ gem_gtt_cpu_tlb \
gem_gtt_hog \ gem_gtt_hog \
gem_gtt_speed \ gem_gtt_speed \

83
tests/gem_fd_exhaustion.c Normal file
View File

@ -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 <daniel.vetter@ffwll.ch>
*
*/
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/resource.h>
#include <sys/time.h>
#include <fcntl.h>
#include <limits.h>
#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);
}