From 353fa4218cd904857fe95ef140e7f38aefe07578 Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Wed, 2 Nov 2011 22:53:51 +0000 Subject: [PATCH] sna: Don't call into retire unless there are outstanding requests Signed-off-by: Chris Wilson --- src/sna/kgem.c | 4 +++- src/sna/kgem.h | 1 + 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)