diff mbox

[1/2] drm/i915/scheduler: add gvt force-single-submission for guc

Message ID 1490665792-5544-2-git-send-email-chuanxiao.dong@intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Chuanxiao.Dong March 28, 2017, 1:49 a.m. UTC
GVT needs single submission and cannot allow merge. So when GuC submitting
a GVT request, the next one should be submitted to guc later until the
previous one is completed. This is following the usage when using execlist
mode submission.

Cc: chris@chris-wilson.co.uk
Signed-off-by: Chuanxiao Dong <chuanxiao.dong@intel.com>
---
 drivers/gpu/drm/i915/i915_gem_context.h    | 20 ++++++++++++++++++++
 drivers/gpu/drm/i915/i915_guc_submission.c |  6 +++++-
 drivers/gpu/drm/i915/intel_lrc.c           | 25 ++++---------------------
 3 files changed, 29 insertions(+), 22 deletions(-)

Comments

Chris Wilson March 28, 2017, 8:21 a.m. UTC | #1
On Tue, Mar 28, 2017 at 09:49:51AM +0800, Chuanxiao Dong wrote:
> GVT needs single submission and cannot allow merge. So when GuC submitting
> a GVT request, the next one should be submitted to guc later until the
> previous one is completed. This is following the usage when using execlist
> mode submission.
> 
> Cc: chris@chris-wilson.co.uk
> Signed-off-by: Chuanxiao Dong <chuanxiao.dong@intel.com>
> ---
>  drivers/gpu/drm/i915/i915_gem_context.h    | 20 ++++++++++++++++++++
>  drivers/gpu/drm/i915/i915_guc_submission.c |  6 +++++-
>  drivers/gpu/drm/i915/intel_lrc.c           | 25 ++++---------------------
>  3 files changed, 29 insertions(+), 22 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/i915_gem_context.h b/drivers/gpu/drm/i915/i915_gem_context.h
> index 4af2ab94..025eba2 100644
> --- a/drivers/gpu/drm/i915/i915_gem_context.h
> +++ b/drivers/gpu/drm/i915/i915_gem_context.h
> @@ -246,6 +246,26 @@ static inline bool i915_gem_context_is_kernel(struct i915_gem_context *ctx)
>  	return !ctx->file_priv;
>  }
>  
> +static inline bool
> +i915_gem_context_single_port_submit(const struct i915_gem_context *ctx)
> +{
> +	return (IS_ENABLED(CONFIG_DRM_I915_GVT) &&
> +		i915_gem_context_force_single_submission(ctx));
> +}
> +
> +static inline bool
> +i915_gem_context_can_merge(const struct i915_gem_context *prev,
> +		const struct i915_gem_context *next)
> +{
> +	if (prev != next)
> +		return false;
> +
> +	if (i915_gem_context_single_port_submit(prev))
> +		return false;
> +
> +	return true;
> +}
> +
>  /* i915_gem_context.c */
>  int __must_check i915_gem_context_init(struct drm_i915_private *dev_priv);
>  void i915_gem_context_lost(struct drm_i915_private *dev_priv);
> diff --git a/drivers/gpu/drm/i915/i915_guc_submission.c b/drivers/gpu/drm/i915/i915_guc_submission.c
> index 991e76e..ad90de1 100644
> --- a/drivers/gpu/drm/i915/i915_guc_submission.c
> +++ b/drivers/gpu/drm/i915/i915_guc_submission.c
> @@ -680,10 +680,14 @@ static bool i915_guc_dequeue(struct intel_engine_cs *engine)
>  		struct drm_i915_gem_request *rq =
>  			rb_entry(rb, typeof(*rq), priotree.node);
>  
> -		if (last && rq->ctx != last->ctx) {
> +		if (last && !i915_gem_context_can_merge(last->ctx, rq->ctx)) {
>  			if (port != engine->execlist_port)
>  				break;
>  
> +			if (i915_gem_context_single_port_submit(last->ctx) ||
> +				i915_gem_context_single_port_submit(rq->ctx))
> +				break;
> +
>  			i915_gem_request_assign(&port->request, last);
>  			nested_enable_signaling(last);
>  			port++;
> diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c
> index dd0e9d587..a49801e 100644
> --- a/drivers/gpu/drm/i915/intel_lrc.c
> +++ b/drivers/gpu/drm/i915/intel_lrc.c
> @@ -377,24 +377,6 @@ static void execlists_submit_ports(struct intel_engine_cs *engine)
>  	writel(lower_32_bits(desc[0]), elsp);
>  }
>  
> -static bool ctx_single_port_submission(const struct i915_gem_context *ctx)
> -{
> -	return (IS_ENABLED(CONFIG_DRM_I915_GVT) &&
> -		i915_gem_context_force_single_submission(ctx));
> -}
> -
> -static bool can_merge_ctx(const struct i915_gem_context *prev,
> -			  const struct i915_gem_context *next)
> -{
> -	if (prev != next)
> -		return false;
> -
> -	if (ctx_single_port_submission(prev))
> -		return false;
> -
> -	return true;
> -}
> -
>  static void execlists_dequeue(struct intel_engine_cs *engine)
>  {
>  	struct drm_i915_gem_request *last;
> @@ -462,7 +444,8 @@ static void execlists_dequeue(struct intel_engine_cs *engine)
>  		 * request, and so we never need to tell the hardware about
>  		 * the first.
>  		 */
> -		if (last && !can_merge_ctx(cursor->ctx, last->ctx)) {
> +		if (last &&
> +			!i915_gem_context_can_merge(last->ctx, cursor->ctx)) {
>  			/* If we are on the second port and cannot combine
>  			 * this request with the last, then we are done.
>  			 */
> @@ -475,8 +458,8 @@ static void execlists_dequeue(struct intel_engine_cs *engine)
>  			 * context (even though a different request) to
>  			 * the second port.
>  			 */
> -			if (ctx_single_port_submission(last->ctx) ||
> -			    ctx_single_port_submission(cursor->ctx))
> +			if (i915_gem_context_single_port_submit(last->ctx) ||
> +			    i915_gem_context_single_port_submit(cursor->ctx))

Could you please fix gvt before this mess is propagated. There is no way
it should be caring about a non-gvt context in port[0] or port[1].
-Chris
Chuanxiao.Dong March 28, 2017, 8:39 a.m. UTC | #2
> -----Original Message-----
> From: Chris Wilson [mailto:chris@chris-wilson.co.uk]
> Sent: Tuesday, March 28, 2017 4:22 PM
> To: Dong, Chuanxiao <chuanxiao.dong@intel.com>
> Cc: intel-gfx@lists.freedesktop.org; intel-gvt-dev@lists.freedesktop.org
> Subject: Re: [PATCH 1/2] drm/i915/scheduler: add gvt force-single-
> submission for guc
> 
> On Tue, Mar 28, 2017 at 09:49:51AM +0800, Chuanxiao Dong wrote:
> > GVT needs single submission and cannot allow merge. So when GuC
> > submitting a GVT request, the next one should be submitted to guc
> > later until the previous one is completed. This is following the usage
> > when using execlist mode submission.
> >
> > Cc: chris@chris-wilson.co.uk
> > Signed-off-by: Chuanxiao Dong <chuanxiao.dong@intel.com>
> > ---
> >  drivers/gpu/drm/i915/i915_gem_context.h    | 20 ++++++++++++++++++++
> >  drivers/gpu/drm/i915/i915_guc_submission.c |  6 +++++-
> >  drivers/gpu/drm/i915/intel_lrc.c           | 25 ++++---------------------
> >  3 files changed, 29 insertions(+), 22 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/i915/i915_gem_context.h
> > b/drivers/gpu/drm/i915/i915_gem_context.h
> > index 4af2ab94..025eba2 100644
> > --- a/drivers/gpu/drm/i915/i915_gem_context.h
> > +++ b/drivers/gpu/drm/i915/i915_gem_context.h
> > @@ -246,6 +246,26 @@ static inline bool
> i915_gem_context_is_kernel(struct i915_gem_context *ctx)
> >  	return !ctx->file_priv;
> >  }
> >
> > +static inline bool
> > +i915_gem_context_single_port_submit(const struct i915_gem_context
> > +*ctx) {
> > +	return (IS_ENABLED(CONFIG_DRM_I915_GVT) &&
> > +		i915_gem_context_force_single_submission(ctx));
> > +}
> > +
> > +static inline bool
> > +i915_gem_context_can_merge(const struct i915_gem_context *prev,
> > +		const struct i915_gem_context *next) {
> > +	if (prev != next)
> > +		return false;
> > +
> > +	if (i915_gem_context_single_port_submit(prev))
> > +		return false;
> > +
> > +	return true;
> > +}
> > +
> >  /* i915_gem_context.c */
> >  int __must_check i915_gem_context_init(struct drm_i915_private
> > *dev_priv);  void i915_gem_context_lost(struct drm_i915_private
> > *dev_priv); diff --git a/drivers/gpu/drm/i915/i915_guc_submission.c
> > b/drivers/gpu/drm/i915/i915_guc_submission.c
> > index 991e76e..ad90de1 100644
> > --- a/drivers/gpu/drm/i915/i915_guc_submission.c
> > +++ b/drivers/gpu/drm/i915/i915_guc_submission.c
> > @@ -680,10 +680,14 @@ static bool i915_guc_dequeue(struct
> intel_engine_cs *engine)
> >  		struct drm_i915_gem_request *rq =
> >  			rb_entry(rb, typeof(*rq), priotree.node);
> >
> > -		if (last && rq->ctx != last->ctx) {
> > +		if (last && !i915_gem_context_can_merge(last->ctx, rq->ctx))
> {
> >  			if (port != engine->execlist_port)
> >  				break;
> >
> > +			if (i915_gem_context_single_port_submit(last->ctx)
> ||
> > +				i915_gem_context_single_port_submit(rq-
> >ctx))
> > +				break;
> > +
> >  			i915_gem_request_assign(&port->request, last);
> >  			nested_enable_signaling(last);
> >  			port++;
> > diff --git a/drivers/gpu/drm/i915/intel_lrc.c
> > b/drivers/gpu/drm/i915/intel_lrc.c
> > index dd0e9d587..a49801e 100644
> > --- a/drivers/gpu/drm/i915/intel_lrc.c
> > +++ b/drivers/gpu/drm/i915/intel_lrc.c
> > @@ -377,24 +377,6 @@ static void execlists_submit_ports(struct
> intel_engine_cs *engine)
> >  	writel(lower_32_bits(desc[0]), elsp);  }
> >
> > -static bool ctx_single_port_submission(const struct i915_gem_context
> > *ctx) -{
> > -	return (IS_ENABLED(CONFIG_DRM_I915_GVT) &&
> > -		i915_gem_context_force_single_submission(ctx));
> > -}
> > -
> > -static bool can_merge_ctx(const struct i915_gem_context *prev,
> > -			  const struct i915_gem_context *next)
> > -{
> > -	if (prev != next)
> > -		return false;
> > -
> > -	if (ctx_single_port_submission(prev))
> > -		return false;
> > -
> > -	return true;
> > -}
> > -
> >  static void execlists_dequeue(struct intel_engine_cs *engine)  {
> >  	struct drm_i915_gem_request *last;
> > @@ -462,7 +444,8 @@ static void execlists_dequeue(struct
> intel_engine_cs *engine)
> >  		 * request, and so we never need to tell the hardware about
> >  		 * the first.
> >  		 */
> > -		if (last && !can_merge_ctx(cursor->ctx, last->ctx)) {
> > +		if (last &&
> > +			!i915_gem_context_can_merge(last->ctx, cursor-
> >ctx)) {
> >  			/* If we are on the second port and cannot combine
> >  			 * this request with the last, then we are done.
> >  			 */
> > @@ -475,8 +458,8 @@ static void execlists_dequeue(struct
> intel_engine_cs *engine)
> >  			 * context (even though a different request) to
> >  			 * the second port.
> >  			 */
> > -			if (ctx_single_port_submission(last->ctx) ||
> > -			    ctx_single_port_submission(cursor->ctx))
> > +			if (i915_gem_context_single_port_submit(last->ctx)
> ||
> > +			    i915_gem_context_single_port_submit(cursor-
> >ctx))
> 
> Could you please fix gvt before this mess is propagated. There is no way it
> should be caring about a non-gvt context in port[0] or port[1].

Sure. So the name should use prefix intel_gvt_xxxx, and they should be placed in intel_gvt.h?

> -Chris
> 
> --
> Chris Wilson, Intel Open Source Technology Centre
diff mbox

Patch

diff --git a/drivers/gpu/drm/i915/i915_gem_context.h b/drivers/gpu/drm/i915/i915_gem_context.h
index 4af2ab94..025eba2 100644
--- a/drivers/gpu/drm/i915/i915_gem_context.h
+++ b/drivers/gpu/drm/i915/i915_gem_context.h
@@ -246,6 +246,26 @@  static inline bool i915_gem_context_is_kernel(struct i915_gem_context *ctx)
 	return !ctx->file_priv;
 }
 
+static inline bool
+i915_gem_context_single_port_submit(const struct i915_gem_context *ctx)
+{
+	return (IS_ENABLED(CONFIG_DRM_I915_GVT) &&
+		i915_gem_context_force_single_submission(ctx));
+}
+
+static inline bool
+i915_gem_context_can_merge(const struct i915_gem_context *prev,
+		const struct i915_gem_context *next)
+{
+	if (prev != next)
+		return false;
+
+	if (i915_gem_context_single_port_submit(prev))
+		return false;
+
+	return true;
+}
+
 /* i915_gem_context.c */
 int __must_check i915_gem_context_init(struct drm_i915_private *dev_priv);
 void i915_gem_context_lost(struct drm_i915_private *dev_priv);
diff --git a/drivers/gpu/drm/i915/i915_guc_submission.c b/drivers/gpu/drm/i915/i915_guc_submission.c
index 991e76e..ad90de1 100644
--- a/drivers/gpu/drm/i915/i915_guc_submission.c
+++ b/drivers/gpu/drm/i915/i915_guc_submission.c
@@ -680,10 +680,14 @@  static bool i915_guc_dequeue(struct intel_engine_cs *engine)
 		struct drm_i915_gem_request *rq =
 			rb_entry(rb, typeof(*rq), priotree.node);
 
-		if (last && rq->ctx != last->ctx) {
+		if (last && !i915_gem_context_can_merge(last->ctx, rq->ctx)) {
 			if (port != engine->execlist_port)
 				break;
 
+			if (i915_gem_context_single_port_submit(last->ctx) ||
+				i915_gem_context_single_port_submit(rq->ctx))
+				break;
+
 			i915_gem_request_assign(&port->request, last);
 			nested_enable_signaling(last);
 			port++;
diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c
index dd0e9d587..a49801e 100644
--- a/drivers/gpu/drm/i915/intel_lrc.c
+++ b/drivers/gpu/drm/i915/intel_lrc.c
@@ -377,24 +377,6 @@  static void execlists_submit_ports(struct intel_engine_cs *engine)
 	writel(lower_32_bits(desc[0]), elsp);
 }
 
-static bool ctx_single_port_submission(const struct i915_gem_context *ctx)
-{
-	return (IS_ENABLED(CONFIG_DRM_I915_GVT) &&
-		i915_gem_context_force_single_submission(ctx));
-}
-
-static bool can_merge_ctx(const struct i915_gem_context *prev,
-			  const struct i915_gem_context *next)
-{
-	if (prev != next)
-		return false;
-
-	if (ctx_single_port_submission(prev))
-		return false;
-
-	return true;
-}
-
 static void execlists_dequeue(struct intel_engine_cs *engine)
 {
 	struct drm_i915_gem_request *last;
@@ -462,7 +444,8 @@  static void execlists_dequeue(struct intel_engine_cs *engine)
 		 * request, and so we never need to tell the hardware about
 		 * the first.
 		 */
-		if (last && !can_merge_ctx(cursor->ctx, last->ctx)) {
+		if (last &&
+			!i915_gem_context_can_merge(last->ctx, cursor->ctx)) {
 			/* If we are on the second port and cannot combine
 			 * this request with the last, then we are done.
 			 */
@@ -475,8 +458,8 @@  static void execlists_dequeue(struct intel_engine_cs *engine)
 			 * context (even though a different request) to
 			 * the second port.
 			 */
-			if (ctx_single_port_submission(last->ctx) ||
-			    ctx_single_port_submission(cursor->ctx))
+			if (i915_gem_context_single_port_submit(last->ctx) ||
+			    i915_gem_context_single_port_submit(cursor->ctx))
 				break;
 
 			GEM_BUG_ON(last->ctx == cursor->ctx);