diff options
-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 */ |