sna: Cleanup up the cache upon close

To help with leak-chasing under valgrind.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
Chris Wilson 2011-08-29 15:14:41 +01:00
parent 0ac4b974b9
commit 4f2fc00944
3 changed files with 42 additions and 0 deletions

View File

@ -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)
{

View File

@ -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);

View File

@ -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)