diff mbox

drm/i915: Build request info on stack before printk

Message ID 20180424010839.22860-1-chris@chris-wilson.co.uk (mailing list archive)
State New, archived
Headers show

Commit Message

Chris Wilson April 24, 2018, 1:08 a.m. UTC
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>
---
 drivers/gpu/drm/i915/intel_engine_cs.c | 24 +++++++++++++++---------
 1 file changed, 15 insertions(+), 9 deletions(-)

Comments

Chris Wilson April 24, 2018, 1:25 a.m. UTC | #1
Quoting Chris Wilson (2018-04-24 02:08:39)
> 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>
> ---

I put back the i915 parameter as it makes later patches easier. The
conflict in rebasing was a reminder why it was there in the first place.
-Chris

>  drivers/gpu/drm/i915/intel_engine_cs.c | 24 +++++++++++++++---------
>  1 file changed, 15 insertions(+), 9 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/intel_engine_cs.c b/drivers/gpu/drm/i915/intel_engine_cs.c
> index be608f7111f5..66cddd059666 100644
> --- a/drivers/gpu/drm/i915/intel_engine_cs.c
> +++ b/drivers/gpu/drm/i915/intel_engine_cs.c
> @@ -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);
>  }
> -- 
> 2.17.0
>
Tvrtko Ursulin April 24, 2018, 11:57 a.m. UTC | #2
On 24/04/2018 02:08, Chris Wilson wrote:
> 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>
> ---
>   drivers/gpu/drm/i915/intel_engine_cs.c | 24 +++++++++++++++---------
>   1 file changed, 15 insertions(+), 9 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/intel_engine_cs.c b/drivers/gpu/drm/i915/intel_engine_cs.c
> index be608f7111f5..66cddd059666 100644
> --- a/drivers/gpu/drm/i915/intel_engine_cs.c
> +++ b/drivers/gpu/drm/i915/intel_engine_cs.c
> @@ -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];

Worth using less stack space? 6 chars plus max negative int (12) - 18 
should be enough?

> +	int x = 0;
> +
> +	x = print_sched_attr(rq->i915, &rq->sched.attr, buf, x, sizeof(buf));

x is effectively unused. Drop it and simplify the helper and all?

>   
> -	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);
>   }
> 

Regards,

Tvrtko
Chris Wilson April 24, 2018, 12:04 p.m. UTC | #3
Quoting Tvrtko Ursulin (2018-04-24 12:57:41)
> 
> On 24/04/2018 02:08, Chris Wilson wrote:
> > 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>
> > ---
> >   drivers/gpu/drm/i915/intel_engine_cs.c | 24 +++++++++++++++---------
> >   1 file changed, 15 insertions(+), 9 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/i915/intel_engine_cs.c b/drivers/gpu/drm/i915/intel_engine_cs.c
> > index be608f7111f5..66cddd059666 100644
> > --- a/drivers/gpu/drm/i915/intel_engine_cs.c
> > +++ b/drivers/gpu/drm/i915/intel_engine_cs.c
> > @@ -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];
> 
> Worth using less stack space? 6 chars plus max negative int (12) - 18 
> should be enough?
> 
> > +     int x = 0;
> > +
> > +     x = print_sched_attr(rq->i915, &rq->sched.attr, buf, x, sizeof(buf));
> 
> x is effectively unused. Drop it and simplify the helper and all?

It felt like a common enough idiom to allow for future expansion. It's
going to be required at some point in the near future, I'm sure.
-Chris
Chris Wilson April 24, 2018, 12:24 p.m. UTC | #4
Quoting Chris Wilson (2018-04-24 02:08:39)
> 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>

From IRC,
Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
-Chris
diff mbox

Patch

diff --git a/drivers/gpu/drm/i915/intel_engine_cs.c b/drivers/gpu/drm/i915/intel_engine_cs.c
index be608f7111f5..66cddd059666 100644
--- a/drivers/gpu/drm/i915/intel_engine_cs.c
+++ b/drivers/gpu/drm/i915/intel_engine_cs.c
@@ -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);
 }