From 4f2fc00944272243af343a8b99f6eb8e0dfda006 Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Mon, 29 Aug 2011 15:14:41 +0100 Subject: [PATCH] sna: Cleanup up the cache upon close To help with leak-chasing under valgrind. Signed-off-by: Chris Wilson --- src/sna/kgem.c | 39 +++++++++++++++++++++++++++++++++++++++ src/sna/kgem.h | 1 + src/sna/sna_accel.c | 2 ++ 3 files changed, 42 insertions(+) diff --git a/src/sna/kgem.c b/src/sna/kgem.c index 061ca744..dcc35693 100644 --- a/src/sna/kgem.c +++ b/src/sna/kgem.c @@ -1064,6 +1064,45 @@ bool kgem_expire_cache(struct kgem *kgem) (void)size; } +void kgem_cleanup_cache(struct kgem *kgem) +{ + struct kgem_bo *bo; + int i; + + /* sync to the most recent request */ + if (!list_is_empty(&kgem->requests)) { + struct kgem_request *rq; + struct drm_i915_gem_set_domain set_domain; + + rq = list_first_entry(&kgem->requests, + struct kgem_request, + list); + + set_domain.handle = rq->bo->handle; + set_domain.read_domains = I915_GEM_DOMAIN_GTT; + set_domain.write_domain = I915_GEM_DOMAIN_GTT; + drmIoctl(kgem->fd, DRM_IOCTL_I915_GEM_SET_DOMAIN, &set_domain); + } + + kgem_retire(kgem); + kgem_cleanup(kgem); + kgem_expire_partial(kgem); + + for (i = 0; i < ARRAY_SIZE(kgem->inactive); i++) { + while (!list_is_empty(&kgem->inactive[i])) { + bo = list_last_entry(&kgem->inactive[i], + struct kgem_bo, list); + + gem_close(kgem->fd, bo->handle); + list_del(&bo->list); + free(bo); + } + } + + kgem->need_purge = false; + kgem->need_expire = false; +} + static struct kgem_bo * search_linear_cache(struct kgem *kgem, int size, bool active) { diff --git a/src/sna/kgem.h b/src/sna/kgem.h index 9da47405..6f5035e5 100644 --- a/src/sna/kgem.h +++ b/src/sna/kgem.h @@ -327,6 +327,7 @@ void kgem_buffer_sync(struct kgem *kgem, struct kgem_bo *bo); void kgem_throttle(struct kgem *kgem); bool kgem_expire_cache(struct kgem *kgem); +void kgem_cleanup_cache(struct kgem *kgem); #if HAS_EXTRA_DEBUG void __kgem_batch_debug(struct kgem *kgem, uint32_t nbatch); diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c index 8a7cec2a..7edff77d 100644 --- a/src/sna/sna_accel.c +++ b/src/sna/sna_accel.c @@ -3400,6 +3400,8 @@ void sna_accel_close(struct sna *sna) sna_gradients_close(sna); DeleteCallback(&FlushCallback, sna_accel_flush_callback, sna); + + kgem_cleanup_cache(&sna->kgem); } static void sna_accel_throttle(struct sna *sna)