diff --git a/src/sna/kgem.c b/src/sna/kgem.c index f5cdc6c2..eb2a3d9a 100644 --- a/src/sna/kgem.c +++ b/src/sna/kgem.c @@ -2704,13 +2704,17 @@ bool __kgem_ring_is_idle(struct kgem *kgem, int ring) return true; } -void __kgem_retire_requests_upto(struct kgem *kgem, struct kgem_request *rq) +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]; - struct kgem_request *tmp; rq = RQ(rq); assert(rq != &kgem->static_request); + if (rq == (struct kgem_request *)kgem) { + __kgem_bo_clear_busy(bo); + return; + } do { tmp = list_first_entry(requests, struct kgem_request, list); diff --git a/src/sna/kgem.h b/src/sna/kgem.h index c77866f4..7ac81cba 100644 --- a/src/sna/kgem.h +++ b/src/sna/kgem.h @@ -618,7 +618,7 @@ static inline bool kgem_bo_is_busy(struct kgem_bo *bo) return bo->rq; } -void __kgem_retire_requests_upto(struct kgem *kgem, struct kgem_request *rq); +void __kgem_retire_requests_upto(struct kgem *kgem, struct kgem_bo *bo); static inline bool __kgem_bo_is_busy(struct kgem *kgem, struct kgem_bo *bo) { DBG(("%s: handle=%d, domain: %d exec? %d, rq? %d\n", __FUNCTION__, @@ -629,7 +629,7 @@ static inline bool __kgem_bo_is_busy(struct kgem *kgem, struct kgem_bo *bo) return true; if (bo->rq && !__kgem_busy(kgem, bo->handle)) { - __kgem_retire_requests_upto(kgem, bo->rq); + __kgem_retire_requests_upto(kgem, bo); assert(list_is_empty(&bo->request)); assert(bo->rq == NULL); assert(bo->domain == DOMAIN_NONE);