drm/i915: Include the kernel uptime in the error state
authorChris Wilson <chris@chris-wilson.co.uk>
Tue, 25 Oct 2016 12:16:02 +0000 (13:16 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Tue, 25 Oct 2016 12:22:43 +0000 (13:22 +0100)
As well as knowing when the error occurred, it is more interesting to me
to know how long after booting the error occurred, and for good measure
record the time since last hw initialisation.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Matthew Auld <matthew.auld@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20161025121602.1457-1-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/i915_drv.h
drivers/gpu/drm/i915/i915_gem.c
drivers/gpu/drm/i915/i915_gpu_error.c

index b4cb1f0f06322f6bf2d89eb05ffc1fd2515a9fa1..7a621c74254ea3f1fd6593d2394945e86813699b 100644 (file)
@@ -746,6 +746,8 @@ struct intel_display_error_state;
 struct drm_i915_error_state {
        struct kref ref;
        struct timeval time;
+       struct timeval boottime;
+       struct timeval uptime;
 
        struct drm_i915_private *i915;
 
@@ -2099,6 +2101,8 @@ struct drm_i915_private {
                 * off the idle_work.
                 */
                struct delayed_work idle_work;
+
+               ktime_t last_init_time;
        } gt;
 
        /* perform PHY state sanity checks? */
index 0e26ee96856e945331a6f6ae7a51d436a5bf3200..9361c7b54a7f19c8c5519863a6a482fa3d4facf3 100644 (file)
@@ -4470,6 +4470,8 @@ i915_gem_init_hw(struct drm_device *dev)
        enum intel_engine_id id;
        int ret;
 
+       dev_priv->gt.last_init_time = ktime_get();
+
        /* Double layer security blanket, see i915_gem_init() */
        intel_uncore_forcewake_get(dev_priv, FORCEWAKE_ALL);
 
index 48fece3bb7a9ac9274911a3cbc692f31f5cba537..d5feace8de0d55cb07c2aa22acd6ee1b3ef8399f 100644 (file)
@@ -546,9 +546,13 @@ int i915_error_state_to_str(struct drm_i915_error_state_buf *m,
        }
 
        err_printf(m, "%s\n", error->error_msg);
-       err_printf(m, "Time: %ld s %ld us\n", error->time.tv_sec,
-                  error->time.tv_usec);
        err_printf(m, "Kernel: " UTS_RELEASE "\n");
+       err_printf(m, "Time: %ld s %ld us\n",
+                  error->time.tv_sec, error->time.tv_usec);
+       err_printf(m, "Boottime: %ld s %ld us\n",
+                  error->boottime.tv_sec, error->boottime.tv_usec);
+       err_printf(m, "Uptime: %ld s %ld us\n",
+                  error->uptime.tv_sec, error->uptime.tv_usec);
        err_print_capabilities(m, &error->device_info);
        max_hangcheck_score = 0;
        for (i = 0; i < ARRAY_SIZE(error->engine); i++) {
@@ -1549,6 +1553,10 @@ static int capture(void *data)
        i915_gem_capture_guc_log_buffer(error->i915, error);
 
        do_gettimeofday(&error->time);
+       error->boottime = ktime_to_timeval(ktime_get_boottime());
+       error->uptime =
+               ktime_to_timeval(ktime_sub(ktime_get(),
+                                          error->i915->gt.last_init_time));
 
        error->overlay = intel_overlay_capture_error_state(error->i915);
        error->display = intel_display_capture_error_state(error->i915);