diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2014-09-06 08:16:27 +0100 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2015-01-07 17:35:14 +0000 |
commit | a315476a6ba07f83631a60355bd01a6f73ced50b (patch) | |
tree | 16d682819835985dfad375206be52c2f2dfb14b4 /lib | |
parent | ce79b7aa8010d848d4e9c417bcba375eac958f60 (diff) |
igt/gem_evict_(alignment|everything): contend with GPU hangs
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/igt_aux.c | 69 | ||||
-rw-r--r-- | lib/igt_aux.h | 4 |
2 files changed, 73 insertions, 0 deletions
diff --git a/lib/igt_aux.c b/lib/igt_aux.c index 193d771b..76681062 100644 --- a/lib/igt_aux.c +++ b/lib/igt_aux.c @@ -53,6 +53,7 @@ #include "intel_chipset.h" #include "igt_aux.h" #include "igt_debugfs.h" +#include "igt_gt.h" #include "config.h" #include "intel_reg.h" #include "ioctl_wrappers.h" @@ -131,6 +132,74 @@ void igt_stop_signal_helper(void) sig_stat = 0; } +/* GPU abusers */ +static struct igt_helper_process hang_helper; +static void __attribute__((noreturn)) +hang_helper_process(pid_t pid, int fd, int gen) +{ + while (1) { + if (kill(pid, 0)) /* Parent has died, so must we. */ + exit(0); + + igt_post_hang_ring(fd, + igt_hang_ring(fd, gen, I915_EXEC_DEFAULT)); + + sleep(1); + } +} + +/** + * igt_fork_hang_helper: + * + * Fork a child process using #igt_fork_helper to hang the default engine + * of the GPU at regular intervals. + * + * This is useful to exercise slow running code (such as aperture placement) + * which needs to be robust against a GPU reset. + * + * In tests with subtests this function can be called outside of failure + * catching code blocks like #igt_fixture or #igt_subtest. + */ +int igt_fork_hang_helper(void) +{ + int fd, gen; + + if (igt_only_list_subtests()) + return 1; + + fd = drm_open_any(); + if (fd == -1) + return 0; + + gen = intel_gen(intel_get_drm_devid(fd)); + if (gen < 5) { + close(fd); + return 0; + } + + igt_fork_helper(&hang_helper) + hang_helper_process(getppid(), fd, gen); + + close(fd); + return 1; +} + +/** + * igt_stop_hang_helper: + * + * Stops the child process spawned with igt_fork_hang_helper(). + * + * In tests with subtests this function can be called outside of failure + * catching code blocks like #igt_fixture or #igt_subtest. + */ +void igt_stop_hang_helper(void) +{ + if (igt_only_list_subtests()) + return; + + igt_stop_helper(&hang_helper); +} + /** * igt_check_boolean_env_var: * @env_var: environment variable name diff --git a/lib/igt_aux.h b/lib/igt_aux.h index c420b3ff..e1909a98 100644 --- a/lib/igt_aux.h +++ b/lib/igt_aux.h @@ -38,6 +38,10 @@ extern int num_trash_bos; /* generally useful helpers */ void igt_fork_signal_helper(void); void igt_stop_signal_helper(void); + +int igt_fork_hang_helper(void); +void igt_stop_hang_helper(void); + void igt_exchange_int(void *array, unsigned i, unsigned j); void igt_permute_array(void *array, unsigned size, void (*exchange_func)(void *array, |