diff mbox

[2/2] drm/ttm: track kmap io_reserve(), only unreserve on unmap where needed

Message ID 1288829027-23239-2-git-send-email-skeggsb@gmail.com (mailing list archive)
State New, archived
Headers show

Commit Message

Ben Skeggs Nov. 4, 2010, 12:03 a.m. UTC
None
diff mbox

Patch

diff --git a/drivers/gpu/drm/ttm/ttm_bo_util.c b/drivers/gpu/drm/ttm/ttm_bo_util.c
index ff358ad..e9dbe8b 100644
--- a/drivers/gpu/drm/ttm/ttm_bo_util.c
+++ b/drivers/gpu/drm/ttm/ttm_bo_util.c
@@ -467,9 +467,12 @@  int ttm_bo_kmap(struct ttm_buffer_object *bo,
 	if (num_pages > 1 && !DRM_SUSER(DRM_CURPROC))
 		return -EPERM;
 #endif
-	ret = ttm_mem_io_reserve(bo->bdev, &bo->mem);
-	if (ret)
-		return ret;
+	if (!bo->mem.bus.io_reserved) {
+		ret = ttm_mem_io_reserve(bo->bdev, &bo->mem);
+		if (ret)
+			return ret;
+		map->io_reserved = true;
+	}
 	if (!bo->mem.bus.is_iomem) {
 		return ttm_bo_kmap_ttm(bo, start_page, num_pages, map);
 	} else {
@@ -487,7 +490,10 @@  void ttm_bo_kunmap(struct ttm_bo_kmap_obj *map)
 	switch (map->bo_kmap_type) {
 	case ttm_bo_map_iomap:
 		iounmap(map->virtual);
-		ttm_mem_io_free(map->bo->bdev, &map->bo->mem);
+		if (map->io_reserved) {
+			ttm_mem_io_free(map->bo->bdev, &map->bo->mem);
+			map->io_reserved = false;
+		}
 		break;
 	case ttm_bo_map_vmap:
 		vunmap(map->virtual);
diff --git a/include/drm/ttm/ttm_bo_api.h b/include/drm/ttm/ttm_bo_api.h
index 5afa5b5..ce998ac 100644
--- a/include/drm/ttm/ttm_bo_api.h
+++ b/include/drm/ttm/ttm_bo_api.h
@@ -300,6 +300,7 @@  struct ttm_bo_kmap_obj {
 		ttm_bo_map_premapped    = 4 | TTM_BO_MAP_IOMEM_MASK,
 	} bo_kmap_type;
 	struct ttm_buffer_object *bo;
+	bool io_reserved;
 };
 
 /**