diff options
| author | Chris Wilson <chris@chris-wilson.co.uk> | 2011-11-02 22:53:51 +0000 |
|---|---|---|
| committer | Chris Wilson <chris@chris-wilson.co.uk> | 2011-11-03 12:56:07 +0000 |
| commit | 353fa4218cd904857fe95ef140e7f38aefe07578 (patch) | |
| tree | 4853903060ec116f2800d433a24ceb081049a82d | |
| parent | 6fdd0f254d2e58d425d6d23023e9db3d2924c6be (diff) | |
sna: Don't call into retire unless there are outstanding requests
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
| -rw-r--r-- | src/sna/kgem.c | 4 | ||||
| -rw-r--r-- | src/sna/kgem.h | 1 | ||||
| -rw-r--r-- | src/sna/sna_accel.c | 4 |
3 files changed, 7 insertions, 2 deletions
diff --git a/src/sna/kgem.c b/src/sna/kgem.c index e470e4d7..37e60357 100644 --- a/src/sna/kgem.c +++ b/src/sna/kgem.c @@ -671,7 +671,8 @@ bool kgem_retire(struct kgem *kgem) free(rq); } - if (kgem->ring && list_is_empty(&kgem->requests)) + kgem->need_retire = !list_is_empty(&kgem->requests); + if (!kgem->need_retire && kgem->ring) kgem->ring = kgem->mode; return retired; @@ -712,6 +713,7 @@ destroy: list_add_tail(&rq->list, &kgem->requests); kgem->next_request = __kgem_request_alloc(); + kgem->need_retire = 1; } static void kgem_close_list(struct kgem *kgem, struct list *head) diff --git a/src/sna/kgem.h b/src/sna/kgem.h index 26eb7845..4b260e21 100644 --- a/src/sna/kgem.h +++ b/src/sna/kgem.h @@ -107,6 +107,7 @@ struct kgem { uint32_t flush:1; uint32_t need_expire:1; uint32_t need_purge:1; + uint32_t need_retire:1; uint32_t busy:1; uint32_t has_vmap :1; diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c index 529bb23c..6bb6cef9 100644 --- a/src/sna/sna_accel.c +++ b/src/sna/sna_accel.c @@ -7772,7 +7772,9 @@ void sna_accel_block_handler(struct sna *sna) void sna_accel_wakeup_handler(struct sna *sna) { - kgem_retire(&sna->kgem); + if (sna->kgem.need_retire) + kgem_retire(&sna->kgem); + sna_deferred_free(sna); if (sna->kgem.need_purge) |
