From d0a4f2e292e5b347f7e5ee2cdbe4f077986eb9da Mon Sep 17 00:00:00 2001 From: Francisco Jerez Date: Sun, 31 Oct 2010 02:22:29 +0200 Subject: nouveau: Avoid unnecessary call to CPU_FINI. nouveau_bo_unmap called the CPU_FINI IOCTL even if it was a NOSYNC mapping. It caused no harmful effects (actually CPU_FINI is a no-op on recent enough kernels) besides the precious CPU cycles being wasted. Signed-off-by: Francisco Jerez --- nouveau/nouveau_bo.c | 5 ++++- nouveau/nouveau_private.h | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) (limited to 'nouveau') diff --git a/nouveau/nouveau_bo.c b/nouveau/nouveau_bo.c index c1432b0b..d6bb22de 100644 --- a/nouveau/nouveau_bo.c +++ b/nouveau/nouveau_bo.c @@ -434,6 +434,8 @@ nouveau_bo_map_range(struct nouveau_bo *bo, uint32_t delta, uint32_t size, (flags & NOUVEAU_BO_NOWAIT), 0); if (ret) return ret; + + nvbo->map_refcnt++; } bo->map = (char *)nvbo->map + delta; @@ -458,13 +460,14 @@ nouveau_bo_unmap(struct nouveau_bo *bo) { struct nouveau_bo_priv *nvbo = nouveau_bo(bo); - if (bo->map && !nvbo->sysmem) { + if (bo->map && !nvbo->sysmem && nvbo->map_refcnt) { struct nouveau_device_priv *nvdev = nouveau_device(bo->device); struct drm_nouveau_gem_cpu_fini req; req.handle = nvbo->handle; drmCommandWrite(nvdev->fd, DRM_NOUVEAU_GEM_CPU_FINI, &req, sizeof(req)); + nvbo->map_refcnt--; } bo->map = NULL; diff --git a/nouveau/nouveau_private.h b/nouveau/nouveau_private.h index 4c535345..124fe870 100644 --- a/nouveau/nouveau_private.h +++ b/nouveau/nouveau_private.h @@ -115,6 +115,7 @@ struct nouveau_bo_priv { uint32_t global_handle; drm_handle_t handle; uint64_t map_handle; + int map_refcnt; void *map; /* Last known information from kernel on buffer status */ -- cgit v1.2.3