diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2017-09-12 21:07:03 +0100 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2017-09-28 15:18:55 +0100 |
commit | e917e926823b801208c4cc1178ea9f7755a7fab1 (patch) | |
tree | 9652c6db073f35e9feb93ca3acd4f95497856ad9 | |
parent | 2885b10f99b4beeb046e75af8b8488c229f629d3 (diff) |
lib: Capture the error state on an unexpected hang
Dump debugfs/i915_error_state to the debug channel if we detect an ERROR
uevent. This poses a few problems, not least that it is the auxiliary
process doing the dumping (so the output may be interleaved with the
test, but considering a hang occurred it is likely the test is blocked)
and the average error state is around 60k, which may prove unwieldy!
On the other hand, it may prove invaluable in debugging those impossible
to reproduce bugs.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Petri Latvala <petri.latvala@intel.com>
-rw-r--r-- | lib/igt_aux.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/lib/igt_aux.c b/lib/igt_aux.c index eb1f90f9..fa6594c3 100644 --- a/lib/igt_aux.c +++ b/lib/igt_aux.c @@ -394,7 +394,7 @@ void igt_stop_shrink_helper(void) static struct igt_helper_process hang_detector; static void __attribute__((noreturn)) -hang_detector_process(pid_t pid, dev_t rdev) +hang_detector_process(int fd, pid_t pid, dev_t rdev) { struct udev_monitor *mon = udev_monitor_new_from_netlink(udev_new(), "kernel"); @@ -428,8 +428,10 @@ hang_detector_process(pid_t pid, dev_t rdev) const char *str; str = udev_device_get_property_value(dev, "ERROR"); - if (str && atoi(str) == 1) + if (str && atoi(str) == 1) { + igt_debugfs_dump(fd, "i915_error_state"); kill(pid, SIGIO); + } } udev_device_unref(dev); @@ -461,7 +463,7 @@ void igt_fork_hang_detector(int fd) signal(SIGIO, sig_abort); igt_fork_helper(&hang_detector) - hang_detector_process(getppid(), st.st_rdev); + hang_detector_process(fd, getppid(), st.st_rdev); } void igt_stop_hang_detector(void) |