diff mbox series

[1/5] drm/i915/execlists: Skip redundant resubmission

Message ID 20191003210100.22250-1-chris@chris-wilson.co.uk (mailing list archive)
State New, archived
Headers show
Series [1/5] drm/i915/execlists: Skip redundant resubmission | expand

Commit Message

Chris Wilson Oct. 3, 2019, 9 p.m. UTC
If we unwind the active requests, and on resubmission discover that we
intend to preempt the active context with itself, simply skip the ELSP
submission.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
---
 drivers/gpu/drm/i915/gt/intel_lrc.c | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)

Comments

Tvrtko Ursulin Oct. 4, 2019, 10:08 a.m. UTC | #1
On 03/10/2019 22:00, Chris Wilson wrote:
> If we unwind the active requests, and on resubmission discover that we
> intend to preempt the active context with itself, simply skip the ELSP
> submission.
> 
> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
> ---
>   drivers/gpu/drm/i915/gt/intel_lrc.c | 17 ++++++++++++++++-
>   1 file changed, 16 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/i915/gt/intel_lrc.c b/drivers/gpu/drm/i915/gt/intel_lrc.c
> index 431d3b8c3371..3cfea1758fd2 100644
> --- a/drivers/gpu/drm/i915/gt/intel_lrc.c
> +++ b/drivers/gpu/drm/i915/gt/intel_lrc.c
> @@ -1739,11 +1739,26 @@ static void execlists_dequeue(struct intel_engine_cs *engine)
>   
>   	if (submit) {
>   		*port = execlists_schedule_in(last, port - execlists->pending);
> -		memset(port + 1, 0, (last_port - port) * sizeof(*port));
>   		execlists->switch_priority_hint =
>   			switch_prio(engine, *execlists->pending);
> +
> +		/*
> +		 * Skip if we ended up with exactly the same set of requests,
> +		 * e.g. trying to timeslice a pair of ordered contexts
> +		 */
> +		if (!memcmp(execlists->active, execlists->pending,
> +			    (port - execlists->pending + 1) * sizeof(*port))) {
> +			do
> +				execlists_schedule_out(fetch_and_zero(port));
> +			while (port-- != execlists->pending);
> +
> +			goto skip_submit;
> +		}
> +
> +		memset(port + 1, 0, (last_port - port) * sizeof(*port));
>   		execlists_submit_ports(engine);
>   	} else {
> +skip_submit:
>   		ring_set_paused(engine, 0);
>   	}
>   }
> 

A little bit of tracepoint noise with in/out but looks correct after I 
read the new code. And I wonder if trace.pl still works after last 
couple months of refactors.. :)

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

Regards,

Tvrtko
diff mbox series

Patch

diff --git a/drivers/gpu/drm/i915/gt/intel_lrc.c b/drivers/gpu/drm/i915/gt/intel_lrc.c
index 431d3b8c3371..3cfea1758fd2 100644
--- a/drivers/gpu/drm/i915/gt/intel_lrc.c
+++ b/drivers/gpu/drm/i915/gt/intel_lrc.c
@@ -1739,11 +1739,26 @@  static void execlists_dequeue(struct intel_engine_cs *engine)
 
 	if (submit) {
 		*port = execlists_schedule_in(last, port - execlists->pending);
-		memset(port + 1, 0, (last_port - port) * sizeof(*port));
 		execlists->switch_priority_hint =
 			switch_prio(engine, *execlists->pending);
+
+		/*
+		 * Skip if we ended up with exactly the same set of requests,
+		 * e.g. trying to timeslice a pair of ordered contexts
+		 */
+		if (!memcmp(execlists->active, execlists->pending,
+			    (port - execlists->pending + 1) * sizeof(*port))) {
+			do
+				execlists_schedule_out(fetch_and_zero(port));
+			while (port-- != execlists->pending);
+
+			goto skip_submit;
+		}
+
+		memset(port + 1, 0, (last_port - port) * sizeof(*port));
 		execlists_submit_ports(engine);
 	} else {
+skip_submit:
 		ring_set_paused(engine, 0);
 	}
 }