xf86-video-intel: src/sna/kgem.c src/sna/kgem.h

Chris Wilson ickle at kemper.freedesktop.org
Mon Oct 21 08:35:45 PDT 2013


 src/sna/kgem.c |   56 ++++++++++++++++++++++++++------------------------------
 src/sna/kgem.h |   11 -----------
 2 files changed, 26 insertions(+), 41 deletions(-)

New commits:
commit 8c562bac64d2ce80667c686a732d0f9cda6277ca
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Oct 21 15:31:44 2013 +0100

    sna: Tweak opportunistic flushing to reduce power consumption
    
    When trying to conserve power, reduce the number of small batches we
    emit - trying to maximise GPU efficacy and minimise CPU overhead.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 9eb0fa5..f959875 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -4647,6 +4647,20 @@ static bool aperture_check(struct kgem *kgem, unsigned num_pages)
 	return false;
 }
 
+static inline bool kgem_flush(struct kgem *kgem, bool flush)
+{
+	if (kgem->nreloc == 0)
+		return false;
+
+	if (container_of(kgem, struct sna, kgem)->flags & SNA_POWERSAVE)
+		return false;
+
+	if (kgem->flush == flush && kgem->aperture < kgem->aperture_low)
+		return false;
+
+	return kgem_ring_is_idle(kgem, kgem->ring);
+}
+
 bool kgem_check_bo(struct kgem *kgem, ...)
 {
 	va_list ap;
@@ -4680,14 +4694,14 @@ bool kgem_check_bo(struct kgem *kgem, ...)
 	if (!num_pages)
 		return true;
 
-	if (kgem_flush(kgem, flush)) {
-		DBG(("%s: opportunistic flushing\n", __FUNCTION__));
+	if (kgem->nexec + num_exec >= KGEM_EXEC_SIZE(kgem)) {
+		DBG(("%s: out of exec slots (%d + %d / %d)\n", __FUNCTION__,
+		     kgem->nexec, num_exec, KGEM_EXEC_SIZE(kgem)));
 		return false;
 	}
 
-	if (kgem->aperture > kgem->aperture_low &&
-	    kgem_ring_is_idle(kgem, kgem->ring)) {
-		DBG(("%s: current aperture usage (%d) is greater than low water mark (%d)\n",
+	if (kgem_flush(kgem, flush)) {
+		DBG(("%s: opportunistic flushing, aperture %d/%d\n",
 		     __FUNCTION__, kgem->aperture, kgem->aperture_low));
 		return false;
 	}
@@ -4698,12 +4712,6 @@ bool kgem_check_bo(struct kgem *kgem, ...)
 		return aperture_check(kgem, num_pages);
 	}
 
-	if (kgem->nexec + num_exec >= KGEM_EXEC_SIZE(kgem)) {
-		DBG(("%s: out of exec slots (%d + %d / %d)\n", __FUNCTION__,
-		     kgem->nexec, num_exec, KGEM_EXEC_SIZE(kgem)));
-		return false;
-	}
-
 	return true;
 }
 
@@ -4736,22 +4744,16 @@ bool kgem_check_bo_fenced(struct kgem *kgem, struct kgem_bo *bo)
 		return true;
 	}
 
+	if (kgem->nexec >= KGEM_EXEC_SIZE(kgem) - 1)
+		return false;
+
 	if (needs_semaphore(kgem, bo)) {
 		DBG(("%s: flushing for required semaphore\n", __FUNCTION__));
 		return false;
 	}
 
 	if (kgem_flush(kgem, bo->flush)) {
-		DBG(("%s: opportunistic flushing\n", __FUNCTION__));
-		return false;
-	}
-
-	if (kgem->nexec >= KGEM_EXEC_SIZE(kgem) - 1)
-		return false;
-
-	if (kgem->aperture > kgem->aperture_low &&
-	    kgem_ring_is_idle(kgem, kgem->ring)) {
-		DBG(("%s: current aperture usage (%d) is greater than low water mark (%d)\n",
+		DBG(("%s: opportunistic flushing, aperture %d/%d\n",
 		     __FUNCTION__, kgem->aperture, kgem->aperture_low));
 		return false;
 	}
@@ -4838,14 +4840,11 @@ bool kgem_check_many_bo_fenced(struct kgem *kgem, ...)
 	}
 
 	if (num_pages) {
-		if (kgem_flush(kgem, flush)) {
-			DBG(("%s: opportunistic flushing\n", __FUNCTION__));
+		if (kgem->nexec + num_exec >= KGEM_EXEC_SIZE(kgem))
 			return false;
-		}
 
-		if (kgem->aperture > kgem->aperture_low &&
-		    kgem_ring_is_idle(kgem, kgem->ring)) {
-			DBG(("%s: current aperture usage (%d) is greater than low water mark (%d)\n",
+		if (kgem_flush(kgem, flush)) {
+			DBG(("%s: opportunistic flushing, aperture %d/%d\n",
 			     __FUNCTION__, kgem->aperture, kgem->aperture_low));
 			return false;
 		}
@@ -4855,9 +4854,6 @@ bool kgem_check_many_bo_fenced(struct kgem *kgem, ...)
 			     __FUNCTION__, num_pages + kgem->aperture, kgem->aperture_high));
 			return aperture_check(kgem, num_pages);
 		}
-
-		if (kgem->nexec + num_exec >= KGEM_EXEC_SIZE(kgem))
-			return false;
 	}
 
 	return true;
diff --git a/src/sna/kgem.h b/src/sna/kgem.h
index b1ac8d7..8ccda55 100644
--- a/src/sna/kgem.h
+++ b/src/sna/kgem.h
@@ -335,14 +335,6 @@ static inline void kgem_submit(struct kgem *kgem)
 		_kgem_submit(kgem);
 }
 
-static inline bool kgem_flush(struct kgem *kgem, bool flush)
-{
-	if (kgem->nreloc == 0)
-		return false;
-
-	return (kgem->flush ^ flush) && kgem_ring_is_idle(kgem, kgem->ring);
-}
-
 static inline void kgem_bo_submit(struct kgem *kgem, struct kgem_bo *bo)
 {
 	if (bo->exec)
@@ -634,9 +626,6 @@ static inline bool __kgem_bo_is_busy(struct kgem *kgem, struct kgem_bo *bo)
 	if (bo->exec)
 		return true;
 
-	if (kgem_flush(kgem, bo->flush))
-		kgem_submit(kgem);
-
 	if (bo->rq && !__kgem_busy(kgem, bo->handle))
 		__kgem_bo_clear_busy(bo);
 


More information about the xorg-commit mailing list