drm/i915: Build request info on stack before printk
authorChris Wilson <chris@chris-wilson.co.uk>
Tue, 24 Apr 2018 01:08:39 +0000 (02:08 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Tue, 24 Apr 2018 13:00:37 +0000 (14:00 +0100)
printk unhelpfully inserts a '\n' between consecutive calls, and since
our drm_printf wrapper may be emitting info a seq_file instead,
KERN_CONT is not an option. To work with any drm_printf destination, we
need to build up the output into a temporary buf on the stack and then
feed the complete line in a single call to printk.

Fixes: b7268c5eed0a ("drm/i915: Pack params to engine->schedule() into a struct")
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20180424010839.22860-1-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/intel_engine_cs.c

index be608f7111f5e5d5b4ff158d7fdfd0ae2b522d0f..66cddd0596660c1efd8c42b9386e87e6f18eaa21 100644 (file)
@@ -1113,14 +1113,17 @@ unsigned int intel_engines_has_context_isolation(struct drm_i915_private *i915)
        return which;
 }
 
-static void print_sched_attr(struct drm_printer *m,
-                            const struct drm_i915_private *i915,
-                            const struct i915_sched_attr *attr)
+static int print_sched_attr(struct drm_i915_private *i915,
+                           const struct i915_sched_attr *attr,
+                           char *buf, int x, int len)
 {
        if (attr->priority == I915_PRIORITY_INVALID)
-               return;
+               return x;
+
+       x += snprintf(buf + x, len - x,
+                     " prio=%d", attr->priority);
 
-       drm_printf(m, "prio=%d", attr->priority);
+       return x;
 }
 
 static void print_request(struct drm_printer *m,
@@ -1128,14 +1131,17 @@ static void print_request(struct drm_printer *m,
                          const char *prefix)
 {
        const char *name = rq->fence.ops->get_timeline_name(&rq->fence);
+       char buf[80];
+       int x = 0;
+
+       x = print_sched_attr(rq->i915, &rq->sched.attr, buf, x, sizeof(buf));
 
-       drm_printf(m, "%s%x%s [%llx:%x] ",
+       drm_printf(m, "%s%x%s [%llx:%x]%s @ %dms: %s\n",
                   prefix,
                   rq->global_seqno,
                   i915_request_completed(rq) ? "!" : "",
-                  rq->fence.context, rq->fence.seqno);
-       print_sched_attr(m, rq->i915, &rq->sched.attr);
-       drm_printf(m, " @ %dms: %s\n",
+                  rq->fence.context, rq->fence.seqno,
+                  buf,
                   jiffies_to_msecs(jiffies - rq->emitted_jiffies),
                   name);
 }