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

Chris Wilson ickle at kemper.freedesktop.org
Thu Jan 22 13:04:05 PST 2015


 src/sna/kgem.c |    9 +++++++++
 src/sna/kgem.h |   14 +++++++-------
 2 files changed, 16 insertions(+), 7 deletions(-)

New commits:
commit 3cb0672586a55effa89a59c9a97744e225a05dac
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu Jan 22 21:02:42 2015 +0000

    sna: Reorganise assertions when retiring idle bo
    
    References: https://bugs.freedesktop.org/show_bug.cgi?id=70461#c83
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index cb838ac..c9c651e 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -2680,6 +2680,7 @@ static bool __kgem_retire_rq(struct kgem *kgem, struct kgem_request *rq)
 		if (bo->needs_flush) {
 			DBG(("%s: moving %d to flushing\n",
 			     __FUNCTION__, bo->handle));
+			assert(bo != rq->bo);
 			list_add(&bo->request, &kgem->flushing);
 			bo->rq = MAKE_REQUEST(kgem, RQ_RING(bo->rq));
 			kgem->need_retire = true;
@@ -2845,6 +2846,9 @@ void __kgem_retire_requests_upto(struct kgem *kgem, struct kgem_bo *bo)
 	struct kgem_request *rq = bo->rq, *tmp;
 	struct list *requests = &kgem->requests[RQ_RING(rq) == I915_EXEC_BLT];
 
+	DBG(("%s(handle=%d)\n", __FUNCTION__, bo->handle));
+	assert(!__kgem_busy(kgem, bo->handle));
+
 	rq = RQ(rq);
 	assert(rq != &kgem->static_request);
 	if (rq == (struct kgem_request *)kgem) {
@@ -2857,6 +2861,11 @@ void __kgem_retire_requests_upto(struct kgem *kgem, struct kgem_bo *bo)
 		assert(tmp->ring == rq->ring);
 		__kgem_retire_rq(kgem, tmp);
 	} while (tmp != rq);
+
+	assert(bo->rq == NULL);
+	assert(list_is_empty(&bo->request));
+	assert(!bo->needs_flush);
+	assert(bo->domain == DOMAIN_NONE);
 }
 
 #if 0
diff --git a/src/sna/kgem.h b/src/sna/kgem.h
index 59cb724..ae53e67 100644
--- a/src/sna/kgem.h
+++ b/src/sna/kgem.h
@@ -637,14 +637,14 @@ static inline bool __kgem_bo_is_busy(struct kgem *kgem, struct kgem_bo *bo)
 	if (bo->exec)
 		return true;
 
-	if (bo->rq && !__kgem_busy(kgem, bo->handle)) {
-		__kgem_retire_requests_upto(kgem, bo);
-		assert(list_is_empty(&bo->request));
-		assert(bo->rq == NULL);
-		assert(bo->domain == DOMAIN_NONE);
-	}
+	if (bo->rq == NULL)
+		return false;
+
+	if (__kgem_busy(kgem, bo->handle))
+		return true;
 
-	return kgem_bo_is_busy(bo);
+	__kgem_retire_requests_upto(kgem, bo);
+	return false;
 }
 
 static inline bool kgem_bo_is_render(struct kgem_bo *bo)


More information about the xorg-commit mailing list