diff mbox

[v3] drm/i915/execlists: Always clear preempt status on cancelling all

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

Commit Message

Chris Wilson July 16, 2018, 12:54 p.m. UTC
On reset/wedging, we cancel all pending replies from the HW and we also
want to cancel an outstanding preemption event. Since we use the same
function to cancel the pending replies for reset and for a preemption
event, we can simply clear the active tracking for all.

v2: Keep execlists_user_end() markup for wedging
v3: Move assignment to inline to hide the bare assignment.

Fixes: 60a943245413 ("drm/i915/execlists: Drop clear_gtiir() on GPU reset")
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
---
 drivers/gpu/drm/i915/intel_guc_submission.c | 2 --
 drivers/gpu/drm/i915/intel_lrc.c            | 5 ++---
 drivers/gpu/drm/i915/intel_ringbuffer.h     | 6 ++++++
 3 files changed, 8 insertions(+), 5 deletions(-)

Comments

Tvrtko Ursulin July 16, 2018, 12:55 p.m. UTC | #1
On 16/07/2018 13:54, Chris Wilson wrote:
> On reset/wedging, we cancel all pending replies from the HW and we also
> want to cancel an outstanding preemption event. Since we use the same
> function to cancel the pending replies for reset and for a preemption
> event, we can simply clear the active tracking for all.
> 
> v2: Keep execlists_user_end() markup for wedging
> v3: Move assignment to inline to hide the bare assignment.
> 
> Fixes: 60a943245413 ("drm/i915/execlists: Drop clear_gtiir() on GPU reset")
> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
> Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
> ---
>   drivers/gpu/drm/i915/intel_guc_submission.c | 2 --
>   drivers/gpu/drm/i915/intel_lrc.c            | 5 ++---
>   drivers/gpu/drm/i915/intel_ringbuffer.h     | 6 ++++++
>   3 files changed, 8 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/intel_guc_submission.c b/drivers/gpu/drm/i915/intel_guc_submission.c
> index cc444dc5f3ad..94d0674ea3c6 100644
> --- a/drivers/gpu/drm/i915/intel_guc_submission.c
> +++ b/drivers/gpu/drm/i915/intel_guc_submission.c
> @@ -633,8 +633,6 @@ static void complete_preempt_context(struct intel_engine_cs *engine)
>   
>   	wait_for_guc_preempt_report(engine);
>   	intel_write_status_page(engine, I915_GEM_HWS_PREEMPT_INDEX, 0);
> -
> -	execlists_clear_active(execlists, EXECLISTS_ACTIVE_PREEMPT);
>   }
>   
>   /**
> diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c
> index 6fef9d130d55..c0ee14f86754 100644
> --- a/drivers/gpu/drm/i915/intel_lrc.c
> +++ b/drivers/gpu/drm/i915/intel_lrc.c
> @@ -563,8 +563,6 @@ static void complete_preempt_context(struct intel_engine_execlists *execlists)
>   	__unwind_incomplete_requests(container_of(execlists,
>   						  struct intel_engine_cs,
>   						  execlists));
> -
> -	execlists_clear_active(execlists, EXECLISTS_ACTIVE_PREEMPT);
>   }
>   
>   static void execlists_dequeue(struct intel_engine_cs *engine)
> @@ -792,7 +790,7 @@ execlists_cancel_port_requests(struct intel_engine_execlists * const execlists)
>   		port++;
>   	}
>   
> -	execlists_user_end(execlists);
> +	execlists_clear_all_active(execlists);
>   }
>   
>   static void reset_csb_pointers(struct intel_engine_execlists *execlists)
> @@ -843,6 +841,7 @@ static void execlists_cancel_requests(struct intel_engine_cs *engine)
>   
>   	/* Cancel the requests on the HW and clear the ELSP tracker. */
>   	execlists_cancel_port_requests(execlists);
> +	execlists_user_end(execlists);
>   
>   	/* Mark all executing requests as skipped. */
>   	list_for_each_entry(rq, &engine->timeline.requests, link) {
> diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h
> index d1eee08e5f6b..665b59ba1f45 100644
> --- a/drivers/gpu/drm/i915/intel_ringbuffer.h
> +++ b/drivers/gpu/drm/i915/intel_ringbuffer.h
> @@ -683,6 +683,12 @@ execlists_clear_active(struct intel_engine_execlists *execlists,
>   	__clear_bit(bit, (unsigned long *)&execlists->active);
>   }
>   
> +static inline void
> +execlists_clear_all_active(struct intel_engine_execlists *execlists)
> +{
> +	execlists->active = 0;
> +}
> +
>   static inline bool
>   execlists_is_active(const struct intel_engine_execlists *execlists,
>   		    unsigned int bit)
> 

Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>

Regards,

Tvrtko
Chris Wilson July 16, 2018, 12:57 p.m. UTC | #2
Quoting Tvrtko Ursulin (2018-07-16 13:55:55)
> 
> On 16/07/2018 13:54, Chris Wilson wrote:
> > On reset/wedging, we cancel all pending replies from the HW and we also
> > want to cancel an outstanding preemption event. Since we use the same
> > function to cancel the pending replies for reset and for a preemption
> > event, we can simply clear the active tracking for all.
> > 
> > v2: Keep execlists_user_end() markup for wedging
> > v3: Move assignment to inline to hide the bare assignment.
> > 
> > Fixes: 60a943245413 ("drm/i915/execlists: Drop clear_gtiir() on GPU reset")
> > Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
> > Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
> > ---
> >   drivers/gpu/drm/i915/intel_guc_submission.c | 2 --
> >   drivers/gpu/drm/i915/intel_lrc.c            | 5 ++---
> >   drivers/gpu/drm/i915/intel_ringbuffer.h     | 6 ++++++
> >   3 files changed, 8 insertions(+), 5 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/i915/intel_guc_submission.c b/drivers/gpu/drm/i915/intel_guc_submission.c
> > index cc444dc5f3ad..94d0674ea3c6 100644
> > --- a/drivers/gpu/drm/i915/intel_guc_submission.c
> > +++ b/drivers/gpu/drm/i915/intel_guc_submission.c
> > @@ -633,8 +633,6 @@ static void complete_preempt_context(struct intel_engine_cs *engine)
> >   
> >       wait_for_guc_preempt_report(engine);
> >       intel_write_status_page(engine, I915_GEM_HWS_PREEMPT_INDEX, 0);
> > -
> > -     execlists_clear_active(execlists, EXECLISTS_ACTIVE_PREEMPT);
> >   }
> >   
> >   /**
> > diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c
> > index 6fef9d130d55..c0ee14f86754 100644
> > --- a/drivers/gpu/drm/i915/intel_lrc.c
> > +++ b/drivers/gpu/drm/i915/intel_lrc.c
> > @@ -563,8 +563,6 @@ static void complete_preempt_context(struct intel_engine_execlists *execlists)
> >       __unwind_incomplete_requests(container_of(execlists,
> >                                                 struct intel_engine_cs,
> >                                                 execlists));
> > -
> > -     execlists_clear_active(execlists, EXECLISTS_ACTIVE_PREEMPT);
> >   }
> >   
> >   static void execlists_dequeue(struct intel_engine_cs *engine)
> > @@ -792,7 +790,7 @@ execlists_cancel_port_requests(struct intel_engine_execlists * const execlists)
> >               port++;
> >       }
> >   
> > -     execlists_user_end(execlists);
> > +     execlists_clear_all_active(execlists);
> >   }
> >   
> >   static void reset_csb_pointers(struct intel_engine_execlists *execlists)
> > @@ -843,6 +841,7 @@ static void execlists_cancel_requests(struct intel_engine_cs *engine)
> >   
> >       /* Cancel the requests on the HW and clear the ELSP tracker. */
> >       execlists_cancel_port_requests(execlists);
> > +     execlists_user_end(execlists);
> >   
> >       /* Mark all executing requests as skipped. */
> >       list_for_each_entry(rq, &engine->timeline.requests, link) {
> > diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h
> > index d1eee08e5f6b..665b59ba1f45 100644
> > --- a/drivers/gpu/drm/i915/intel_ringbuffer.h
> > +++ b/drivers/gpu/drm/i915/intel_ringbuffer.h
> > @@ -683,6 +683,12 @@ execlists_clear_active(struct intel_engine_execlists *execlists,
> >       __clear_bit(bit, (unsigned long *)&execlists->active);
> >   }
> >   
> > +static inline void
> > +execlists_clear_all_active(struct intel_engine_execlists *execlists)
> > +{
> > +     execlists->active = 0;
> > +}
> > +
> >   static inline bool
> >   execlists_is_active(const struct intel_engine_execlists *execlists,
> >                   unsigned int bit)
> > 
> 
> Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>

There's an alternate minimalistic v4, so take your pick.
-Chris
diff mbox

Patch

diff --git a/drivers/gpu/drm/i915/intel_guc_submission.c b/drivers/gpu/drm/i915/intel_guc_submission.c
index cc444dc5f3ad..94d0674ea3c6 100644
--- a/drivers/gpu/drm/i915/intel_guc_submission.c
+++ b/drivers/gpu/drm/i915/intel_guc_submission.c
@@ -633,8 +633,6 @@  static void complete_preempt_context(struct intel_engine_cs *engine)
 
 	wait_for_guc_preempt_report(engine);
 	intel_write_status_page(engine, I915_GEM_HWS_PREEMPT_INDEX, 0);
-
-	execlists_clear_active(execlists, EXECLISTS_ACTIVE_PREEMPT);
 }
 
 /**
diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c
index 6fef9d130d55..c0ee14f86754 100644
--- a/drivers/gpu/drm/i915/intel_lrc.c
+++ b/drivers/gpu/drm/i915/intel_lrc.c
@@ -563,8 +563,6 @@  static void complete_preempt_context(struct intel_engine_execlists *execlists)
 	__unwind_incomplete_requests(container_of(execlists,
 						  struct intel_engine_cs,
 						  execlists));
-
-	execlists_clear_active(execlists, EXECLISTS_ACTIVE_PREEMPT);
 }
 
 static void execlists_dequeue(struct intel_engine_cs *engine)
@@ -792,7 +790,7 @@  execlists_cancel_port_requests(struct intel_engine_execlists * const execlists)
 		port++;
 	}
 
-	execlists_user_end(execlists);
+	execlists_clear_all_active(execlists);
 }
 
 static void reset_csb_pointers(struct intel_engine_execlists *execlists)
@@ -843,6 +841,7 @@  static void execlists_cancel_requests(struct intel_engine_cs *engine)
 
 	/* Cancel the requests on the HW and clear the ELSP tracker. */
 	execlists_cancel_port_requests(execlists);
+	execlists_user_end(execlists);
 
 	/* Mark all executing requests as skipped. */
 	list_for_each_entry(rq, &engine->timeline.requests, link) {
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h
index d1eee08e5f6b..665b59ba1f45 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.h
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.h
@@ -683,6 +683,12 @@  execlists_clear_active(struct intel_engine_execlists *execlists,
 	__clear_bit(bit, (unsigned long *)&execlists->active);
 }
 
+static inline void
+execlists_clear_all_active(struct intel_engine_execlists *execlists)
+{
+	execlists->active = 0;
+}
+
 static inline bool
 execlists_is_active(const struct intel_engine_execlists *execlists,
 		    unsigned int bit)