diff options
author | Francisco Jerez <currojerez@riseup.net> | 2010-10-31 02:22:29 +0200 |
---|---|---|
committer | Francisco Jerez <currojerez@riseup.net> | 2010-10-31 02:09:59 +0100 |
commit | d0a4f2e292e5b347f7e5ee2cdbe4f077986eb9da (patch) | |
tree | b8da3cc292c2293d1fdab0b3c14de0f4b9f82232 /nouveau | |
parent | 362457715faacd3101929e5f0d8ae250d0ad09df (diff) |
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 <currojerez@riseup.net>
Diffstat (limited to 'nouveau')
-rw-r--r-- | nouveau/nouveau_bo.c | 5 | ||||
-rw-r--r-- | nouveau/nouveau_private.h | 1 |
2 files changed, 5 insertions, 1 deletions
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 */ |