summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2011-11-02 22:53:51 +0000
committerChris Wilson <chris@chris-wilson.co.uk>2011-11-03 12:56:07 +0000
commit353fa4218cd904857fe95ef140e7f38aefe07578 (patch)
tree4853903060ec116f2800d433a24ceb081049a82d
parent6fdd0f254d2e58d425d6d23023e9db3d2924c6be (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.c4
-rw-r--r--src/sna/kgem.h1
-rw-r--r--src/sna/sna_accel.c4
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)