lib: igt_fork_hang_helper must be run in fixtures

Because it opens an intel-specific drm fd. Fixes crashes when running
igt on no-intel.

Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
This commit is contained in:
Daniel Vetter 2015-12-03 07:45:34 +01:00
parent 39e44dfa4c
commit d8d1eab318
4 changed files with 42 additions and 53 deletions

View File

@ -190,31 +190,22 @@ hang_helper_process(pid_t pid, int fd)
* This is useful to exercise slow running code (such as aperture placement) * This is useful to exercise slow running code (such as aperture placement)
* which needs to be robust against a GPU reset. * which needs to be robust against a GPU reset.
* *
* In tests with subtests this function can be called outside of failure * This function automatically skips when test requirements aren't met using
* catching code blocks like #igt_fixture or #igt_subtest. * igt_skip().
*/ */
int igt_fork_hang_helper(void) void igt_fork_hang_helper(void)
{ {
int fd, gen; int fd, gen;
if (igt_only_list_subtests())
return 1;
fd = drm_open_driver(DRIVER_INTEL); fd = drm_open_driver(DRIVER_INTEL);
if (fd == -1)
return 0;
gen = intel_gen(intel_get_drm_devid(fd)); gen = intel_gen(intel_get_drm_devid(fd));
if (gen < 5) { igt_skip_on(gen < 5);
close(fd);
return 0;
}
igt_fork_helper(&hang_helper) igt_fork_helper(&hang_helper)
hang_helper_process(getppid(), fd); hang_helper_process(getppid(), fd);
close(fd); close(fd);
return 1;
} }
/** /**
@ -227,10 +218,8 @@ int igt_fork_hang_helper(void)
*/ */
void igt_stop_hang_helper(void) void igt_stop_hang_helper(void)
{ {
if (igt_only_list_subtests()) if (hang_helper.running)
return; igt_stop_helper(&hang_helper);
igt_stop_helper(&hang_helper);
} }
/** /**

View File

@ -36,7 +36,7 @@ typedef struct igt_hang_ring {
struct igt_hang_ring igt_hang_ring(int fd, int ring); struct igt_hang_ring igt_hang_ring(int fd, int ring);
void igt_post_hang_ring(int fd, struct igt_hang_ring arg); void igt_post_hang_ring(int fd, struct igt_hang_ring arg);
int igt_fork_hang_helper(void); void igt_fork_hang_helper(void);
void igt_stop_hang_helper(void); void igt_stop_hang_helper(void);
int igt_open_forcewake_handle(void); int igt_open_forcewake_handle(void);

View File

@ -220,22 +220,22 @@ igt_main
major_evictions(fd, size, count); major_evictions(fd, size, count);
} }
if (igt_fork_hang_helper()) { igt_subtest("minor-hang") {
igt_subtest("minor-hang") { igt_fork_hang_helper();
size = 1024 * 1024; size = 1024 * 1024;
count = 3*gem_aperture_size(fd) / size / 4; count = 3*gem_aperture_size(fd) / size / 4;
minor_evictions(fd, size, count); minor_evictions(fd, size, count);
} }
igt_subtest("major-hang") { igt_subtest("major-hang") {
size = 3*gem_aperture_size(fd) / 4; size = 3*gem_aperture_size(fd) / 4;
count = 4; count = 4;
major_evictions(fd, size, count); major_evictions(fd, size, count);
}
igt_stop_hang_helper();
} }
igt_stop_signal_helper(); igt_stop_signal_helper();
igt_fixture igt_fixture {
igt_stop_hang_helper();
close(fd); close(fd);
}
} }

View File

@ -243,32 +243,32 @@ igt_main
test_major_evictions(fd, size, count); test_major_evictions(fd, size, count);
} }
if (igt_fork_hang_helper()) { igt_fixture {
igt_fixture { igt_fork_hang_helper();
size = 1024 * 1024;
count = 3*gem_aperture_size(fd) / size / 4;
}
igt_subtest("mlocked-hang") size = 1024 * 1024;
test_mlocked_evictions(fd, size, count); count = 3*gem_aperture_size(fd) / size / 4;
igt_subtest("swapping-hang")
test_swapping_evictions(fd, size, count);
igt_subtest("minor-hang")
test_minor_evictions(fd, size, count);
igt_subtest("major-hang") {
size = 3*gem_aperture_size(fd) / 4;
count = 4;
test_major_evictions(fd, size, count);
}
igt_stop_hang_helper();
} }
igt_stop_signal_helper();
igt_subtest("mlocked-hang")
test_mlocked_evictions(fd, size, count);
igt_subtest("swapping-hang")
test_swapping_evictions(fd, size, count);
igt_subtest("minor-hang")
test_minor_evictions(fd, size, count);
igt_subtest("major-hang") {
size = 3*gem_aperture_size(fd) / 4;
count = 4;
test_major_evictions(fd, size, count);
}
igt_stop_hang_helper();
igt_fixture { igt_fixture {
igt_stop_signal_helper();
close(fd); close(fd);
} }
} }