All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/5] drm/ttm: use a static ttm_mem_global instance
@ 2018-10-19 16:41 Christian König
       [not found] ` <20181019164138.32993-1-christian.koenig-5C7GfCeVMHo@public.gmane.org>
  2018-10-22  6:47 ` Zhang, Jerry(Junwei)
  0 siblings, 2 replies; 12+ messages in thread
From: Christian König @ 2018-10-19 16:41 UTC (permalink / raw)
  To: dri-devel, tzimmermann, amd-gfx

As the name says we only need one global instance of ttm_mem_global.

Drop all the driver initialization and just use a single exported
instance which is initialized during BO global initialization.

Signed-off-by: Christian König <christian.koenig@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c         | 44 -------------------------
 drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h         |  1 -
 drivers/gpu/drm/ast/ast_drv.h                   |  1 -
 drivers/gpu/drm/ast/ast_ttm.c                   | 32 ++----------------
 drivers/gpu/drm/bochs/bochs.h                   |  1 -
 drivers/gpu/drm/bochs/bochs_mm.c                | 30 ++---------------
 drivers/gpu/drm/cirrus/cirrus_drv.h             |  1 -
 drivers/gpu/drm/cirrus/cirrus_ttm.c             | 32 ++----------------
 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h |  1 -
 drivers/gpu/drm/hisilicon/hibmc/hibmc_ttm.c     | 31 +++--------------
 drivers/gpu/drm/mgag200/mgag200_drv.h           |  1 -
 drivers/gpu/drm/mgag200/mgag200_ttm.c           | 32 ++----------------
 drivers/gpu/drm/nouveau/nouveau_drv.h           |  1 -
 drivers/gpu/drm/nouveau/nouveau_ttm.c           | 34 ++-----------------
 drivers/gpu/drm/qxl/qxl_drv.h                   |  1 -
 drivers/gpu/drm/qxl/qxl_ttm.c                   | 28 ----------------
 drivers/gpu/drm/radeon/radeon.h                 |  1 -
 drivers/gpu/drm/radeon/radeon_ttm.c             | 26 ---------------
 drivers/gpu/drm/ttm/ttm_bo.c                    | 10 ++++--
 drivers/gpu/drm/ttm/ttm_memory.c                |  5 +--
 drivers/gpu/drm/virtio/virtgpu_drv.h            |  1 -
 drivers/gpu/drm/virtio/virtgpu_ttm.c            | 27 ---------------
 drivers/gpu/drm/vmwgfx/vmwgfx_drv.c             |  4 +--
 drivers/gpu/drm/vmwgfx/vmwgfx_drv.h             |  3 +-
 drivers/gpu/drm/vmwgfx/vmwgfx_ttm_glue.c        | 27 ---------------
 drivers/staging/vboxvideo/vbox_drv.h            |  1 -
 drivers/staging/vboxvideo/vbox_ttm.c            | 24 --------------
 include/drm/ttm/ttm_bo_driver.h                 |  8 ++---
 include/drm/ttm/ttm_memory.h                    |  4 +--
 29 files changed, 32 insertions(+), 380 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
index 3a6802846698..fda252022b15 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
@@ -65,33 +65,6 @@ static void amdgpu_ttm_debugfs_fini(struct amdgpu_device *adev);
  * Global memory.
  */
 
-/**
- * amdgpu_ttm_mem_global_init - Initialize and acquire reference to
- * memory object
- *
- * @ref: Object for initialization.
- *
- * This is called by drm_global_item_ref() when an object is being
- * initialized.
- */
-static int amdgpu_ttm_mem_global_init(struct drm_global_reference *ref)
-{
-	return ttm_mem_global_init(ref->object);
-}
-
-/**
- * amdgpu_ttm_mem_global_release - Drop reference to a memory object
- *
- * @ref: Object being removed
- *
- * This is called by drm_global_item_unref() when an object is being
- * released.
- */
-static void amdgpu_ttm_mem_global_release(struct drm_global_reference *ref)
-{
-	ttm_mem_global_release(ref->object);
-}
-
 /**
  * amdgpu_ttm_global_init - Initialize global TTM memory reference structures.
  *
@@ -108,20 +81,6 @@ static int amdgpu_ttm_global_init(struct amdgpu_device *adev)
 	/* ensure reference is false in case init fails */
 	adev->mman.mem_global_referenced = false;
 
-	global_ref = &adev->mman.mem_global_ref;
-	global_ref->global_type = DRM_GLOBAL_TTM_MEM;
-	global_ref->size = sizeof(struct ttm_mem_global);
-	global_ref->init = &amdgpu_ttm_mem_global_init;
-	global_ref->release = &amdgpu_ttm_mem_global_release;
-	r = drm_global_item_ref(global_ref);
-	if (r) {
-		DRM_ERROR("Failed setting up TTM memory accounting "
-			  "subsystem.\n");
-		goto error_mem;
-	}
-
-	adev->mman.bo_global_ref.mem_glob =
-		adev->mman.mem_global_ref.object;
 	global_ref = &adev->mman.bo_global_ref.ref;
 	global_ref->global_type = DRM_GLOBAL_TTM_BO;
 	global_ref->size = sizeof(struct ttm_bo_global);
@@ -140,8 +99,6 @@ static int amdgpu_ttm_global_init(struct amdgpu_device *adev)
 	return 0;
 
 error_bo:
-	drm_global_item_unref(&adev->mman.mem_global_ref);
-error_mem:
 	return r;
 }
 
@@ -150,7 +107,6 @@ static void amdgpu_ttm_global_fini(struct amdgpu_device *adev)
 	if (adev->mman.mem_global_referenced) {
 		mutex_destroy(&adev->mman.gtt_window_lock);
 		drm_global_item_unref(&adev->mman.bo_global_ref.ref);
-		drm_global_item_unref(&adev->mman.mem_global_ref);
 		adev->mman.mem_global_referenced = false;
 	}
 }
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
index fe8f276e9811..e114f209b701 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
@@ -40,7 +40,6 @@
 
 struct amdgpu_mman {
 	struct ttm_bo_global_ref        bo_global_ref;
-	struct drm_global_reference	mem_global_ref;
 	struct ttm_bo_device		bdev;
 	bool				mem_global_referenced;
 	bool				initialized;
diff --git a/drivers/gpu/drm/ast/ast_drv.h b/drivers/gpu/drm/ast/ast_drv.h
index e6c4cd3dc50e..6ae11a477643 100644
--- a/drivers/gpu/drm/ast/ast_drv.h
+++ b/drivers/gpu/drm/ast/ast_drv.h
@@ -104,7 +104,6 @@ struct ast_private {
 	int fb_mtrr;
 
 	struct {
-		struct drm_global_reference mem_global_ref;
 		struct ttm_bo_global_ref bo_global_ref;
 		struct ttm_bo_device bdev;
 	} ttm;
diff --git a/drivers/gpu/drm/ast/ast_ttm.c b/drivers/gpu/drm/ast/ast_ttm.c
index d21fbd26785a..8a59d6fc1160 100644
--- a/drivers/gpu/drm/ast/ast_ttm.c
+++ b/drivers/gpu/drm/ast/ast_ttm.c
@@ -36,37 +36,11 @@ ast_bdev(struct ttm_bo_device *bd)
 	return container_of(bd, struct ast_private, ttm.bdev);
 }
 
-static int
-ast_ttm_mem_global_init(struct drm_global_reference *ref)
-{
-	return ttm_mem_global_init(ref->object);
-}
-
-static void
-ast_ttm_mem_global_release(struct drm_global_reference *ref)
-{
-	ttm_mem_global_release(ref->object);
-}
-
 static int ast_ttm_global_init(struct ast_private *ast)
 {
 	struct drm_global_reference *global_ref;
 	int r;
 
-	global_ref = &ast->ttm.mem_global_ref;
-	global_ref->global_type = DRM_GLOBAL_TTM_MEM;
-	global_ref->size = sizeof(struct ttm_mem_global);
-	global_ref->init = &ast_ttm_mem_global_init;
-	global_ref->release = &ast_ttm_mem_global_release;
-	r = drm_global_item_ref(global_ref);
-	if (r != 0) {
-		DRM_ERROR("Failed setting up TTM memory accounting "
-			  "subsystem.\n");
-		return r;
-	}
-
-	ast->ttm.bo_global_ref.mem_glob =
-		ast->ttm.mem_global_ref.object;
 	global_ref = &ast->ttm.bo_global_ref.ref;
 	global_ref->global_type = DRM_GLOBAL_TTM_BO;
 	global_ref->size = sizeof(struct ttm_bo_global);
@@ -75,7 +49,6 @@ static int ast_ttm_global_init(struct ast_private *ast)
 	r = drm_global_item_ref(global_ref);
 	if (r != 0) {
 		DRM_ERROR("Failed setting up TTM BO subsystem.\n");
-		drm_global_item_unref(&ast->ttm.mem_global_ref);
 		return r;
 	}
 	return 0;
@@ -84,12 +57,11 @@ static int ast_ttm_global_init(struct ast_private *ast)
 static void
 ast_ttm_global_release(struct ast_private *ast)
 {
-	if (ast->ttm.mem_global_ref.release == NULL)
+	if (ast->ttm.bo_global_ref.ref.release == NULL)
 		return;
 
 	drm_global_item_unref(&ast->ttm.bo_global_ref.ref);
-	drm_global_item_unref(&ast->ttm.mem_global_ref);
-	ast->ttm.mem_global_ref.release = NULL;
+	ast->ttm.bo_global_ref.ref.release = NULL;
 }
 
 
diff --git a/drivers/gpu/drm/bochs/bochs.h b/drivers/gpu/drm/bochs/bochs.h
index 375bf92cd04f..c7c2f85b28fa 100644
--- a/drivers/gpu/drm/bochs/bochs.h
+++ b/drivers/gpu/drm/bochs/bochs.h
@@ -80,7 +80,6 @@ struct bochs_device {
 
 	/* ttm */
 	struct {
-		struct drm_global_reference mem_global_ref;
 		struct ttm_bo_global_ref bo_global_ref;
 		struct ttm_bo_device bdev;
 		bool initialized;
diff --git a/drivers/gpu/drm/bochs/bochs_mm.c b/drivers/gpu/drm/bochs/bochs_mm.c
index e794986e6b7c..22fe13545992 100644
--- a/drivers/gpu/drm/bochs/bochs_mm.c
+++ b/drivers/gpu/drm/bochs/bochs_mm.c
@@ -16,35 +16,11 @@ static inline struct bochs_device *bochs_bdev(struct ttm_bo_device *bd)
 	return container_of(bd, struct bochs_device, ttm.bdev);
 }
 
-static int bochs_ttm_mem_global_init(struct drm_global_reference *ref)
-{
-	return ttm_mem_global_init(ref->object);
-}
-
-static void bochs_ttm_mem_global_release(struct drm_global_reference *ref)
-{
-	ttm_mem_global_release(ref->object);
-}
-
 static int bochs_ttm_global_init(struct bochs_device *bochs)
 {
 	struct drm_global_reference *global_ref;
 	int r;
 
-	global_ref = &bochs->ttm.mem_global_ref;
-	global_ref->global_type = DRM_GLOBAL_TTM_MEM;
-	global_ref->size = sizeof(struct ttm_mem_global);
-	global_ref->init = &bochs_ttm_mem_global_init;
-	global_ref->release = &bochs_ttm_mem_global_release;
-	r = drm_global_item_ref(global_ref);
-	if (r != 0) {
-		DRM_ERROR("Failed setting up TTM memory accounting "
-			  "subsystem.\n");
-		return r;
-	}
-
-	bochs->ttm.bo_global_ref.mem_glob =
-		bochs->ttm.mem_global_ref.object;
 	global_ref = &bochs->ttm.bo_global_ref.ref;
 	global_ref->global_type = DRM_GLOBAL_TTM_BO;
 	global_ref->size = sizeof(struct ttm_bo_global);
@@ -53,7 +29,6 @@ static int bochs_ttm_global_init(struct bochs_device *bochs)
 	r = drm_global_item_ref(global_ref);
 	if (r != 0) {
 		DRM_ERROR("Failed setting up TTM BO subsystem.\n");
-		drm_global_item_unref(&bochs->ttm.mem_global_ref);
 		return r;
 	}
 
@@ -62,12 +37,11 @@ static int bochs_ttm_global_init(struct bochs_device *bochs)
 
 static void bochs_ttm_global_release(struct bochs_device *bochs)
 {
-	if (bochs->ttm.mem_global_ref.release == NULL)
+	if (bochs->ttm.bo_global_ref.ref.release == NULL)
 		return;
 
 	drm_global_item_unref(&bochs->ttm.bo_global_ref.ref);
-	drm_global_item_unref(&bochs->ttm.mem_global_ref);
-	bochs->ttm.mem_global_ref.release = NULL;
+	bochs->ttm.bo_global_ref.ref.release = NULL;
 }
 
 
diff --git a/drivers/gpu/drm/cirrus/cirrus_drv.h b/drivers/gpu/drm/cirrus/cirrus_drv.h
index ce9db7aab225..1c784dc2ac17 100644
--- a/drivers/gpu/drm/cirrus/cirrus_drv.h
+++ b/drivers/gpu/drm/cirrus/cirrus_drv.h
@@ -136,7 +136,6 @@ struct cirrus_device {
 	int fb_mtrr;
 
 	struct {
-		struct drm_global_reference mem_global_ref;
 		struct ttm_bo_global_ref bo_global_ref;
 		struct ttm_bo_device bdev;
 	} ttm;
diff --git a/drivers/gpu/drm/cirrus/cirrus_ttm.c b/drivers/gpu/drm/cirrus/cirrus_ttm.c
index 2e2141f26c5b..7801c56c3c9b 100644
--- a/drivers/gpu/drm/cirrus/cirrus_ttm.c
+++ b/drivers/gpu/drm/cirrus/cirrus_ttm.c
@@ -36,37 +36,11 @@ cirrus_bdev(struct ttm_bo_device *bd)
 	return container_of(bd, struct cirrus_device, ttm.bdev);
 }
 
-static int
-cirrus_ttm_mem_global_init(struct drm_global_reference *ref)
-{
-	return ttm_mem_global_init(ref->object);
-}
-
-static void
-cirrus_ttm_mem_global_release(struct drm_global_reference *ref)
-{
-	ttm_mem_global_release(ref->object);
-}
-
 static int cirrus_ttm_global_init(struct cirrus_device *cirrus)
 {
 	struct drm_global_reference *global_ref;
 	int r;
 
-	global_ref = &cirrus->ttm.mem_global_ref;
-	global_ref->global_type = DRM_GLOBAL_TTM_MEM;
-	global_ref->size = sizeof(struct ttm_mem_global);
-	global_ref->init = &cirrus_ttm_mem_global_init;
-	global_ref->release = &cirrus_ttm_mem_global_release;
-	r = drm_global_item_ref(global_ref);
-	if (r != 0) {
-		DRM_ERROR("Failed setting up TTM memory accounting "
-			  "subsystem.\n");
-		return r;
-	}
-
-	cirrus->ttm.bo_global_ref.mem_glob =
-		cirrus->ttm.mem_global_ref.object;
 	global_ref = &cirrus->ttm.bo_global_ref.ref;
 	global_ref->global_type = DRM_GLOBAL_TTM_BO;
 	global_ref->size = sizeof(struct ttm_bo_global);
@@ -75,7 +49,6 @@ static int cirrus_ttm_global_init(struct cirrus_device *cirrus)
 	r = drm_global_item_ref(global_ref);
 	if (r != 0) {
 		DRM_ERROR("Failed setting up TTM BO subsystem.\n");
-		drm_global_item_unref(&cirrus->ttm.mem_global_ref);
 		return r;
 	}
 	return 0;
@@ -84,12 +57,11 @@ static int cirrus_ttm_global_init(struct cirrus_device *cirrus)
 static void
 cirrus_ttm_global_release(struct cirrus_device *cirrus)
 {
-	if (cirrus->ttm.mem_global_ref.release == NULL)
+	if (cirrus->ttm.bo_global_ref.ref.release == NULL)
 		return;
 
 	drm_global_item_unref(&cirrus->ttm.bo_global_ref.ref);
-	drm_global_item_unref(&cirrus->ttm.mem_global_ref);
-	cirrus->ttm.mem_global_ref.release = NULL;
+	cirrus->ttm.bo_global_ref.ref.release = NULL;
 }
 
 
diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h
index e195521eb41e..a890546b666e 100644
--- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h
+++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h
@@ -50,7 +50,6 @@ struct hibmc_drm_private {
 	struct drm_atomic_state *suspend_state;
 
 	/* ttm */
-	struct drm_global_reference mem_global_ref;
 	struct ttm_bo_global_ref bo_global_ref;
 	struct ttm_bo_device bdev;
 	bool initialized;
diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_ttm.c b/drivers/gpu/drm/hisilicon/hibmc/hibmc_ttm.c
index 786269f0c0f1..b15d60f1b1d1 100644
--- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_ttm.c
+++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_ttm.c
@@ -29,34 +29,10 @@ hibmc_bdev(struct ttm_bo_device *bd)
 	return container_of(bd, struct hibmc_drm_private, bdev);
 }
 
-static int
-hibmc_ttm_mem_global_init(struct drm_global_reference *ref)
-{
-	return ttm_mem_global_init(ref->object);
-}
-
-static void
-hibmc_ttm_mem_global_release(struct drm_global_reference *ref)
-{
-	ttm_mem_global_release(ref->object);
-}
-
 static int hibmc_ttm_global_init(struct hibmc_drm_private *hibmc)
 {
 	int ret;
 
-	hibmc->mem_global_ref.global_type = DRM_GLOBAL_TTM_MEM;
-	hibmc->mem_global_ref.size = sizeof(struct ttm_mem_global);
-	hibmc->mem_global_ref.init = &hibmc_ttm_mem_global_init;
-	hibmc->mem_global_ref.release = &hibmc_ttm_mem_global_release;
-	ret = drm_global_item_ref(&hibmc->mem_global_ref);
-	if (ret) {
-		DRM_ERROR("could not get ref on ttm global: %d\n", ret);
-		return ret;
-	}
-
-	hibmc->bo_global_ref.mem_glob =
-		hibmc->mem_global_ref.object;
 	hibmc->bo_global_ref.ref.global_type = DRM_GLOBAL_TTM_BO;
 	hibmc->bo_global_ref.ref.size = sizeof(struct ttm_bo_global);
 	hibmc->bo_global_ref.ref.init = &ttm_bo_global_ref_init;
@@ -64,7 +40,6 @@ static int hibmc_ttm_global_init(struct hibmc_drm_private *hibmc)
 	ret = drm_global_item_ref(&hibmc->bo_global_ref.ref);
 	if (ret) {
 		DRM_ERROR("failed setting up TTM BO subsystem: %d\n", ret);
-		drm_global_item_unref(&hibmc->mem_global_ref);
 		return ret;
 	}
 	return 0;
@@ -73,9 +48,11 @@ static int hibmc_ttm_global_init(struct hibmc_drm_private *hibmc)
 static void
 hibmc_ttm_global_release(struct hibmc_drm_private *hibmc)
 {
+	if (hibmc->bo_global_ref.ref.release == NULL)
+		return;
+
 	drm_global_item_unref(&hibmc->bo_global_ref.ref);
-	drm_global_item_unref(&hibmc->mem_global_ref);
-	hibmc->mem_global_ref.release = NULL;
+	hibmc->bo_global_ref.ref.release = NULL;
 }
 
 static void hibmc_bo_ttm_destroy(struct ttm_buffer_object *tbo)
diff --git a/drivers/gpu/drm/mgag200/mgag200_drv.h b/drivers/gpu/drm/mgag200/mgag200_drv.h
index 04f1dfba12e5..e5348955a3cc 100644
--- a/drivers/gpu/drm/mgag200/mgag200_drv.h
+++ b/drivers/gpu/drm/mgag200/mgag200_drv.h
@@ -212,7 +212,6 @@ struct mga_device {
 	int fb_mtrr;
 
 	struct {
-		struct drm_global_reference mem_global_ref;
 		struct ttm_bo_global_ref bo_global_ref;
 		struct ttm_bo_device bdev;
 	} ttm;
diff --git a/drivers/gpu/drm/mgag200/mgag200_ttm.c b/drivers/gpu/drm/mgag200/mgag200_ttm.c
index 3444b539e7f4..11bdc8121a7d 100644
--- a/drivers/gpu/drm/mgag200/mgag200_ttm.c
+++ b/drivers/gpu/drm/mgag200/mgag200_ttm.c
@@ -36,37 +36,11 @@ mgag200_bdev(struct ttm_bo_device *bd)
 	return container_of(bd, struct mga_device, ttm.bdev);
 }
 
-static int
-mgag200_ttm_mem_global_init(struct drm_global_reference *ref)
-{
-	return ttm_mem_global_init(ref->object);
-}
-
-static void
-mgag200_ttm_mem_global_release(struct drm_global_reference *ref)
-{
-	ttm_mem_global_release(ref->object);
-}
-
 static int mgag200_ttm_global_init(struct mga_device *ast)
 {
 	struct drm_global_reference *global_ref;
 	int r;
 
-	global_ref = &ast->ttm.mem_global_ref;
-	global_ref->global_type = DRM_GLOBAL_TTM_MEM;
-	global_ref->size = sizeof(struct ttm_mem_global);
-	global_ref->init = &mgag200_ttm_mem_global_init;
-	global_ref->release = &mgag200_ttm_mem_global_release;
-	r = drm_global_item_ref(global_ref);
-	if (r != 0) {
-		DRM_ERROR("Failed setting up TTM memory accounting "
-			  "subsystem.\n");
-		return r;
-	}
-
-	ast->ttm.bo_global_ref.mem_glob =
-		ast->ttm.mem_global_ref.object;
 	global_ref = &ast->ttm.bo_global_ref.ref;
 	global_ref->global_type = DRM_GLOBAL_TTM_BO;
 	global_ref->size = sizeof(struct ttm_bo_global);
@@ -75,7 +49,6 @@ static int mgag200_ttm_global_init(struct mga_device *ast)
 	r = drm_global_item_ref(global_ref);
 	if (r != 0) {
 		DRM_ERROR("Failed setting up TTM BO subsystem.\n");
-		drm_global_item_unref(&ast->ttm.mem_global_ref);
 		return r;
 	}
 	return 0;
@@ -84,12 +57,11 @@ static int mgag200_ttm_global_init(struct mga_device *ast)
 static void
 mgag200_ttm_global_release(struct mga_device *ast)
 {
-	if (ast->ttm.mem_global_ref.release == NULL)
+	if (ast->ttm.bo_global_ref.ref.release == NULL)
 		return;
 
 	drm_global_item_unref(&ast->ttm.bo_global_ref.ref);
-	drm_global_item_unref(&ast->ttm.mem_global_ref);
-	ast->ttm.mem_global_ref.release = NULL;
+	ast->ttm.bo_global_ref.ref.release = NULL;
 }
 
 
diff --git a/drivers/gpu/drm/nouveau/nouveau_drv.h b/drivers/gpu/drm/nouveau/nouveau_drv.h
index 6e1acaec3400..937b8e61f654 100644
--- a/drivers/gpu/drm/nouveau/nouveau_drv.h
+++ b/drivers/gpu/drm/nouveau/nouveau_drv.h
@@ -146,7 +146,6 @@ struct nouveau_drm {
 
 	/* TTM interface support */
 	struct {
-		struct drm_global_reference mem_global_ref;
 		struct ttm_bo_global_ref bo_global_ref;
 		struct ttm_bo_device bdev;
 		atomic_t validate_sequence;
diff --git a/drivers/gpu/drm/nouveau/nouveau_ttm.c b/drivers/gpu/drm/nouveau/nouveau_ttm.c
index a293383c8654..69448b02649e 100644
--- a/drivers/gpu/drm/nouveau/nouveau_ttm.c
+++ b/drivers/gpu/drm/nouveau/nouveau_ttm.c
@@ -174,38 +174,12 @@ nouveau_ttm_mmap(struct file *filp, struct vm_area_struct *vma)
 	return ttm_bo_mmap(filp, vma, &drm->ttm.bdev);
 }
 
-static int
-nouveau_ttm_mem_global_init(struct drm_global_reference *ref)
-{
-	return ttm_mem_global_init(ref->object);
-}
-
-static void
-nouveau_ttm_mem_global_release(struct drm_global_reference *ref)
-{
-	ttm_mem_global_release(ref->object);
-}
-
 int
 nouveau_ttm_global_init(struct nouveau_drm *drm)
 {
 	struct drm_global_reference *global_ref;
 	int ret;
 
-	global_ref = &drm->ttm.mem_global_ref;
-	global_ref->global_type = DRM_GLOBAL_TTM_MEM;
-	global_ref->size = sizeof(struct ttm_mem_global);
-	global_ref->init = &nouveau_ttm_mem_global_init;
-	global_ref->release = &nouveau_ttm_mem_global_release;
-
-	ret = drm_global_item_ref(global_ref);
-	if (unlikely(ret != 0)) {
-		DRM_ERROR("Failed setting up TTM memory accounting\n");
-		drm->ttm.mem_global_ref.release = NULL;
-		return ret;
-	}
-
-	drm->ttm.bo_global_ref.mem_glob = global_ref->object;
 	global_ref = &drm->ttm.bo_global_ref.ref;
 	global_ref->global_type = DRM_GLOBAL_TTM_BO;
 	global_ref->size = sizeof(struct ttm_bo_global);
@@ -215,8 +189,7 @@ nouveau_ttm_global_init(struct nouveau_drm *drm)
 	ret = drm_global_item_ref(global_ref);
 	if (unlikely(ret != 0)) {
 		DRM_ERROR("Failed setting up TTM BO subsystem\n");
-		drm_global_item_unref(&drm->ttm.mem_global_ref);
-		drm->ttm.mem_global_ref.release = NULL;
+		drm->ttm.bo_global_ref.ref.release = NULL;
 		return ret;
 	}
 
@@ -226,12 +199,11 @@ nouveau_ttm_global_init(struct nouveau_drm *drm)
 void
 nouveau_ttm_global_release(struct nouveau_drm *drm)
 {
-	if (drm->ttm.mem_global_ref.release == NULL)
+	if (drm->ttm.bo_global_ref.ref.release == NULL)
 		return;
 
 	drm_global_item_unref(&drm->ttm.bo_global_ref.ref);
-	drm_global_item_unref(&drm->ttm.mem_global_ref);
-	drm->ttm.mem_global_ref.release = NULL;
+	drm->ttm.bo_global_ref.ref.release = NULL;
 }
 
 static int
diff --git a/drivers/gpu/drm/qxl/qxl_drv.h b/drivers/gpu/drm/qxl/qxl_drv.h
index 01220d386b0a..b2c1cef0005a 100644
--- a/drivers/gpu/drm/qxl/qxl_drv.h
+++ b/drivers/gpu/drm/qxl/qxl_drv.h
@@ -133,7 +133,6 @@ struct qxl_framebuffer {
 
 struct qxl_mman {
 	struct ttm_bo_global_ref        bo_global_ref;
-	struct drm_global_reference	mem_global_ref;
 	bool				mem_global_referenced;
 	struct ttm_bo_device		bdev;
 };
diff --git a/drivers/gpu/drm/qxl/qxl_ttm.c b/drivers/gpu/drm/qxl/qxl_ttm.c
index db2a0036e9c4..bb8cc9b16780 100644
--- a/drivers/gpu/drm/qxl/qxl_ttm.c
+++ b/drivers/gpu/drm/qxl/qxl_ttm.c
@@ -46,37 +46,11 @@ static struct qxl_device *qxl_get_qdev(struct ttm_bo_device *bdev)
 	return qdev;
 }
 
-static int qxl_ttm_mem_global_init(struct drm_global_reference *ref)
-{
-	return ttm_mem_global_init(ref->object);
-}
-
-static void qxl_ttm_mem_global_release(struct drm_global_reference *ref)
-{
-	ttm_mem_global_release(ref->object);
-}
-
 static int qxl_ttm_global_init(struct qxl_device *qdev)
 {
 	struct drm_global_reference *global_ref;
 	int r;
 
-	qdev->mman.mem_global_referenced = false;
-	global_ref = &qdev->mman.mem_global_ref;
-	global_ref->global_type = DRM_GLOBAL_TTM_MEM;
-	global_ref->size = sizeof(struct ttm_mem_global);
-	global_ref->init = &qxl_ttm_mem_global_init;
-	global_ref->release = &qxl_ttm_mem_global_release;
-
-	r = drm_global_item_ref(global_ref);
-	if (r != 0) {
-		DRM_ERROR("Failed setting up TTM memory accounting "
-			  "subsystem.\n");
-		return r;
-	}
-
-	qdev->mman.bo_global_ref.mem_glob =
-		qdev->mman.mem_global_ref.object;
 	global_ref = &qdev->mman.bo_global_ref.ref;
 	global_ref->global_type = DRM_GLOBAL_TTM_BO;
 	global_ref->size = sizeof(struct ttm_bo_global);
@@ -85,7 +59,6 @@ static int qxl_ttm_global_init(struct qxl_device *qdev)
 	r = drm_global_item_ref(global_ref);
 	if (r != 0) {
 		DRM_ERROR("Failed setting up TTM BO subsystem.\n");
-		drm_global_item_unref(&qdev->mman.mem_global_ref);
 		return r;
 	}
 
@@ -97,7 +70,6 @@ static void qxl_ttm_global_fini(struct qxl_device *qdev)
 {
 	if (qdev->mman.mem_global_referenced) {
 		drm_global_item_unref(&qdev->mman.bo_global_ref.ref);
-		drm_global_item_unref(&qdev->mman.mem_global_ref);
 		qdev->mman.mem_global_referenced = false;
 	}
 }
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index 1a6f6edb3515..06fb952b6290 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -449,7 +449,6 @@ struct radeon_surface_reg {
  */
 struct radeon_mman {
 	struct ttm_bo_global_ref        bo_global_ref;
-	struct drm_global_reference	mem_global_ref;
 	struct ttm_bo_device		bdev;
 	bool				mem_global_referenced;
 	bool				initialized;
diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c
index dac4ec5a120b..2104429ddbac 100644
--- a/drivers/gpu/drm/radeon/radeon_ttm.c
+++ b/drivers/gpu/drm/radeon/radeon_ttm.c
@@ -64,36 +64,12 @@ static struct radeon_device *radeon_get_rdev(struct ttm_bo_device *bdev)
 /*
  * Global memory.
  */
-static int radeon_ttm_mem_global_init(struct drm_global_reference *ref)
-{
-	return ttm_mem_global_init(ref->object);
-}
-
-static void radeon_ttm_mem_global_release(struct drm_global_reference *ref)
-{
-	ttm_mem_global_release(ref->object);
-}
-
 static int radeon_ttm_global_init(struct radeon_device *rdev)
 {
 	struct drm_global_reference *global_ref;
 	int r;
 
 	rdev->mman.mem_global_referenced = false;
-	global_ref = &rdev->mman.mem_global_ref;
-	global_ref->global_type = DRM_GLOBAL_TTM_MEM;
-	global_ref->size = sizeof(struct ttm_mem_global);
-	global_ref->init = &radeon_ttm_mem_global_init;
-	global_ref->release = &radeon_ttm_mem_global_release;
-	r = drm_global_item_ref(global_ref);
-	if (r != 0) {
-		DRM_ERROR("Failed setting up TTM memory accounting "
-			  "subsystem.\n");
-		return r;
-	}
-
-	rdev->mman.bo_global_ref.mem_glob =
-		rdev->mman.mem_global_ref.object;
 	global_ref = &rdev->mman.bo_global_ref.ref;
 	global_ref->global_type = DRM_GLOBAL_TTM_BO;
 	global_ref->size = sizeof(struct ttm_bo_global);
@@ -102,7 +78,6 @@ static int radeon_ttm_global_init(struct radeon_device *rdev)
 	r = drm_global_item_ref(global_ref);
 	if (r != 0) {
 		DRM_ERROR("Failed setting up TTM BO subsystem.\n");
-		drm_global_item_unref(&rdev->mman.mem_global_ref);
 		return r;
 	}
 
@@ -114,7 +89,6 @@ static void radeon_ttm_global_fini(struct radeon_device *rdev)
 {
 	if (rdev->mman.mem_global_referenced) {
 		drm_global_item_unref(&rdev->mman.bo_global_ref.ref);
-		drm_global_item_unref(&rdev->mman.mem_global_ref);
 		rdev->mman.mem_global_referenced = false;
 	}
 }
diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c
index 9edece6510d3..3006050b1720 100644
--- a/drivers/gpu/drm/ttm/ttm_bo.c
+++ b/drivers/gpu/drm/ttm/ttm_bo.c
@@ -1526,18 +1526,22 @@ void ttm_bo_global_release(struct ttm_bo_global *glob)
 {
 	kobject_del(&glob->kobj);
 	kobject_put(&glob->kobj);
+	ttm_mem_global_release(&ttm_mem_glob);
 }
 EXPORT_SYMBOL(ttm_bo_global_release);
 
-int ttm_bo_global_init(struct ttm_bo_global *glob,
-		       struct ttm_mem_global *mem_glob)
+int ttm_bo_global_init(struct ttm_bo_global *glob)
 {
 	int ret;
 	unsigned i;
 
+	ret = ttm_mem_global_init(&ttm_mem_glob);
+	if (ret)
+		return ret;
+
 	mutex_init(&glob->device_list_mutex);
 	spin_lock_init(&glob->lru_lock);
-	glob->mem_glob = mem_glob;
+	glob->mem_glob = &ttm_mem_glob;
 	glob->mem_glob->bo_glob = glob;
 	glob->dummy_read_page = alloc_page(__GFP_ZERO | GFP_DMA32);
 
diff --git a/drivers/gpu/drm/ttm/ttm_memory.c b/drivers/gpu/drm/ttm/ttm_memory.c
index 450387c92b63..7704e17c402f 100644
--- a/drivers/gpu/drm/ttm/ttm_memory.c
+++ b/drivers/gpu/drm/ttm/ttm_memory.c
@@ -41,6 +41,9 @@
 
 #define TTM_MEMORY_ALLOC_RETRIES 4
 
+struct ttm_mem_global ttm_mem_glob;
+EXPORT_SYMBOL(ttm_mem_glob);
+
 struct ttm_mem_zone {
 	struct kobject kobj;
 	struct ttm_mem_global *glob;
@@ -464,7 +467,6 @@ int ttm_mem_global_init(struct ttm_mem_global *glob)
 	ttm_mem_global_release(glob);
 	return ret;
 }
-EXPORT_SYMBOL(ttm_mem_global_init);
 
 void ttm_mem_global_release(struct ttm_mem_global *glob)
 {
@@ -486,7 +488,6 @@ void ttm_mem_global_release(struct ttm_mem_global *glob)
 	kobject_del(&glob->kobj);
 	kobject_put(&glob->kobj);
 }
-EXPORT_SYMBOL(ttm_mem_global_release);
 
 static void ttm_check_swapping(struct ttm_mem_global *glob)
 {
diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.h b/drivers/gpu/drm/virtio/virtgpu_drv.h
index 65605e207bbe..dec42d421e00 100644
--- a/drivers/gpu/drm/virtio/virtgpu_drv.h
+++ b/drivers/gpu/drm/virtio/virtgpu_drv.h
@@ -133,7 +133,6 @@ struct virtio_gpu_framebuffer {
 
 struct virtio_gpu_mman {
 	struct ttm_bo_global_ref        bo_global_ref;
-	struct drm_global_reference	mem_global_ref;
 	bool				mem_global_referenced;
 	struct ttm_bo_device		bdev;
 };
diff --git a/drivers/gpu/drm/virtio/virtgpu_ttm.c b/drivers/gpu/drm/virtio/virtgpu_ttm.c
index 0ec46b47b423..b99ecc6d97d3 100644
--- a/drivers/gpu/drm/virtio/virtgpu_ttm.c
+++ b/drivers/gpu/drm/virtio/virtgpu_ttm.c
@@ -50,37 +50,12 @@ virtio_gpu_device *virtio_gpu_get_vgdev(struct ttm_bo_device *bdev)
 	return vgdev;
 }
 
-static int virtio_gpu_ttm_mem_global_init(struct drm_global_reference *ref)
-{
-	return ttm_mem_global_init(ref->object);
-}
-
-static void virtio_gpu_ttm_mem_global_release(struct drm_global_reference *ref)
-{
-	ttm_mem_global_release(ref->object);
-}
-
 static int virtio_gpu_ttm_global_init(struct virtio_gpu_device *vgdev)
 {
 	struct drm_global_reference *global_ref;
 	int r;
 
 	vgdev->mman.mem_global_referenced = false;
-	global_ref = &vgdev->mman.mem_global_ref;
-	global_ref->global_type = DRM_GLOBAL_TTM_MEM;
-	global_ref->size = sizeof(struct ttm_mem_global);
-	global_ref->init = &virtio_gpu_ttm_mem_global_init;
-	global_ref->release = &virtio_gpu_ttm_mem_global_release;
-
-	r = drm_global_item_ref(global_ref);
-	if (r != 0) {
-		DRM_ERROR("Failed setting up TTM memory accounting "
-			  "subsystem.\n");
-		return r;
-	}
-
-	vgdev->mman.bo_global_ref.mem_glob =
-		vgdev->mman.mem_global_ref.object;
 	global_ref = &vgdev->mman.bo_global_ref.ref;
 	global_ref->global_type = DRM_GLOBAL_TTM_BO;
 	global_ref->size = sizeof(struct ttm_bo_global);
@@ -89,7 +64,6 @@ static int virtio_gpu_ttm_global_init(struct virtio_gpu_device *vgdev)
 	r = drm_global_item_ref(global_ref);
 	if (r != 0) {
 		DRM_ERROR("Failed setting up TTM BO subsystem.\n");
-		drm_global_item_unref(&vgdev->mman.mem_global_ref);
 		return r;
 	}
 
@@ -101,7 +75,6 @@ static void virtio_gpu_ttm_global_fini(struct virtio_gpu_device *vgdev)
 {
 	if (vgdev->mman.mem_global_referenced) {
 		drm_global_item_unref(&vgdev->mman.bo_global_ref.ref);
-		drm_global_item_unref(&vgdev->mman.mem_global_ref);
 		vgdev->mman.mem_global_referenced = false;
 	}
 }
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
index bb6dbbe18835..57df776d987c 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
@@ -828,8 +828,8 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
 		goto out_err4;
 	}
 
-	dev_priv->tdev = ttm_object_device_init
-		(dev_priv->mem_global_ref.object, 12, &vmw_prime_dmabuf_ops);
+	dev_priv->tdev = ttm_object_device_init(&ttm_mem_glob, 12,
+						&vmw_prime_dmabuf_ops);
 
 	if (unlikely(dev_priv->tdev == NULL)) {
 		DRM_ERROR("Unable to initialize TTM object management.\n");
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
index 1abe21758b0d..df15a745efc3 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
@@ -366,7 +366,6 @@ enum {
 struct vmw_private {
 	struct ttm_bo_device bdev;
 	struct ttm_bo_global_ref bo_global_ref;
-	struct drm_global_reference mem_global_ref;
 
 	struct vmw_fifo_state fifo;
 
@@ -1288,7 +1287,7 @@ vmw_bo_reference(struct vmw_buffer_object *buf)
 
 static inline struct ttm_mem_global *vmw_mem_glob(struct vmw_private *dev_priv)
 {
-	return (struct ttm_mem_global *) dev_priv->mem_global_ref.object;
+	return &ttm_mem_glob;
 }
 
 static inline void vmw_fifo_resource_inc(struct vmw_private *dev_priv)
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_glue.c b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_glue.c
index f3ce43c41978..0ac473cd5136 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_glue.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_glue.c
@@ -43,36 +43,11 @@ int vmw_mmap(struct file *filp, struct vm_area_struct *vma)
 	return ttm_bo_mmap(filp, vma, &dev_priv->bdev);
 }
 
-static int vmw_ttm_mem_global_init(struct drm_global_reference *ref)
-{
-	DRM_INFO("global init.\n");
-	return ttm_mem_global_init(ref->object);
-}
-
-static void vmw_ttm_mem_global_release(struct drm_global_reference *ref)
-{
-	ttm_mem_global_release(ref->object);
-}
-
 int vmw_ttm_global_init(struct vmw_private *dev_priv)
 {
 	struct drm_global_reference *global_ref;
 	int ret;
 
-	global_ref = &dev_priv->mem_global_ref;
-	global_ref->global_type = DRM_GLOBAL_TTM_MEM;
-	global_ref->size = sizeof(struct ttm_mem_global);
-	global_ref->init = &vmw_ttm_mem_global_init;
-	global_ref->release = &vmw_ttm_mem_global_release;
-
-	ret = drm_global_item_ref(global_ref);
-	if (unlikely(ret != 0)) {
-		DRM_ERROR("Failed setting up TTM memory accounting.\n");
-		return ret;
-	}
-
-	dev_priv->bo_global_ref.mem_glob =
-		dev_priv->mem_global_ref.object;
 	global_ref = &dev_priv->bo_global_ref.ref;
 	global_ref->global_type = DRM_GLOBAL_TTM_BO;
 	global_ref->size = sizeof(struct ttm_bo_global);
@@ -87,12 +62,10 @@ int vmw_ttm_global_init(struct vmw_private *dev_priv)
 
 	return 0;
 out_no_bo:
-	drm_global_item_unref(&dev_priv->mem_global_ref);
 	return ret;
 }
 
 void vmw_ttm_global_release(struct vmw_private *dev_priv)
 {
 	drm_global_item_unref(&dev_priv->bo_global_ref.ref);
-	drm_global_item_unref(&dev_priv->mem_global_ref);
 }
diff --git a/drivers/staging/vboxvideo/vbox_drv.h b/drivers/staging/vboxvideo/vbox_drv.h
index 594f84272957..41f760b77704 100644
--- a/drivers/staging/vboxvideo/vbox_drv.h
+++ b/drivers/staging/vboxvideo/vbox_drv.h
@@ -95,7 +95,6 @@ struct vbox_private {
 	int fb_mtrr;
 
 	struct {
-		struct drm_global_reference mem_global_ref;
 		struct ttm_bo_global_ref bo_global_ref;
 		struct ttm_bo_device bdev;
 	} ttm;
diff --git a/drivers/staging/vboxvideo/vbox_ttm.c b/drivers/staging/vboxvideo/vbox_ttm.c
index 2329a55d4636..88cdacf2b0f0 100644
--- a/drivers/staging/vboxvideo/vbox_ttm.c
+++ b/drivers/staging/vboxvideo/vbox_ttm.c
@@ -35,16 +35,6 @@ static inline struct vbox_private *vbox_bdev(struct ttm_bo_device *bd)
 	return container_of(bd, struct vbox_private, ttm.bdev);
 }
 
-static int vbox_ttm_mem_global_init(struct drm_global_reference *ref)
-{
-	return ttm_mem_global_init(ref->object);
-}
-
-static void vbox_ttm_mem_global_release(struct drm_global_reference *ref)
-{
-	ttm_mem_global_release(ref->object);
-}
-
 /**
  * Adds the vbox memory manager object/structures to the global memory manager.
  */
@@ -53,18 +43,6 @@ static int vbox_ttm_global_init(struct vbox_private *vbox)
 	struct drm_global_reference *global_ref;
 	int ret;
 
-	global_ref = &vbox->ttm.mem_global_ref;
-	global_ref->global_type = DRM_GLOBAL_TTM_MEM;
-	global_ref->size = sizeof(struct ttm_mem_global);
-	global_ref->init = &vbox_ttm_mem_global_init;
-	global_ref->release = &vbox_ttm_mem_global_release;
-	ret = drm_global_item_ref(global_ref);
-	if (ret) {
-		DRM_ERROR("Failed setting up TTM memory subsystem.\n");
-		return ret;
-	}
-
-	vbox->ttm.bo_global_ref.mem_glob = vbox->ttm.mem_global_ref.object;
 	global_ref = &vbox->ttm.bo_global_ref.ref;
 	global_ref->global_type = DRM_GLOBAL_TTM_BO;
 	global_ref->size = sizeof(struct ttm_bo_global);
@@ -74,7 +52,6 @@ static int vbox_ttm_global_init(struct vbox_private *vbox)
 	ret = drm_global_item_ref(global_ref);
 	if (ret) {
 		DRM_ERROR("Failed setting up TTM BO subsystem.\n");
-		drm_global_item_unref(&vbox->ttm.mem_global_ref);
 		return ret;
 	}
 
@@ -87,7 +64,6 @@ static int vbox_ttm_global_init(struct vbox_private *vbox)
 static void vbox_ttm_global_release(struct vbox_private *vbox)
 {
 	drm_global_item_unref(&vbox->ttm.bo_global_ref.ref);
-	drm_global_item_unref(&vbox->ttm.mem_global_ref);
 }
 
 static void vbox_bo_ttm_destroy(struct ttm_buffer_object *tbo)
diff --git a/include/drm/ttm/ttm_bo_driver.h b/include/drm/ttm/ttm_bo_driver.h
index c6ee07d10281..4ae6fc33f761 100644
--- a/include/drm/ttm/ttm_bo_driver.h
+++ b/include/drm/ttm/ttm_bo_driver.h
@@ -570,8 +570,7 @@ void ttm_bo_mem_put_locked(struct ttm_buffer_object *bo,
 			   struct ttm_mem_reg *mem);
 
 void ttm_bo_global_release(struct ttm_bo_global *glob);
-int ttm_bo_global_init(struct ttm_bo_global *glob,
-		       struct ttm_mem_global *mem_glob);
+int ttm_bo_global_init(struct ttm_bo_global *glob);
 
 int ttm_bo_device_release(struct ttm_bo_device *bdev);
 
@@ -895,7 +894,6 @@ extern const struct ttm_mem_type_manager_func ttm_bo_manager_func;
 
 struct ttm_bo_global_ref {
 	struct drm_global_reference ref;
-	struct ttm_mem_global *mem_glob;
 };
 
 /**
@@ -909,9 +907,7 @@ struct ttm_bo_global_ref {
  */
 static inline int ttm_bo_global_ref_init(struct drm_global_reference *ref)
 {
-	struct ttm_bo_global_ref *bo_ref =
-		container_of(ref, struct ttm_bo_global_ref, ref);
-	return ttm_bo_global_init(ref->object, bo_ref->mem_glob);
+	return ttm_bo_global_init(ref->object);
 }
 
 /**
diff --git a/include/drm/ttm/ttm_memory.h b/include/drm/ttm/ttm_memory.h
index 737b5fed8003..3ff48a0a2d7b 100644
--- a/include/drm/ttm/ttm_memory.h
+++ b/include/drm/ttm/ttm_memory.h
@@ -63,7 +63,7 @@
 
 #define TTM_MEM_MAX_ZONES 2
 struct ttm_mem_zone;
-struct ttm_mem_global {
+extern struct ttm_mem_global {
 	struct kobject kobj;
 	struct ttm_bo_global *bo_glob;
 	struct workqueue_struct *swap_queue;
@@ -78,7 +78,7 @@ struct ttm_mem_global {
 #else
 	struct ttm_mem_zone *zone_dma32;
 #endif
-};
+} ttm_mem_glob;
 
 extern int ttm_mem_global_init(struct ttm_mem_global *glob);
 extern void ttm_mem_global_release(struct ttm_mem_global *glob);
-- 
2.14.1

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 2/5] drm/ttm: make the device list mutex static
       [not found] ` <20181019164138.32993-1-christian.koenig-5C7GfCeVMHo@public.gmane.org>
@ 2018-10-19 16:41   ` Christian König
  2018-10-19 16:41   ` [PATCH 3/5] drm/ttm: use a static ttm_bo_global instance Christian König
                     ` (3 subsequent siblings)
  4 siblings, 0 replies; 12+ messages in thread
From: Christian König @ 2018-10-19 16:41 UTC (permalink / raw)
  To: dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW,
	tzimmermann-l3A5Bk7waGM,
	amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW

This way it can protect the whole BO global state.

Signed-off-by: Christian König <christian.koenig@amd.com>
---
 drivers/gpu/drm/ttm/ttm_bo.c    | 14 +++++++++-----
 include/drm/ttm/ttm_bo_driver.h |  1 -
 2 files changed, 9 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c
index 3006050b1720..4ec368b2555a 100644
--- a/drivers/gpu/drm/ttm/ttm_bo.c
+++ b/drivers/gpu/drm/ttm/ttm_bo.c
@@ -45,6 +45,11 @@
 
 static void ttm_bo_global_kobj_release(struct kobject *kobj);
 
+/**
+ * ttm_global_mutex - protecting the global BO state
+ */
+DEFINE_MUTEX(ttm_global_mutex);
+
 static struct attribute ttm_bo_count = {
 	.name = "bo_count",
 	.mode = S_IRUGO
@@ -1539,7 +1544,6 @@ int ttm_bo_global_init(struct ttm_bo_global *glob)
 	if (ret)
 		return ret;
 
-	mutex_init(&glob->device_list_mutex);
 	spin_lock_init(&glob->lru_lock);
 	glob->mem_glob = &ttm_mem_glob;
 	glob->mem_glob->bo_glob = glob;
@@ -1587,9 +1591,9 @@ int ttm_bo_device_release(struct ttm_bo_device *bdev)
 		}
 	}
 
-	mutex_lock(&glob->device_list_mutex);
+	mutex_lock(&ttm_global_mutex);
 	list_del(&bdev->device_list);
-	mutex_unlock(&glob->device_list_mutex);
+	mutex_unlock(&ttm_global_mutex);
 
 	cancel_delayed_work_sync(&bdev->wq);
 
@@ -1636,9 +1640,9 @@ int ttm_bo_device_init(struct ttm_bo_device *bdev,
 	bdev->dev_mapping = mapping;
 	bdev->glob = glob;
 	bdev->need_dma32 = need_dma32;
-	mutex_lock(&glob->device_list_mutex);
+	mutex_lock(&ttm_global_mutex);
 	list_add_tail(&bdev->device_list, &glob->device_list);
-	mutex_unlock(&glob->device_list_mutex);
+	mutex_unlock(&ttm_global_mutex);
 
 	return 0;
 out_no_sys:
diff --git a/include/drm/ttm/ttm_bo_driver.h b/include/drm/ttm/ttm_bo_driver.h
index 4ae6fc33f761..9cec8835b88f 100644
--- a/include/drm/ttm/ttm_bo_driver.h
+++ b/include/drm/ttm/ttm_bo_driver.h
@@ -407,7 +407,6 @@ struct ttm_bo_global {
 	struct kobject kobj;
 	struct ttm_mem_global *mem_glob;
 	struct page *dummy_read_page;
-	struct mutex device_list_mutex;
 	spinlock_t lru_lock;
 
 	/**
-- 
2.14.1

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 3/5] drm/ttm: use a static ttm_bo_global instance
       [not found] ` <20181019164138.32993-1-christian.koenig-5C7GfCeVMHo@public.gmane.org>
  2018-10-19 16:41   ` [PATCH 2/5] drm/ttm: make the device list mutex static Christian König
@ 2018-10-19 16:41   ` Christian König
  2018-10-19 16:41   ` [PATCH 4/5] drm/ttm: initialize globals during device init Christian König
                     ` (2 subsequent siblings)
  4 siblings, 0 replies; 12+ messages in thread
From: Christian König @ 2018-10-19 16:41 UTC (permalink / raw)
  To: dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW,
	tzimmermann-l3A5Bk7waGM,
	amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW

As the name says we only need one global instance of ttm_bo_global.

Just use a single exported instance which is save to initialize multiple times.

Signed-off-by: Christian König <christian.koenig@amd.com>
---
 drivers/gpu/drm/ttm/ttm_bo.c    | 31 +++++++++++++++++++++++--------
 include/drm/ttm/ttm_bo_driver.h | 15 ++++++++-------
 2 files changed, 31 insertions(+), 15 deletions(-)

diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c
index 4ec368b2555a..d89183f95570 100644
--- a/drivers/gpu/drm/ttm/ttm_bo.c
+++ b/drivers/gpu/drm/ttm/ttm_bo.c
@@ -49,6 +49,9 @@ static void ttm_bo_global_kobj_release(struct kobject *kobj);
  * ttm_global_mutex - protecting the global BO state
  */
 DEFINE_MUTEX(ttm_global_mutex);
+struct ttm_bo_global ttm_bo_glob = {
+	.use_count = 0
+};
 
 static struct attribute ttm_bo_count = {
 	.name = "bo_count",
@@ -1527,22 +1530,35 @@ static void ttm_bo_global_kobj_release(struct kobject *kobj)
 	kfree(glob);
 }
 
-void ttm_bo_global_release(struct ttm_bo_global *glob)
+void ttm_bo_global_release(void)
 {
+	struct ttm_bo_global *glob = &ttm_bo_glob;
+
+	mutex_lock(&ttm_global_mutex);
+	if (--glob->use_count > 0)
+		goto out;
+
 	kobject_del(&glob->kobj);
 	kobject_put(&glob->kobj);
 	ttm_mem_global_release(&ttm_mem_glob);
+out:
+	mutex_unlock(&ttm_global_mutex);
 }
 EXPORT_SYMBOL(ttm_bo_global_release);
 
-int ttm_bo_global_init(struct ttm_bo_global *glob)
+int ttm_bo_global_init(void)
 {
-	int ret;
+	struct ttm_bo_global *glob = &ttm_bo_glob;
+	int ret = 0;
 	unsigned i;
 
+	mutex_lock(&ttm_global_mutex);
+	if (++glob->use_count > 1)
+		goto out;
+
 	ret = ttm_mem_global_init(&ttm_mem_glob);
 	if (ret)
-		return ret;
+		goto out;
 
 	spin_lock_init(&glob->lru_lock);
 	glob->mem_glob = &ttm_mem_glob;
@@ -1551,7 +1567,7 @@ int ttm_bo_global_init(struct ttm_bo_global *glob)
 
 	if (unlikely(glob->dummy_read_page == NULL)) {
 		ret = -ENOMEM;
-		goto out_no_drp;
+		goto out;
 	}
 
 	for (i = 0; i < TTM_MAX_BO_PRIORITY; ++i)
@@ -1563,9 +1579,8 @@ int ttm_bo_global_init(struct ttm_bo_global *glob)
 		&glob->kobj, &ttm_bo_glob_kobj_type, ttm_get_kobj(), "buffer_objects");
 	if (unlikely(ret != 0))
 		kobject_put(&glob->kobj);
-	return ret;
-out_no_drp:
-	kfree(glob);
+out:
+	mutex_unlock(&ttm_global_mutex);
 	return ret;
 }
 EXPORT_SYMBOL(ttm_bo_global_init);
diff --git a/include/drm/ttm/ttm_bo_driver.h b/include/drm/ttm/ttm_bo_driver.h
index 9cec8835b88f..26be74939f10 100644
--- a/include/drm/ttm/ttm_bo_driver.h
+++ b/include/drm/ttm/ttm_bo_driver.h
@@ -398,7 +398,7 @@ struct ttm_bo_driver {
  * @swap_lru: Lru list of buffer objects used for swapping.
  */
 
-struct ttm_bo_global {
+extern struct ttm_bo_global {
 
 	/**
 	 * Constant after init.
@@ -410,8 +410,9 @@ struct ttm_bo_global {
 	spinlock_t lru_lock;
 
 	/**
-	 * Protected by device_list_mutex.
+	 * Protected by ttm_global_mutex.
 	 */
+	unsigned int use_count;
 	struct list_head device_list;
 
 	/**
@@ -423,7 +424,7 @@ struct ttm_bo_global {
 	 * Internal protection.
 	 */
 	atomic_t bo_count;
-};
+} ttm_bo_glob;
 
 
 #define TTM_NUM_MEM_TYPES 8
@@ -568,8 +569,8 @@ void ttm_bo_mem_put(struct ttm_buffer_object *bo, struct ttm_mem_reg *mem);
 void ttm_bo_mem_put_locked(struct ttm_buffer_object *bo,
 			   struct ttm_mem_reg *mem);
 
-void ttm_bo_global_release(struct ttm_bo_global *glob);
-int ttm_bo_global_init(struct ttm_bo_global *glob);
+void ttm_bo_global_release(void);
+int ttm_bo_global_init(void);
 
 int ttm_bo_device_release(struct ttm_bo_device *bdev);
 
@@ -906,7 +907,7 @@ struct ttm_bo_global_ref {
  */
 static inline int ttm_bo_global_ref_init(struct drm_global_reference *ref)
 {
-	return ttm_bo_global_init(ref->object);
+	return ttm_bo_global_init();
 }
 
 /**
@@ -920,7 +921,7 @@ static inline int ttm_bo_global_ref_init(struct drm_global_reference *ref)
  */
 static inline void ttm_bo_global_ref_release(struct drm_global_reference *ref)
 {
-	ttm_bo_global_release(ref->object);
+	ttm_bo_global_release();
 }
 
 #endif
-- 
2.14.1

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 4/5] drm/ttm: initialize globals during device init
       [not found] ` <20181019164138.32993-1-christian.koenig-5C7GfCeVMHo@public.gmane.org>
  2018-10-19 16:41   ` [PATCH 2/5] drm/ttm: make the device list mutex static Christian König
  2018-10-19 16:41   ` [PATCH 3/5] drm/ttm: use a static ttm_bo_global instance Christian König
@ 2018-10-19 16:41   ` Christian König
       [not found]     ` <20181019164138.32993-4-christian.koenig-5C7GfCeVMHo@public.gmane.org>
  2018-10-19 16:41   ` [PATCH 5/5] drm: Remove drm_global.{c,h} v2 Christian König
  2018-10-23  6:22   ` [PATCH 1/5] drm/ttm: use a static ttm_mem_global instance Thomas Zimmermann
  4 siblings, 1 reply; 12+ messages in thread
From: Christian König @ 2018-10-19 16:41 UTC (permalink / raw)
  To: dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW,
	tzimmermann-l3A5Bk7waGM,
	amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW

Make sure that the global BO state is always correctly initialized.

This allows removing all the device code to initialize it.

Signed-off-by: Christian König <christian.koenig@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c         | 59 +------------------------
 drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h         |  1 -
 drivers/gpu/drm/ast/ast_drv.h                   |  1 -
 drivers/gpu/drm/ast/ast_ttm.c                   | 36 ---------------
 drivers/gpu/drm/bochs/bochs.h                   |  1 -
 drivers/gpu/drm/bochs/bochs_mm.c                | 35 ---------------
 drivers/gpu/drm/cirrus/cirrus_drv.h             |  1 -
 drivers/gpu/drm/cirrus/cirrus_ttm.c             | 36 ---------------
 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h |  1 -
 drivers/gpu/drm/hisilicon/hibmc/hibmc_ttm.c     | 34 --------------
 drivers/gpu/drm/mgag200/mgag200_drv.h           |  1 -
 drivers/gpu/drm/mgag200/mgag200_ttm.c           | 36 ---------------
 drivers/gpu/drm/nouveau/nouveau_drv.h           |  1 -
 drivers/gpu/drm/nouveau/nouveau_ttm.c           | 39 ----------------
 drivers/gpu/drm/qxl/qxl_drv.h                   |  2 -
 drivers/gpu/drm/qxl/qxl_ttm.c                   | 33 --------------
 drivers/gpu/drm/radeon/radeon.h                 |  2 -
 drivers/gpu/drm/radeon/radeon_ttm.c             | 39 ----------------
 drivers/gpu/drm/ttm/ttm_bo.c                    | 19 +++++---
 drivers/gpu/drm/virtio/virtgpu_drv.h            |  2 -
 drivers/gpu/drm/virtio/virtgpu_ttm.c            | 35 ---------------
 drivers/gpu/drm/vmwgfx/vmwgfx_drv.c             | 11 +----
 drivers/gpu/drm/vmwgfx/vmwgfx_drv.h             |  3 --
 drivers/gpu/drm/vmwgfx/vmwgfx_ttm_glue.c        | 27 -----------
 drivers/staging/vboxvideo/vbox_ttm.c            | 36 ---------------
 include/drm/ttm/ttm_bo_driver.h                 | 41 +----------------
 26 files changed, 16 insertions(+), 516 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
index fda252022b15..31fe85dd0b50 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
@@ -61,56 +61,6 @@ static int amdgpu_map_buffer(struct ttm_buffer_object *bo,
 static int amdgpu_ttm_debugfs_init(struct amdgpu_device *adev);
 static void amdgpu_ttm_debugfs_fini(struct amdgpu_device *adev);
 
-/*
- * Global memory.
- */
-
-/**
- * amdgpu_ttm_global_init - Initialize global TTM memory reference structures.
- *
- * @adev: AMDGPU device for which the global structures need to be registered.
- *
- * This is called as part of the AMDGPU ttm init from amdgpu_ttm_init()
- * during bring up.
- */
-static int amdgpu_ttm_global_init(struct amdgpu_device *adev)
-{
-	struct drm_global_reference *global_ref;
-	int r;
-
-	/* ensure reference is false in case init fails */
-	adev->mman.mem_global_referenced = false;
-
-	global_ref = &adev->mman.bo_global_ref.ref;
-	global_ref->global_type = DRM_GLOBAL_TTM_BO;
-	global_ref->size = sizeof(struct ttm_bo_global);
-	global_ref->init = &ttm_bo_global_ref_init;
-	global_ref->release = &ttm_bo_global_ref_release;
-	r = drm_global_item_ref(global_ref);
-	if (r) {
-		DRM_ERROR("Failed setting up TTM BO subsystem.\n");
-		goto error_bo;
-	}
-
-	mutex_init(&adev->mman.gtt_window_lock);
-
-	adev->mman.mem_global_referenced = true;
-
-	return 0;
-
-error_bo:
-	return r;
-}
-
-static void amdgpu_ttm_global_fini(struct amdgpu_device *adev)
-{
-	if (adev->mman.mem_global_referenced) {
-		mutex_destroy(&adev->mman.gtt_window_lock);
-		drm_global_item_unref(&adev->mman.bo_global_ref.ref);
-		adev->mman.mem_global_referenced = false;
-	}
-}
-
 static int amdgpu_invalidate_caches(struct ttm_bo_device *bdev, uint32_t flags)
 {
 	return 0;
@@ -1714,14 +1664,10 @@ int amdgpu_ttm_init(struct amdgpu_device *adev)
 	int r;
 	u64 vis_vram_limit;
 
-	/* initialize global references for vram/gtt */
-	r = amdgpu_ttm_global_init(adev);
-	if (r) {
-		return r;
-	}
+	mutex_init(&adev->mman.gtt_window_lock);
+
 	/* No others user of address space so set it to 0 */
 	r = ttm_bo_device_init(&adev->mman.bdev,
-			       adev->mman.bo_global_ref.ref.object,
 			       &amdgpu_bo_driver,
 			       adev->ddev->anon_inode->i_mapping,
 			       DRM_FILE_PAGE_OFFSET,
@@ -1878,7 +1824,6 @@ void amdgpu_ttm_fini(struct amdgpu_device *adev)
 	ttm_bo_clean_mm(&adev->mman.bdev, AMDGPU_PL_GWS);
 	ttm_bo_clean_mm(&adev->mman.bdev, AMDGPU_PL_OA);
 	ttm_bo_device_release(&adev->mman.bdev);
-	amdgpu_ttm_global_fini(adev);
 	adev->mman.initialized = false;
 	DRM_INFO("amdgpu: ttm finalized\n");
 }
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
index e114f209b701..b5b2d101f7db 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
@@ -39,7 +39,6 @@
 #define AMDGPU_GTT_NUM_TRANSFER_WINDOWS	2
 
 struct amdgpu_mman {
-	struct ttm_bo_global_ref        bo_global_ref;
 	struct ttm_bo_device		bdev;
 	bool				mem_global_referenced;
 	bool				initialized;
diff --git a/drivers/gpu/drm/ast/ast_drv.h b/drivers/gpu/drm/ast/ast_drv.h
index 6ae11a477643..bfc65040dfcb 100644
--- a/drivers/gpu/drm/ast/ast_drv.h
+++ b/drivers/gpu/drm/ast/ast_drv.h
@@ -104,7 +104,6 @@ struct ast_private {
 	int fb_mtrr;
 
 	struct {
-		struct ttm_bo_global_ref bo_global_ref;
 		struct ttm_bo_device bdev;
 	} ttm;
 
diff --git a/drivers/gpu/drm/ast/ast_ttm.c b/drivers/gpu/drm/ast/ast_ttm.c
index 8a59d6fc1160..c168d62fe8f9 100644
--- a/drivers/gpu/drm/ast/ast_ttm.c
+++ b/drivers/gpu/drm/ast/ast_ttm.c
@@ -36,35 +36,6 @@ ast_bdev(struct ttm_bo_device *bd)
 	return container_of(bd, struct ast_private, ttm.bdev);
 }
 
-static int ast_ttm_global_init(struct ast_private *ast)
-{
-	struct drm_global_reference *global_ref;
-	int r;
-
-	global_ref = &ast->ttm.bo_global_ref.ref;
-	global_ref->global_type = DRM_GLOBAL_TTM_BO;
-	global_ref->size = sizeof(struct ttm_bo_global);
-	global_ref->init = &ttm_bo_global_ref_init;
-	global_ref->release = &ttm_bo_global_ref_release;
-	r = drm_global_item_ref(global_ref);
-	if (r != 0) {
-		DRM_ERROR("Failed setting up TTM BO subsystem.\n");
-		return r;
-	}
-	return 0;
-}
-
-static void
-ast_ttm_global_release(struct ast_private *ast)
-{
-	if (ast->ttm.bo_global_ref.ref.release == NULL)
-		return;
-
-	drm_global_item_unref(&ast->ttm.bo_global_ref.ref);
-	ast->ttm.bo_global_ref.ref.release = NULL;
-}
-
-
 static void ast_bo_ttm_destroy(struct ttm_buffer_object *tbo)
 {
 	struct ast_bo *bo;
@@ -204,12 +175,7 @@ int ast_mm_init(struct ast_private *ast)
 	struct drm_device *dev = ast->dev;
 	struct ttm_bo_device *bdev = &ast->ttm.bdev;
 
-	ret = ast_ttm_global_init(ast);
-	if (ret)
-		return ret;
-
 	ret = ttm_bo_device_init(&ast->ttm.bdev,
-				 ast->ttm.bo_global_ref.ref.object,
 				 &ast_bo_driver,
 				 dev->anon_inode->i_mapping,
 				 DRM_FILE_PAGE_OFFSET,
@@ -240,8 +206,6 @@ void ast_mm_fini(struct ast_private *ast)
 
 	ttm_bo_device_release(&ast->ttm.bdev);
 
-	ast_ttm_global_release(ast);
-
 	arch_phys_wc_del(ast->fb_mtrr);
 	arch_io_free_memtype_wc(pci_resource_start(dev->pdev, 0),
 				pci_resource_len(dev->pdev, 0));
diff --git a/drivers/gpu/drm/bochs/bochs.h b/drivers/gpu/drm/bochs/bochs.h
index c7c2f85b28fa..b2f2eed1cbfb 100644
--- a/drivers/gpu/drm/bochs/bochs.h
+++ b/drivers/gpu/drm/bochs/bochs.h
@@ -80,7 +80,6 @@ struct bochs_device {
 
 	/* ttm */
 	struct {
-		struct ttm_bo_global_ref bo_global_ref;
 		struct ttm_bo_device bdev;
 		bool initialized;
 	} ttm;
diff --git a/drivers/gpu/drm/bochs/bochs_mm.c b/drivers/gpu/drm/bochs/bochs_mm.c
index 22fe13545992..c87937e0420c 100644
--- a/drivers/gpu/drm/bochs/bochs_mm.c
+++ b/drivers/gpu/drm/bochs/bochs_mm.c
@@ -16,35 +16,6 @@ static inline struct bochs_device *bochs_bdev(struct ttm_bo_device *bd)
 	return container_of(bd, struct bochs_device, ttm.bdev);
 }
 
-static int bochs_ttm_global_init(struct bochs_device *bochs)
-{
-	struct drm_global_reference *global_ref;
-	int r;
-
-	global_ref = &bochs->ttm.bo_global_ref.ref;
-	global_ref->global_type = DRM_GLOBAL_TTM_BO;
-	global_ref->size = sizeof(struct ttm_bo_global);
-	global_ref->init = &ttm_bo_global_ref_init;
-	global_ref->release = &ttm_bo_global_ref_release;
-	r = drm_global_item_ref(global_ref);
-	if (r != 0) {
-		DRM_ERROR("Failed setting up TTM BO subsystem.\n");
-		return r;
-	}
-
-	return 0;
-}
-
-static void bochs_ttm_global_release(struct bochs_device *bochs)
-{
-	if (bochs->ttm.bo_global_ref.ref.release == NULL)
-		return;
-
-	drm_global_item_unref(&bochs->ttm.bo_global_ref.ref);
-	bochs->ttm.bo_global_ref.ref.release = NULL;
-}
-
-
 static void bochs_bo_ttm_destroy(struct ttm_buffer_object *tbo)
 {
 	struct bochs_bo *bo;
@@ -182,12 +153,7 @@ int bochs_mm_init(struct bochs_device *bochs)
 	struct ttm_bo_device *bdev = &bochs->ttm.bdev;
 	int ret;
 
-	ret = bochs_ttm_global_init(bochs);
-	if (ret)
-		return ret;
-
 	ret = ttm_bo_device_init(&bochs->ttm.bdev,
-				 bochs->ttm.bo_global_ref.ref.object,
 				 &bochs_bo_driver,
 				 bochs->dev->anon_inode->i_mapping,
 				 DRM_FILE_PAGE_OFFSET,
@@ -214,7 +180,6 @@ void bochs_mm_fini(struct bochs_device *bochs)
 		return;
 
 	ttm_bo_device_release(&bochs->ttm.bdev);
-	bochs_ttm_global_release(bochs);
 	bochs->ttm.initialized = false;
 }
 
diff --git a/drivers/gpu/drm/cirrus/cirrus_drv.h b/drivers/gpu/drm/cirrus/cirrus_drv.h
index 1c784dc2ac17..ceb2e4081d19 100644
--- a/drivers/gpu/drm/cirrus/cirrus_drv.h
+++ b/drivers/gpu/drm/cirrus/cirrus_drv.h
@@ -136,7 +136,6 @@ struct cirrus_device {
 	int fb_mtrr;
 
 	struct {
-		struct ttm_bo_global_ref bo_global_ref;
 		struct ttm_bo_device bdev;
 	} ttm;
 	bool mm_inited;
diff --git a/drivers/gpu/drm/cirrus/cirrus_ttm.c b/drivers/gpu/drm/cirrus/cirrus_ttm.c
index 7801c56c3c9b..e075810b4bd4 100644
--- a/drivers/gpu/drm/cirrus/cirrus_ttm.c
+++ b/drivers/gpu/drm/cirrus/cirrus_ttm.c
@@ -36,35 +36,6 @@ cirrus_bdev(struct ttm_bo_device *bd)
 	return container_of(bd, struct cirrus_device, ttm.bdev);
 }
 
-static int cirrus_ttm_global_init(struct cirrus_device *cirrus)
-{
-	struct drm_global_reference *global_ref;
-	int r;
-
-	global_ref = &cirrus->ttm.bo_global_ref.ref;
-	global_ref->global_type = DRM_GLOBAL_TTM_BO;
-	global_ref->size = sizeof(struct ttm_bo_global);
-	global_ref->init = &ttm_bo_global_ref_init;
-	global_ref->release = &ttm_bo_global_ref_release;
-	r = drm_global_item_ref(global_ref);
-	if (r != 0) {
-		DRM_ERROR("Failed setting up TTM BO subsystem.\n");
-		return r;
-	}
-	return 0;
-}
-
-static void
-cirrus_ttm_global_release(struct cirrus_device *cirrus)
-{
-	if (cirrus->ttm.bo_global_ref.ref.release == NULL)
-		return;
-
-	drm_global_item_unref(&cirrus->ttm.bo_global_ref.ref);
-	cirrus->ttm.bo_global_ref.ref.release = NULL;
-}
-
-
 static void cirrus_bo_ttm_destroy(struct ttm_buffer_object *tbo)
 {
 	struct cirrus_bo *bo;
@@ -204,12 +175,7 @@ int cirrus_mm_init(struct cirrus_device *cirrus)
 	struct drm_device *dev = cirrus->dev;
 	struct ttm_bo_device *bdev = &cirrus->ttm.bdev;
 
-	ret = cirrus_ttm_global_init(cirrus);
-	if (ret)
-		return ret;
-
 	ret = ttm_bo_device_init(&cirrus->ttm.bdev,
-				 cirrus->ttm.bo_global_ref.ref.object,
 				 &cirrus_bo_driver,
 				 dev->anon_inode->i_mapping,
 				 DRM_FILE_PAGE_OFFSET,
@@ -245,8 +211,6 @@ void cirrus_mm_fini(struct cirrus_device *cirrus)
 
 	ttm_bo_device_release(&cirrus->ttm.bdev);
 
-	cirrus_ttm_global_release(cirrus);
-
 	arch_phys_wc_del(cirrus->fb_mtrr);
 	cirrus->fb_mtrr = 0;
 	arch_io_free_memtype_wc(pci_resource_start(dev->pdev, 0),
diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h
index a890546b666e..a04535bbcc08 100644
--- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h
+++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h
@@ -50,7 +50,6 @@ struct hibmc_drm_private {
 	struct drm_atomic_state *suspend_state;
 
 	/* ttm */
-	struct ttm_bo_global_ref bo_global_ref;
 	struct ttm_bo_device bdev;
 	bool initialized;
 
diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_ttm.c b/drivers/gpu/drm/hisilicon/hibmc/hibmc_ttm.c
index b15d60f1b1d1..d2a0dd04179d 100644
--- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_ttm.c
+++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_ttm.c
@@ -29,32 +29,6 @@ hibmc_bdev(struct ttm_bo_device *bd)
 	return container_of(bd, struct hibmc_drm_private, bdev);
 }
 
-static int hibmc_ttm_global_init(struct hibmc_drm_private *hibmc)
-{
-	int ret;
-
-	hibmc->bo_global_ref.ref.global_type = DRM_GLOBAL_TTM_BO;
-	hibmc->bo_global_ref.ref.size = sizeof(struct ttm_bo_global);
-	hibmc->bo_global_ref.ref.init = &ttm_bo_global_ref_init;
-	hibmc->bo_global_ref.ref.release = &ttm_bo_global_ref_release;
-	ret = drm_global_item_ref(&hibmc->bo_global_ref.ref);
-	if (ret) {
-		DRM_ERROR("failed setting up TTM BO subsystem: %d\n", ret);
-		return ret;
-	}
-	return 0;
-}
-
-static void
-hibmc_ttm_global_release(struct hibmc_drm_private *hibmc)
-{
-	if (hibmc->bo_global_ref.ref.release == NULL)
-		return;
-
-	drm_global_item_unref(&hibmc->bo_global_ref.ref);
-	hibmc->bo_global_ref.ref.release = NULL;
-}
-
 static void hibmc_bo_ttm_destroy(struct ttm_buffer_object *tbo)
 {
 	struct hibmc_bo *bo = container_of(tbo, struct hibmc_bo, bo);
@@ -214,18 +188,12 @@ int hibmc_mm_init(struct hibmc_drm_private *hibmc)
 	struct drm_device *dev = hibmc->dev;
 	struct ttm_bo_device *bdev = &hibmc->bdev;
 
-	ret = hibmc_ttm_global_init(hibmc);
-	if (ret)
-		return ret;
-
 	ret = ttm_bo_device_init(&hibmc->bdev,
-				 hibmc->bo_global_ref.ref.object,
 				 &hibmc_bo_driver,
 				 dev->anon_inode->i_mapping,
 				 DRM_FILE_PAGE_OFFSET,
 				 true);
 	if (ret) {
-		hibmc_ttm_global_release(hibmc);
 		DRM_ERROR("error initializing bo driver: %d\n", ret);
 		return ret;
 	}
@@ -233,7 +201,6 @@ int hibmc_mm_init(struct hibmc_drm_private *hibmc)
 	ret = ttm_bo_init_mm(bdev, TTM_PL_VRAM,
 			     hibmc->fb_size >> PAGE_SHIFT);
 	if (ret) {
-		hibmc_ttm_global_release(hibmc);
 		DRM_ERROR("failed ttm VRAM init: %d\n", ret);
 		return ret;
 	}
@@ -248,7 +215,6 @@ void hibmc_mm_fini(struct hibmc_drm_private *hibmc)
 		return;
 
 	ttm_bo_device_release(&hibmc->bdev);
-	hibmc_ttm_global_release(hibmc);
 	hibmc->mm_inited = false;
 }
 
diff --git a/drivers/gpu/drm/mgag200/mgag200_drv.h b/drivers/gpu/drm/mgag200/mgag200_drv.h
index e5348955a3cc..0aaedc554879 100644
--- a/drivers/gpu/drm/mgag200/mgag200_drv.h
+++ b/drivers/gpu/drm/mgag200/mgag200_drv.h
@@ -212,7 +212,6 @@ struct mga_device {
 	int fb_mtrr;
 
 	struct {
-		struct ttm_bo_global_ref bo_global_ref;
 		struct ttm_bo_device bdev;
 	} ttm;
 
diff --git a/drivers/gpu/drm/mgag200/mgag200_ttm.c b/drivers/gpu/drm/mgag200/mgag200_ttm.c
index 11bdc8121a7d..d96a9b32455e 100644
--- a/drivers/gpu/drm/mgag200/mgag200_ttm.c
+++ b/drivers/gpu/drm/mgag200/mgag200_ttm.c
@@ -36,35 +36,6 @@ mgag200_bdev(struct ttm_bo_device *bd)
 	return container_of(bd, struct mga_device, ttm.bdev);
 }
 
-static int mgag200_ttm_global_init(struct mga_device *ast)
-{
-	struct drm_global_reference *global_ref;
-	int r;
-
-	global_ref = &ast->ttm.bo_global_ref.ref;
-	global_ref->global_type = DRM_GLOBAL_TTM_BO;
-	global_ref->size = sizeof(struct ttm_bo_global);
-	global_ref->init = &ttm_bo_global_ref_init;
-	global_ref->release = &ttm_bo_global_ref_release;
-	r = drm_global_item_ref(global_ref);
-	if (r != 0) {
-		DRM_ERROR("Failed setting up TTM BO subsystem.\n");
-		return r;
-	}
-	return 0;
-}
-
-static void
-mgag200_ttm_global_release(struct mga_device *ast)
-{
-	if (ast->ttm.bo_global_ref.ref.release == NULL)
-		return;
-
-	drm_global_item_unref(&ast->ttm.bo_global_ref.ref);
-	ast->ttm.bo_global_ref.ref.release = NULL;
-}
-
-
 static void mgag200_bo_ttm_destroy(struct ttm_buffer_object *tbo)
 {
 	struct mgag200_bo *bo;
@@ -204,12 +175,7 @@ int mgag200_mm_init(struct mga_device *mdev)
 	struct drm_device *dev = mdev->dev;
 	struct ttm_bo_device *bdev = &mdev->ttm.bdev;
 
-	ret = mgag200_ttm_global_init(mdev);
-	if (ret)
-		return ret;
-
 	ret = ttm_bo_device_init(&mdev->ttm.bdev,
-				 mdev->ttm.bo_global_ref.ref.object,
 				 &mgag200_bo_driver,
 				 dev->anon_inode->i_mapping,
 				 DRM_FILE_PAGE_OFFSET,
@@ -240,8 +206,6 @@ void mgag200_mm_fini(struct mga_device *mdev)
 
 	ttm_bo_device_release(&mdev->ttm.bdev);
 
-	mgag200_ttm_global_release(mdev);
-
 	arch_io_free_memtype_wc(pci_resource_start(dev->pdev, 0),
 				pci_resource_len(dev->pdev, 0));
 	arch_phys_wc_del(mdev->fb_mtrr);
diff --git a/drivers/gpu/drm/nouveau/nouveau_drv.h b/drivers/gpu/drm/nouveau/nouveau_drv.h
index 937b8e61f654..37d79b2fa3a8 100644
--- a/drivers/gpu/drm/nouveau/nouveau_drv.h
+++ b/drivers/gpu/drm/nouveau/nouveau_drv.h
@@ -146,7 +146,6 @@ struct nouveau_drm {
 
 	/* TTM interface support */
 	struct {
-		struct ttm_bo_global_ref bo_global_ref;
 		struct ttm_bo_device bdev;
 		atomic_t validate_sequence;
 		int (*move)(struct nouveau_channel *,
diff --git a/drivers/gpu/drm/nouveau/nouveau_ttm.c b/drivers/gpu/drm/nouveau/nouveau_ttm.c
index 69448b02649e..1543c2f8d3d3 100644
--- a/drivers/gpu/drm/nouveau/nouveau_ttm.c
+++ b/drivers/gpu/drm/nouveau/nouveau_ttm.c
@@ -174,38 +174,6 @@ nouveau_ttm_mmap(struct file *filp, struct vm_area_struct *vma)
 	return ttm_bo_mmap(filp, vma, &drm->ttm.bdev);
 }
 
-int
-nouveau_ttm_global_init(struct nouveau_drm *drm)
-{
-	struct drm_global_reference *global_ref;
-	int ret;
-
-	global_ref = &drm->ttm.bo_global_ref.ref;
-	global_ref->global_type = DRM_GLOBAL_TTM_BO;
-	global_ref->size = sizeof(struct ttm_bo_global);
-	global_ref->init = &ttm_bo_global_ref_init;
-	global_ref->release = &ttm_bo_global_ref_release;
-
-	ret = drm_global_item_ref(global_ref);
-	if (unlikely(ret != 0)) {
-		DRM_ERROR("Failed setting up TTM BO subsystem\n");
-		drm->ttm.bo_global_ref.ref.release = NULL;
-		return ret;
-	}
-
-	return 0;
-}
-
-void
-nouveau_ttm_global_release(struct nouveau_drm *drm)
-{
-	if (drm->ttm.bo_global_ref.ref.release == NULL)
-		return;
-
-	drm_global_item_unref(&drm->ttm.bo_global_ref.ref);
-	drm->ttm.bo_global_ref.ref.release = NULL;
-}
-
 static int
 nouveau_ttm_init_host(struct nouveau_drm *drm, u8 kind)
 {
@@ -268,12 +236,7 @@ nouveau_ttm_init(struct nouveau_drm *drm)
 		drm->agp.cma = pci->agp.cma;
 	}
 
-	ret = nouveau_ttm_global_init(drm);
-	if (ret)
-		return ret;
-
 	ret = ttm_bo_device_init(&drm->ttm.bdev,
-				  drm->ttm.bo_global_ref.ref.object,
 				  &nouveau_bo_driver,
 				  dev->anon_inode->i_mapping,
 				  DRM_FILE_PAGE_OFFSET,
@@ -328,8 +291,6 @@ nouveau_ttm_fini(struct nouveau_drm *drm)
 
 	ttm_bo_device_release(&drm->ttm.bdev);
 
-	nouveau_ttm_global_release(drm);
-
 	arch_phys_wc_del(drm->ttm.mtrr);
 	drm->ttm.mtrr = 0;
 	arch_io_free_memtype_wc(device->func->resource_addr(device, 1),
diff --git a/drivers/gpu/drm/qxl/qxl_drv.h b/drivers/gpu/drm/qxl/qxl_drv.h
index b2c1cef0005a..61c7fa7efd40 100644
--- a/drivers/gpu/drm/qxl/qxl_drv.h
+++ b/drivers/gpu/drm/qxl/qxl_drv.h
@@ -132,8 +132,6 @@ struct qxl_framebuffer {
 #define to_qxl_framebuffer(x) container_of(x, struct qxl_framebuffer, base)
 
 struct qxl_mman {
-	struct ttm_bo_global_ref        bo_global_ref;
-	bool				mem_global_referenced;
 	struct ttm_bo_device		bdev;
 };
 
diff --git a/drivers/gpu/drm/qxl/qxl_ttm.c b/drivers/gpu/drm/qxl/qxl_ttm.c
index bb8cc9b16780..1468fddc19d0 100644
--- a/drivers/gpu/drm/qxl/qxl_ttm.c
+++ b/drivers/gpu/drm/qxl/qxl_ttm.c
@@ -46,34 +46,6 @@ static struct qxl_device *qxl_get_qdev(struct ttm_bo_device *bdev)
 	return qdev;
 }
 
-static int qxl_ttm_global_init(struct qxl_device *qdev)
-{
-	struct drm_global_reference *global_ref;
-	int r;
-
-	global_ref = &qdev->mman.bo_global_ref.ref;
-	global_ref->global_type = DRM_GLOBAL_TTM_BO;
-	global_ref->size = sizeof(struct ttm_bo_global);
-	global_ref->init = &ttm_bo_global_ref_init;
-	global_ref->release = &ttm_bo_global_ref_release;
-	r = drm_global_item_ref(global_ref);
-	if (r != 0) {
-		DRM_ERROR("Failed setting up TTM BO subsystem.\n");
-		return r;
-	}
-
-	qdev->mman.mem_global_referenced = true;
-	return 0;
-}
-
-static void qxl_ttm_global_fini(struct qxl_device *qdev)
-{
-	if (qdev->mman.mem_global_referenced) {
-		drm_global_item_unref(&qdev->mman.bo_global_ref.ref);
-		qdev->mman.mem_global_referenced = false;
-	}
-}
-
 static struct vm_operations_struct qxl_ttm_vm_ops;
 static const struct vm_operations_struct *ttm_vm_ops;
 
@@ -345,12 +317,8 @@ int qxl_ttm_init(struct qxl_device *qdev)
 	int r;
 	int num_io_pages; /* != rom->num_io_pages, we include surface0 */
 
-	r = qxl_ttm_global_init(qdev);
-	if (r)
-		return r;
 	/* No others user of address space so set it to 0 */
 	r = ttm_bo_device_init(&qdev->mman.bdev,
-			       qdev->mman.bo_global_ref.ref.object,
 			       &qxl_bo_driver,
 			       qdev->ddev.anon_inode->i_mapping,
 			       DRM_FILE_PAGE_OFFSET, 0);
@@ -386,7 +354,6 @@ void qxl_ttm_fini(struct qxl_device *qdev)
 	ttm_bo_clean_mm(&qdev->mman.bdev, TTM_PL_VRAM);
 	ttm_bo_clean_mm(&qdev->mman.bdev, TTM_PL_PRIV);
 	ttm_bo_device_release(&qdev->mman.bdev);
-	qxl_ttm_global_fini(qdev);
 	DRM_INFO("qxl: ttm finalized\n");
 }
 
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index 06fb952b6290..32808e50be12 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -448,9 +448,7 @@ struct radeon_surface_reg {
  * TTM.
  */
 struct radeon_mman {
-	struct ttm_bo_global_ref        bo_global_ref;
 	struct ttm_bo_device		bdev;
-	bool				mem_global_referenced;
 	bool				initialized;
 
 #if defined(CONFIG_DEBUG_FS)
diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c
index 2104429ddbac..9920a6fc11bf 100644
--- a/drivers/gpu/drm/radeon/radeon_ttm.c
+++ b/drivers/gpu/drm/radeon/radeon_ttm.c
@@ -60,39 +60,6 @@ static struct radeon_device *radeon_get_rdev(struct ttm_bo_device *bdev)
 	return rdev;
 }
 
-
-/*
- * Global memory.
- */
-static int radeon_ttm_global_init(struct radeon_device *rdev)
-{
-	struct drm_global_reference *global_ref;
-	int r;
-
-	rdev->mman.mem_global_referenced = false;
-	global_ref = &rdev->mman.bo_global_ref.ref;
-	global_ref->global_type = DRM_GLOBAL_TTM_BO;
-	global_ref->size = sizeof(struct ttm_bo_global);
-	global_ref->init = &ttm_bo_global_ref_init;
-	global_ref->release = &ttm_bo_global_ref_release;
-	r = drm_global_item_ref(global_ref);
-	if (r != 0) {
-		DRM_ERROR("Failed setting up TTM BO subsystem.\n");
-		return r;
-	}
-
-	rdev->mman.mem_global_referenced = true;
-	return 0;
-}
-
-static void radeon_ttm_global_fini(struct radeon_device *rdev)
-{
-	if (rdev->mman.mem_global_referenced) {
-		drm_global_item_unref(&rdev->mman.bo_global_ref.ref);
-		rdev->mman.mem_global_referenced = false;
-	}
-}
-
 static int radeon_invalidate_caches(struct ttm_bo_device *bdev, uint32_t flags)
 {
 	return 0;
@@ -821,13 +788,8 @@ int radeon_ttm_init(struct radeon_device *rdev)
 {
 	int r;
 
-	r = radeon_ttm_global_init(rdev);
-	if (r) {
-		return r;
-	}
 	/* No others user of address space so set it to 0 */
 	r = ttm_bo_device_init(&rdev->mman.bdev,
-			       rdev->mman.bo_global_ref.ref.object,
 			       &radeon_bo_driver,
 			       rdev->ddev->anon_inode->i_mapping,
 			       DRM_FILE_PAGE_OFFSET,
@@ -899,7 +861,6 @@ void radeon_ttm_fini(struct radeon_device *rdev)
 	ttm_bo_clean_mm(&rdev->mman.bdev, TTM_PL_TT);
 	ttm_bo_device_release(&rdev->mman.bdev);
 	radeon_gart_fini(rdev);
-	radeon_ttm_global_fini(rdev);
 	rdev->mman.initialized = false;
 	DRM_INFO("radeon: ttm finalized\n");
 }
diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c
index d89183f95570..df028805b7e2 100644
--- a/drivers/gpu/drm/ttm/ttm_bo.c
+++ b/drivers/gpu/drm/ttm/ttm_bo.c
@@ -1530,7 +1530,7 @@ static void ttm_bo_global_kobj_release(struct kobject *kobj)
 	kfree(glob);
 }
 
-void ttm_bo_global_release(void)
+static void ttm_bo_global_release(void)
 {
 	struct ttm_bo_global *glob = &ttm_bo_glob;
 
@@ -1544,9 +1544,8 @@ void ttm_bo_global_release(void)
 out:
 	mutex_unlock(&ttm_global_mutex);
 }
-EXPORT_SYMBOL(ttm_bo_global_release);
 
-int ttm_bo_global_init(void)
+static int ttm_bo_global_init(void)
 {
 	struct ttm_bo_global *glob = &ttm_bo_glob;
 	int ret = 0;
@@ -1583,8 +1582,6 @@ int ttm_bo_global_init(void)
 	mutex_unlock(&ttm_global_mutex);
 	return ret;
 }
-EXPORT_SYMBOL(ttm_bo_global_init);
-
 
 int ttm_bo_device_release(struct ttm_bo_device *bdev)
 {
@@ -1623,18 +1620,25 @@ int ttm_bo_device_release(struct ttm_bo_device *bdev)
 
 	drm_vma_offset_manager_destroy(&bdev->vma_manager);
 
+	if (!ret)
+		ttm_bo_global_release();
+
 	return ret;
 }
 EXPORT_SYMBOL(ttm_bo_device_release);
 
 int ttm_bo_device_init(struct ttm_bo_device *bdev,
-		       struct ttm_bo_global *glob,
 		       struct ttm_bo_driver *driver,
 		       struct address_space *mapping,
 		       uint64_t file_page_offset,
 		       bool need_dma32)
 {
-	int ret = -EINVAL;
+	struct ttm_bo_global *glob = &ttm_bo_glob;
+	int ret;
+
+	ret = ttm_bo_global_init();
+	if (ret)
+		return ret;
 
 	bdev->driver = driver;
 
@@ -1661,6 +1665,7 @@ int ttm_bo_device_init(struct ttm_bo_device *bdev,
 
 	return 0;
 out_no_sys:
+	ttm_bo_global_release();
 	return ret;
 }
 EXPORT_SYMBOL(ttm_bo_device_init);
diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.h b/drivers/gpu/drm/virtio/virtgpu_drv.h
index dec42d421e00..30caa20d9fcf 100644
--- a/drivers/gpu/drm/virtio/virtgpu_drv.h
+++ b/drivers/gpu/drm/virtio/virtgpu_drv.h
@@ -132,8 +132,6 @@ struct virtio_gpu_framebuffer {
 	container_of(x, struct virtio_gpu_framebuffer, base)
 
 struct virtio_gpu_mman {
-	struct ttm_bo_global_ref        bo_global_ref;
-	bool				mem_global_referenced;
 	struct ttm_bo_device		bdev;
 };
 
diff --git a/drivers/gpu/drm/virtio/virtgpu_ttm.c b/drivers/gpu/drm/virtio/virtgpu_ttm.c
index b99ecc6d97d3..c1a56d640121 100644
--- a/drivers/gpu/drm/virtio/virtgpu_ttm.c
+++ b/drivers/gpu/drm/virtio/virtgpu_ttm.c
@@ -50,35 +50,6 @@ virtio_gpu_device *virtio_gpu_get_vgdev(struct ttm_bo_device *bdev)
 	return vgdev;
 }
 
-static int virtio_gpu_ttm_global_init(struct virtio_gpu_device *vgdev)
-{
-	struct drm_global_reference *global_ref;
-	int r;
-
-	vgdev->mman.mem_global_referenced = false;
-	global_ref = &vgdev->mman.bo_global_ref.ref;
-	global_ref->global_type = DRM_GLOBAL_TTM_BO;
-	global_ref->size = sizeof(struct ttm_bo_global);
-	global_ref->init = &ttm_bo_global_ref_init;
-	global_ref->release = &ttm_bo_global_ref_release;
-	r = drm_global_item_ref(global_ref);
-	if (r != 0) {
-		DRM_ERROR("Failed setting up TTM BO subsystem.\n");
-		return r;
-	}
-
-	vgdev->mman.mem_global_referenced = true;
-	return 0;
-}
-
-static void virtio_gpu_ttm_global_fini(struct virtio_gpu_device *vgdev)
-{
-	if (vgdev->mman.mem_global_referenced) {
-		drm_global_item_unref(&vgdev->mman.bo_global_ref.ref);
-		vgdev->mman.mem_global_referenced = false;
-	}
-}
-
 #if 0
 /*
  * Hmm, seems to not do anything useful.  Leftover debug hack?
@@ -391,12 +362,8 @@ int virtio_gpu_ttm_init(struct virtio_gpu_device *vgdev)
 {
 	int r;
 
-	r = virtio_gpu_ttm_global_init(vgdev);
-	if (r)
-		return r;
 	/* No others user of address space so set it to 0 */
 	r = ttm_bo_device_init(&vgdev->mman.bdev,
-			       vgdev->mman.bo_global_ref.ref.object,
 			       &virtio_gpu_bo_driver,
 			       vgdev->ddev->anon_inode->i_mapping,
 			       DRM_FILE_PAGE_OFFSET, 0);
@@ -415,13 +382,11 @@ int virtio_gpu_ttm_init(struct virtio_gpu_device *vgdev)
 err_mm_init:
 	ttm_bo_device_release(&vgdev->mman.bdev);
 err_dev_init:
-	virtio_gpu_ttm_global_fini(vgdev);
 	return r;
 }
 
 void virtio_gpu_ttm_fini(struct virtio_gpu_device *vgdev)
 {
 	ttm_bo_device_release(&vgdev->mman.bdev);
-	virtio_gpu_ttm_global_fini(vgdev);
 	DRM_INFO("virtio_gpu: ttm finalized\n");
 }
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
index 57df776d987c..29da63a0a0f2 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
@@ -801,11 +801,6 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
 	DRM_INFO("MMIO at 0x%08x size is %u kiB\n",
 		 dev_priv->mmio_start, dev_priv->mmio_size / 1024);
 
-	ret = vmw_ttm_global_init(dev_priv);
-	if (unlikely(ret != 0))
-		goto out_err0;
-
-
 	vmw_master_init(&dev_priv->fbdev_master);
 	ttm_lock_set_kill(&dev_priv->fbdev_master.lock, false, SIGTERM);
 	dev_priv->active_master = &dev_priv->fbdev_master;
@@ -816,7 +811,7 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
 	if (unlikely(dev_priv->mmio_virt == NULL)) {
 		ret = -ENOMEM;
 		DRM_ERROR("Failed mapping MMIO.\n");
-		goto out_err3;
+		goto out_err0;
 	}
 
 	/* Need mmio memory to check for fifo pitchlock cap. */
@@ -870,7 +865,6 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
 	}
 
 	ret = ttm_bo_device_init(&dev_priv->bdev,
-				 dev_priv->bo_global_ref.ref.object,
 				 &vmw_bo_driver,
 				 dev->anon_inode->i_mapping,
 				 VMWGFX_FILE_PAGE_OFFSET,
@@ -992,8 +986,6 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
 	ttm_object_device_release(&dev_priv->tdev);
 out_err4:
 	memunmap(dev_priv->mmio_virt);
-out_err3:
-	vmw_ttm_global_release(dev_priv);
 out_err0:
 	for (i = vmw_res_context; i < vmw_res_max; ++i)
 		idr_destroy(&dev_priv->res_idr[i]);
@@ -1045,7 +1037,6 @@ static void vmw_driver_unload(struct drm_device *dev)
 	memunmap(dev_priv->mmio_virt);
 	if (dev_priv->ctx.staged_bindings)
 		vmw_binding_state_free(dev_priv->ctx.staged_bindings);
-	vmw_ttm_global_release(dev_priv);
 
 	for (i = vmw_res_context; i < vmw_res_max; ++i)
 		idr_destroy(&dev_priv->res_idr[i]);
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
index df15a745efc3..a23f1c1fd4c9 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
@@ -365,7 +365,6 @@ enum {
 
 struct vmw_private {
 	struct ttm_bo_device bdev;
-	struct ttm_bo_global_ref bo_global_ref;
 
 	struct vmw_fifo_state fifo;
 
@@ -762,8 +761,6 @@ extern int vmw_fifo_flush(struct vmw_private *dev_priv,
  * TTM glue - vmwgfx_ttm_glue.c
  */
 
-extern int vmw_ttm_global_init(struct vmw_private *dev_priv);
-extern void vmw_ttm_global_release(struct vmw_private *dev_priv);
 extern int vmw_mmap(struct file *filp, struct vm_area_struct *vma);
 
 /**
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_glue.c b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_glue.c
index 0ac473cd5136..154eb09aa91e 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_glue.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_glue.c
@@ -42,30 +42,3 @@ int vmw_mmap(struct file *filp, struct vm_area_struct *vma)
 	dev_priv = vmw_priv(file_priv->minor->dev);
 	return ttm_bo_mmap(filp, vma, &dev_priv->bdev);
 }
-
-int vmw_ttm_global_init(struct vmw_private *dev_priv)
-{
-	struct drm_global_reference *global_ref;
-	int ret;
-
-	global_ref = &dev_priv->bo_global_ref.ref;
-	global_ref->global_type = DRM_GLOBAL_TTM_BO;
-	global_ref->size = sizeof(struct ttm_bo_global);
-	global_ref->init = &ttm_bo_global_ref_init;
-	global_ref->release = &ttm_bo_global_ref_release;
-	ret = drm_global_item_ref(global_ref);
-
-	if (unlikely(ret != 0)) {
-		DRM_ERROR("Failed setting up TTM buffer objects.\n");
-		goto out_no_bo;
-	}
-
-	return 0;
-out_no_bo:
-	return ret;
-}
-
-void vmw_ttm_global_release(struct vmw_private *dev_priv)
-{
-	drm_global_item_unref(&dev_priv->bo_global_ref.ref);
-}
diff --git a/drivers/staging/vboxvideo/vbox_ttm.c b/drivers/staging/vboxvideo/vbox_ttm.c
index 88cdacf2b0f0..6c8ba8625ad9 100644
--- a/drivers/staging/vboxvideo/vbox_ttm.c
+++ b/drivers/staging/vboxvideo/vbox_ttm.c
@@ -35,37 +35,6 @@ static inline struct vbox_private *vbox_bdev(struct ttm_bo_device *bd)
 	return container_of(bd, struct vbox_private, ttm.bdev);
 }
 
-/**
- * Adds the vbox memory manager object/structures to the global memory manager.
- */
-static int vbox_ttm_global_init(struct vbox_private *vbox)
-{
-	struct drm_global_reference *global_ref;
-	int ret;
-
-	global_ref = &vbox->ttm.bo_global_ref.ref;
-	global_ref->global_type = DRM_GLOBAL_TTM_BO;
-	global_ref->size = sizeof(struct ttm_bo_global);
-	global_ref->init = &ttm_bo_global_ref_init;
-	global_ref->release = &ttm_bo_global_ref_release;
-
-	ret = drm_global_item_ref(global_ref);
-	if (ret) {
-		DRM_ERROR("Failed setting up TTM BO subsystem.\n");
-		return ret;
-	}
-
-	return 0;
-}
-
-/**
- * Removes the vbox memory manager object from the global memory manager.
- */
-static void vbox_ttm_global_release(struct vbox_private *vbox)
-{
-	drm_global_item_unref(&vbox->ttm.bo_global_ref.ref);
-}
-
 static void vbox_bo_ttm_destroy(struct ttm_buffer_object *tbo)
 {
 	struct vbox_bo *bo;
@@ -203,12 +172,7 @@ int vbox_mm_init(struct vbox_private *vbox)
 	struct drm_device *dev = vbox->dev;
 	struct ttm_bo_device *bdev = &vbox->ttm.bdev;
 
-	ret = vbox_ttm_global_init(vbox);
-	if (ret)
-		return ret;
-
 	ret = ttm_bo_device_init(&vbox->ttm.bdev,
-				 vbox->ttm.bo_global_ref.ref.object,
 				 &vbox_bo_driver,
 				 dev->anon_inode->i_mapping,
 				 DRM_FILE_PAGE_OFFSET, true);
diff --git a/include/drm/ttm/ttm_bo_driver.h b/include/drm/ttm/ttm_bo_driver.h
index 26be74939f10..6fb589f64633 100644
--- a/include/drm/ttm/ttm_bo_driver.h
+++ b/include/drm/ttm/ttm_bo_driver.h
@@ -569,9 +569,6 @@ void ttm_bo_mem_put(struct ttm_buffer_object *bo, struct ttm_mem_reg *mem);
 void ttm_bo_mem_put_locked(struct ttm_buffer_object *bo,
 			   struct ttm_mem_reg *mem);
 
-void ttm_bo_global_release(void);
-int ttm_bo_global_init(void);
-
 int ttm_bo_device_release(struct ttm_bo_device *bdev);
 
 /**
@@ -589,7 +586,7 @@ int ttm_bo_device_release(struct ttm_bo_device *bdev);
  * Returns:
  * !0: Failure.
  */
-int ttm_bo_device_init(struct ttm_bo_device *bdev, struct ttm_bo_global *glob,
+int ttm_bo_device_init(struct ttm_bo_device *bdev,
 		       struct ttm_bo_driver *driver,
 		       struct address_space *mapping,
 		       uint64_t file_page_offset, bool need_dma32);
@@ -888,40 +885,4 @@ pgprot_t ttm_io_prot(uint32_t caching_flags, pgprot_t tmp);
 
 extern const struct ttm_mem_type_manager_func ttm_bo_manager_func;
 
-/**
- * struct ttm_bo_global_ref - Argument to initialize a struct ttm_bo_global.
- */
-
-struct ttm_bo_global_ref {
-	struct drm_global_reference ref;
-};
-
-/**
- * ttm_bo_global_ref_init
- *
- * @ref: DRM global reference
- *
- * Helper function that initializes a struct ttm_bo_global. This function
- * is used as init call-back function for DRM global references of type
- * DRM_GLOBAL_TTM_BO_REF.
- */
-static inline int ttm_bo_global_ref_init(struct drm_global_reference *ref)
-{
-	return ttm_bo_global_init();
-}
-
-/**
- * ttm_bo_global_ref_release
- *
- * @ref: DRM global reference
- *
- * Helper function that releases a struct ttm_bo_global. This function
- * is used as release call-back function for DRM global references of type
- * DRM_GLOBAL_TTM_BO_REF.
- */
-static inline void ttm_bo_global_ref_release(struct drm_global_reference *ref)
-{
-	ttm_bo_global_release();
-}
-
 #endif
-- 
2.14.1

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 5/5] drm: Remove drm_global.{c,h} v2
       [not found] ` <20181019164138.32993-1-christian.koenig-5C7GfCeVMHo@public.gmane.org>
                     ` (2 preceding siblings ...)
  2018-10-19 16:41   ` [PATCH 4/5] drm/ttm: initialize globals during device init Christian König
@ 2018-10-19 16:41   ` Christian König
  2018-10-23  6:22   ` [PATCH 1/5] drm/ttm: use a static ttm_mem_global instance Thomas Zimmermann
  4 siblings, 0 replies; 12+ messages in thread
From: Christian König @ 2018-10-19 16:41 UTC (permalink / raw)
  To: dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW,
	tzimmermann-l3A5Bk7waGM,
	amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW

From: Thomas Zimmermann <tzimmermann@suse.de>

The content of drm_global.{c,h} is obsolete.

v2: rebase on dropping TTM functionality

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Signed-off-by: Christian König <christian.koenig@amd.com>
---
 drivers/gpu/drm/Makefile         |   2 +-
 drivers/gpu/drm/drm_drv.c        |   2 -
 drivers/gpu/drm/drm_global.c     | 137 ---------------------------------------
 drivers/gpu/drm/gma500/psb_drv.h |   1 -
 include/drm/drmP.h               |   1 -
 include/drm/drm_global.h         |  53 ---------------
 include/drm/ttm/ttm_bo_driver.h  |   1 -
 7 files changed, 1 insertion(+), 196 deletions(-)
 delete mode 100644 drivers/gpu/drm/drm_global.c
 delete mode 100644 include/drm/drm_global.h

diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile
index a6771cef85e2..edc846470eaa 100644
--- a/drivers/gpu/drm/Makefile
+++ b/drivers/gpu/drm/Makefile
@@ -11,7 +11,7 @@ drm-y       :=	drm_auth.o drm_bufs.o drm_cache.o \
 		drm_sysfs.o drm_hashtab.o drm_mm.o \
 		drm_crtc.o drm_fourcc.o drm_modes.o drm_edid.o \
 		drm_info.o drm_encoder_slave.o \
-		drm_trace_points.o drm_global.o drm_prime.o \
+		drm_trace_points.o drm_prime.o \
 		drm_rect.o drm_vma_manager.o drm_flip_work.o \
 		drm_modeset_lock.o drm_atomic.o drm_bridge.o \
 		drm_framebuffer.o drm_connector.o drm_blend.o \
diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c
index ea4941da9b27..9e6f0ee5ccad 100644
--- a/drivers/gpu/drm/drm_drv.c
+++ b/drivers/gpu/drm/drm_drv.c
@@ -972,14 +972,12 @@ static void drm_core_exit(void)
 	drm_sysfs_destroy();
 	idr_destroy(&drm_minors_idr);
 	drm_connector_ida_destroy();
-	drm_global_release();
 }
 
 static int __init drm_core_init(void)
 {
 	int ret;
 
-	drm_global_init();
 	drm_connector_ida_init();
 	idr_init(&drm_minors_idr);
 
diff --git a/drivers/gpu/drm/drm_global.c b/drivers/gpu/drm/drm_global.c
deleted file mode 100644
index 5799e2782dd1..000000000000
--- a/drivers/gpu/drm/drm_global.c
+++ /dev/null
@@ -1,137 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0 OR MIT
-/**************************************************************************
- *
- * Copyright 2008-2009 VMware, Inc., Palo Alto, CA., USA
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
- * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
- * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
- * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
- * USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- **************************************************************************/
-/*
- * Authors: Thomas Hellstrom <thellstrom-at-vmware-dot-com>
- */
-
-#include <linux/mutex.h>
-#include <linux/slab.h>
-#include <linux/module.h>
-#include <drm/drm_global.h>
-
-struct drm_global_item {
-	struct mutex mutex;
-	void *object;
-	int refcount;
-};
-
-static struct drm_global_item glob[DRM_GLOBAL_NUM];
-
-void drm_global_init(void)
-{
-	int i;
-
-	for (i = 0; i < DRM_GLOBAL_NUM; ++i) {
-		struct drm_global_item *item = &glob[i];
-		mutex_init(&item->mutex);
-		item->object = NULL;
-		item->refcount = 0;
-	}
-}
-
-void drm_global_release(void)
-{
-	int i;
-	for (i = 0; i < DRM_GLOBAL_NUM; ++i) {
-		struct drm_global_item *item = &glob[i];
-		BUG_ON(item->object != NULL);
-		BUG_ON(item->refcount != 0);
-	}
-}
-
-/**
- * drm_global_item_ref - Initialize and acquire reference to memory
- * object
- * @ref: Object for initialization
- *
- * This initializes a memory object, allocating memory and calling the
- * .init() hook. Further calls will increase the reference count for
- * that item.
- *
- * Returns:
- * Zero on success, non-zero otherwise.
- */
-int drm_global_item_ref(struct drm_global_reference *ref)
-{
-	int ret = 0;
-	struct drm_global_item *item = &glob[ref->global_type];
-
-	mutex_lock(&item->mutex);
-	if (item->refcount == 0) {
-		ref->object = kzalloc(ref->size, GFP_KERNEL);
-		if (unlikely(ref->object == NULL)) {
-			ret = -ENOMEM;
-			goto error_unlock;
-		}
-		ret = ref->init(ref);
-		if (unlikely(ret != 0))
-			goto error_free;
-
-		item->object = ref->object;
-	} else {
-		ref->object = item->object;
-	}
-
-	++item->refcount;
-	mutex_unlock(&item->mutex);
-	return 0;
-
-error_free:
-	kfree(ref->object);
-	ref->object = NULL;
-error_unlock:
-	mutex_unlock(&item->mutex);
-	return ret;
-}
-EXPORT_SYMBOL(drm_global_item_ref);
-
-/**
- * drm_global_item_unref - Drop reference to memory
- * object
- * @ref: Object being removed
- *
- * Drop a reference to the memory object and eventually call the
- * release() hook.  The allocated object should be dropped in the
- * release() hook or before calling this function
- *
- */
-
-void drm_global_item_unref(struct drm_global_reference *ref)
-{
-	struct drm_global_item *item = &glob[ref->global_type];
-
-	mutex_lock(&item->mutex);
-	BUG_ON(item->refcount == 0);
-	BUG_ON(ref->object != item->object);
-	if (--item->refcount == 0) {
-		ref->release(ref);
-		item->object = NULL;
-	}
-	mutex_unlock(&item->mutex);
-}
-EXPORT_SYMBOL(drm_global_item_unref);
-
diff --git a/drivers/gpu/drm/gma500/psb_drv.h b/drivers/gpu/drm/gma500/psb_drv.h
index 93d2f4000d2f..941b238bdcc9 100644
--- a/drivers/gpu/drm/gma500/psb_drv.h
+++ b/drivers/gpu/drm/gma500/psb_drv.h
@@ -24,7 +24,6 @@
 #include <linux/mm_types.h>
 
 #include <drm/drmP.h>
-#include <drm/drm_global.h>
 #include <drm/gma_drm.h>
 #include "psb_reg.h"
 #include "psb_intel_drv.h"
diff --git a/include/drm/drmP.h b/include/drm/drmP.h
index f7a19c2a7a80..c2cd94d4a0d1 100644
--- a/include/drm/drmP.h
+++ b/include/drm/drmP.h
@@ -68,7 +68,6 @@
 #include <drm/drm_agpsupport.h>
 #include <drm/drm_crtc.h>
 #include <drm/drm_fourcc.h>
-#include <drm/drm_global.h>
 #include <drm/drm_hashtab.h>
 #include <drm/drm_mm.h>
 #include <drm/drm_os_linux.h>
diff --git a/include/drm/drm_global.h b/include/drm/drm_global.h
deleted file mode 100644
index 3a830602a2e4..000000000000
--- a/include/drm/drm_global.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2008-2009 VMware, Inc., Palo Alto, CA., USA
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
- * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
- * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
- * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
- * USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- **************************************************************************/
-/*
- * Authors: Thomas Hellstrom <thellstrom-at-vmware-dot-com>
- */
-
-#ifndef _DRM_GLOBAL_H_
-#define _DRM_GLOBAL_H_
-enum drm_global_types {
-	DRM_GLOBAL_TTM_MEM = 0,
-	DRM_GLOBAL_TTM_BO,
-	DRM_GLOBAL_TTM_OBJECT,
-	DRM_GLOBAL_NUM
-};
-
-struct drm_global_reference {
-	enum drm_global_types global_type;
-	size_t size;
-	void *object;
-	int (*init) (struct drm_global_reference *);
-	void (*release) (struct drm_global_reference *);
-};
-
-void drm_global_init(void);
-void drm_global_release(void);
-int drm_global_item_ref(struct drm_global_reference *ref);
-void drm_global_item_unref(struct drm_global_reference *ref);
-
-#endif
diff --git a/include/drm/ttm/ttm_bo_driver.h b/include/drm/ttm/ttm_bo_driver.h
index 6fb589f64633..1021106438b2 100644
--- a/include/drm/ttm/ttm_bo_driver.h
+++ b/include/drm/ttm/ttm_bo_driver.h
@@ -31,7 +31,6 @@
 #define _TTM_BO_DRIVER_H_
 
 #include <drm/drm_mm.h>
-#include <drm/drm_global.h>
 #include <drm/drm_vma_manager.h>
 #include <linux/workqueue.h>
 #include <linux/fs.h>
-- 
2.14.1

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [PATCH 4/5] drm/ttm: initialize globals during device init
       [not found]     ` <20181019164138.32993-4-christian.koenig-5C7GfCeVMHo@public.gmane.org>
@ 2018-10-22  6:45       ` Zhang, Jerry(Junwei)
       [not found]         ` <91e7b5e4-f91a-f3a9-983a-2f1dbb5bc6c9-5C7GfCeVMHo@public.gmane.org>
  2018-10-22  6:51       ` Zhang, Jerry(Junwei)
  1 sibling, 1 reply; 12+ messages in thread
From: Zhang, Jerry(Junwei) @ 2018-10-22  6:45 UTC (permalink / raw)
  To: Christian König, dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW,
	tzimmermann-l3A5Bk7waGM,
	amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW

A question in ttm_bo.c

On 10/20/2018 12:41 AM, Christian König wrote:
> Make sure that the global BO state is always correctly initialized.
>
> This allows removing all the device code to initialize it.
>
> Signed-off-by: Christian König <christian.koenig@amd.com>
> ---
>   drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c         | 59 +------------------------
>   drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h         |  1 -
>   drivers/gpu/drm/ast/ast_drv.h                   |  1 -
>   drivers/gpu/drm/ast/ast_ttm.c                   | 36 ---------------
>   drivers/gpu/drm/bochs/bochs.h                   |  1 -
>   drivers/gpu/drm/bochs/bochs_mm.c                | 35 ---------------
>   drivers/gpu/drm/cirrus/cirrus_drv.h             |  1 -
>   drivers/gpu/drm/cirrus/cirrus_ttm.c             | 36 ---------------
>   drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h |  1 -
>   drivers/gpu/drm/hisilicon/hibmc/hibmc_ttm.c     | 34 --------------
>   drivers/gpu/drm/mgag200/mgag200_drv.h           |  1 -
>   drivers/gpu/drm/mgag200/mgag200_ttm.c           | 36 ---------------
>   drivers/gpu/drm/nouveau/nouveau_drv.h           |  1 -
>   drivers/gpu/drm/nouveau/nouveau_ttm.c           | 39 ----------------
>   drivers/gpu/drm/qxl/qxl_drv.h                   |  2 -
>   drivers/gpu/drm/qxl/qxl_ttm.c                   | 33 --------------
>   drivers/gpu/drm/radeon/radeon.h                 |  2 -
>   drivers/gpu/drm/radeon/radeon_ttm.c             | 39 ----------------
>   drivers/gpu/drm/ttm/ttm_bo.c                    | 19 +++++---
>   drivers/gpu/drm/virtio/virtgpu_drv.h            |  2 -
>   drivers/gpu/drm/virtio/virtgpu_ttm.c            | 35 ---------------
>   drivers/gpu/drm/vmwgfx/vmwgfx_drv.c             | 11 +----
>   drivers/gpu/drm/vmwgfx/vmwgfx_drv.h             |  3 --
>   drivers/gpu/drm/vmwgfx/vmwgfx_ttm_glue.c        | 27 -----------
>   drivers/staging/vboxvideo/vbox_ttm.c            | 36 ---------------
>   include/drm/ttm/ttm_bo_driver.h                 | 41 +----------------
>   26 files changed, 16 insertions(+), 516 deletions(-)
>
> [... skip above ...]
> diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c
> index d89183f95570..df028805b7e2 100644
> --- a/drivers/gpu/drm/ttm/ttm_bo.c
> +++ b/drivers/gpu/drm/ttm/ttm_bo.c
> @@ -1530,7 +1530,7 @@ static void ttm_bo_global_kobj_release(struct kobject *kobj)
>   	kfree(glob);
>   }
>   
> -void ttm_bo_global_release(void)
> +static void ttm_bo_global_release(void)
>   {
>   	struct ttm_bo_global *glob = &ttm_bo_glob;
>   
> @@ -1544,9 +1544,8 @@ void ttm_bo_global_release(void)
>   out:
>   	mutex_unlock(&ttm_global_mutex);
>   }
> -EXPORT_SYMBOL(ttm_bo_global_release);
>   
> -int ttm_bo_global_init(void)
> +static int ttm_bo_global_init(void)
>   {
>   	struct ttm_bo_global *glob = &ttm_bo_glob;
>   	int ret = 0;
> @@ -1583,8 +1582,6 @@ int ttm_bo_global_init(void)
>   	mutex_unlock(&ttm_global_mutex);
>   	return ret;
>   }
> -EXPORT_SYMBOL(ttm_bo_global_init);
> -
>   
>   int ttm_bo_device_release(struct ttm_bo_device *bdev)
>   {
> @@ -1623,18 +1620,25 @@ int ttm_bo_device_release(struct ttm_bo_device *bdev)
>   
>   	drm_vma_offset_manager_destroy(&bdev->vma_manager);
>   
> +	if (!ret)
> +		ttm_bo_global_release();

if ttm_bo_clean_mm() fails, it will skip ttm_bo_global_release().
When will it be called?

Shall add it to delayed work? or maybe we could release it directly?

Regards,
Jerry

> +
>   	return ret;
>   }
>   EXPORT_SYMBOL(ttm_bo_device_release);
>   
>   int ttm_bo_device_init(struct ttm_bo_device *bdev,
> -		       struct ttm_bo_global *glob,
>   		       struct ttm_bo_driver *driver,
>   		       struct address_space *mapping,
>   		       uint64_t file_page_offset,
>   		       bool need_dma32)
>   {
> -	int ret = -EINVAL;
> +	struct ttm_bo_global *glob = &ttm_bo_glob;
> +	int ret;
> +
> +	ret = ttm_bo_global_init();
> +	if (ret)
> +		return ret;
>   
>   	bdev->driver = driver;
>   
> @@ -1661,6 +1665,7 @@ int ttm_bo_device_init(struct ttm_bo_device *bdev,
>   
>   	return 0;
>   out_no_sys:
> +	ttm_bo_global_release();
>   	return ret;
>   }
>   EXPORT_SYMBOL(ttm_bo_device_init);
> diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.h b/drivers/gpu/drm/virtio/virtgpu_drv.h
> index dec42d421e00..30caa20d9fcf 100644
> --- a/drivers/gpu/drm/virtio/virtgpu_drv.h
> +++ b/drivers/gpu/drm/virtio/virtgpu_drv.h
> @@ -132,8 +132,6 @@ struct virtio_gpu_framebuffer {
>   	container_of(x, struct virtio_gpu_framebuffer, base)
>   
>   struct virtio_gpu_mman {
> -	struct ttm_bo_global_ref        bo_global_ref;
> -	bool				mem_global_referenced;
>   	struct ttm_bo_device		bdev;
>   };
>   
> diff --git a/drivers/gpu/drm/virtio/virtgpu_ttm.c b/drivers/gpu/drm/virtio/virtgpu_ttm.c
> index b99ecc6d97d3..c1a56d640121 100644
> --- a/drivers/gpu/drm/virtio/virtgpu_ttm.c
> +++ b/drivers/gpu/drm/virtio/virtgpu_ttm.c
> @@ -50,35 +50,6 @@ virtio_gpu_device *virtio_gpu_get_vgdev(struct ttm_bo_device *bdev)
>   	return vgdev;
>   }
>   
> -static int virtio_gpu_ttm_global_init(struct virtio_gpu_device *vgdev)
> -{
> -	struct drm_global_reference *global_ref;
> -	int r;
> -
> -	vgdev->mman.mem_global_referenced = false;
> -	global_ref = &vgdev->mman.bo_global_ref.ref;
> -	global_ref->global_type = DRM_GLOBAL_TTM_BO;
> -	global_ref->size = sizeof(struct ttm_bo_global);
> -	global_ref->init = &ttm_bo_global_ref_init;
> -	global_ref->release = &ttm_bo_global_ref_release;
> -	r = drm_global_item_ref(global_ref);
> -	if (r != 0) {
> -		DRM_ERROR("Failed setting up TTM BO subsystem.\n");
> -		return r;
> -	}
> -
> -	vgdev->mman.mem_global_referenced = true;
> -	return 0;
> -}
> -
> -static void virtio_gpu_ttm_global_fini(struct virtio_gpu_device *vgdev)
> -{
> -	if (vgdev->mman.mem_global_referenced) {
> -		drm_global_item_unref(&vgdev->mman.bo_global_ref.ref);
> -		vgdev->mman.mem_global_referenced = false;
> -	}
> -}
> -
>   #if 0
>   /*
>    * Hmm, seems to not do anything useful.  Leftover debug hack?
> @@ -391,12 +362,8 @@ int virtio_gpu_ttm_init(struct virtio_gpu_device *vgdev)
>   {
>   	int r;
>   
> -	r = virtio_gpu_ttm_global_init(vgdev);
> -	if (r)
> -		return r;
>   	/* No others user of address space so set it to 0 */
>   	r = ttm_bo_device_init(&vgdev->mman.bdev,
> -			       vgdev->mman.bo_global_ref.ref.object,
>   			       &virtio_gpu_bo_driver,
>   			       vgdev->ddev->anon_inode->i_mapping,
>   			       DRM_FILE_PAGE_OFFSET, 0);
> @@ -415,13 +382,11 @@ int virtio_gpu_ttm_init(struct virtio_gpu_device *vgdev)
>   err_mm_init:
>   	ttm_bo_device_release(&vgdev->mman.bdev);
>   err_dev_init:
> -	virtio_gpu_ttm_global_fini(vgdev);
>   	return r;
>   }
>   
>   void virtio_gpu_ttm_fini(struct virtio_gpu_device *vgdev)
>   {
>   	ttm_bo_device_release(&vgdev->mman.bdev);
> -	virtio_gpu_ttm_global_fini(vgdev);
>   	DRM_INFO("virtio_gpu: ttm finalized\n");
>   }
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
> index 57df776d987c..29da63a0a0f2 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
> @@ -801,11 +801,6 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
>   	DRM_INFO("MMIO at 0x%08x size is %u kiB\n",
>   		 dev_priv->mmio_start, dev_priv->mmio_size / 1024);
>   
> -	ret = vmw_ttm_global_init(dev_priv);
> -	if (unlikely(ret != 0))
> -		goto out_err0;
> -
> -
>   	vmw_master_init(&dev_priv->fbdev_master);
>   	ttm_lock_set_kill(&dev_priv->fbdev_master.lock, false, SIGTERM);
>   	dev_priv->active_master = &dev_priv->fbdev_master;
> @@ -816,7 +811,7 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
>   	if (unlikely(dev_priv->mmio_virt == NULL)) {
>   		ret = -ENOMEM;
>   		DRM_ERROR("Failed mapping MMIO.\n");
> -		goto out_err3;
> +		goto out_err0;
>   	}
>   
>   	/* Need mmio memory to check for fifo pitchlock cap. */
> @@ -870,7 +865,6 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
>   	}
>   
>   	ret = ttm_bo_device_init(&dev_priv->bdev,
> -				 dev_priv->bo_global_ref.ref.object,
>   				 &vmw_bo_driver,
>   				 dev->anon_inode->i_mapping,
>   				 VMWGFX_FILE_PAGE_OFFSET,
> @@ -992,8 +986,6 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
>   	ttm_object_device_release(&dev_priv->tdev);
>   out_err4:
>   	memunmap(dev_priv->mmio_virt);
> -out_err3:
> -	vmw_ttm_global_release(dev_priv);
>   out_err0:
>   	for (i = vmw_res_context; i < vmw_res_max; ++i)
>   		idr_destroy(&dev_priv->res_idr[i]);
> @@ -1045,7 +1037,6 @@ static void vmw_driver_unload(struct drm_device *dev)
>   	memunmap(dev_priv->mmio_virt);
>   	if (dev_priv->ctx.staged_bindings)
>   		vmw_binding_state_free(dev_priv->ctx.staged_bindings);
> -	vmw_ttm_global_release(dev_priv);
>   
>   	for (i = vmw_res_context; i < vmw_res_max; ++i)
>   		idr_destroy(&dev_priv->res_idr[i]);
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
> index df15a745efc3..a23f1c1fd4c9 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
> @@ -365,7 +365,6 @@ enum {
>   
>   struct vmw_private {
>   	struct ttm_bo_device bdev;
> -	struct ttm_bo_global_ref bo_global_ref;
>   
>   	struct vmw_fifo_state fifo;
>   
> @@ -762,8 +761,6 @@ extern int vmw_fifo_flush(struct vmw_private *dev_priv,
>    * TTM glue - vmwgfx_ttm_glue.c
>    */
>   
> -extern int vmw_ttm_global_init(struct vmw_private *dev_priv);
> -extern void vmw_ttm_global_release(struct vmw_private *dev_priv);
>   extern int vmw_mmap(struct file *filp, struct vm_area_struct *vma);
>   
>   /**
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_glue.c b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_glue.c
> index 0ac473cd5136..154eb09aa91e 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_glue.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_glue.c
> @@ -42,30 +42,3 @@ int vmw_mmap(struct file *filp, struct vm_area_struct *vma)
>   	dev_priv = vmw_priv(file_priv->minor->dev);
>   	return ttm_bo_mmap(filp, vma, &dev_priv->bdev);
>   }
> -
> -int vmw_ttm_global_init(struct vmw_private *dev_priv)
> -{
> -	struct drm_global_reference *global_ref;
> -	int ret;
> -
> -	global_ref = &dev_priv->bo_global_ref.ref;
> -	global_ref->global_type = DRM_GLOBAL_TTM_BO;
> -	global_ref->size = sizeof(struct ttm_bo_global);
> -	global_ref->init = &ttm_bo_global_ref_init;
> -	global_ref->release = &ttm_bo_global_ref_release;
> -	ret = drm_global_item_ref(global_ref);
> -
> -	if (unlikely(ret != 0)) {
> -		DRM_ERROR("Failed setting up TTM buffer objects.\n");
> -		goto out_no_bo;
> -	}
> -
> -	return 0;
> -out_no_bo:
> -	return ret;
> -}
> -
> -void vmw_ttm_global_release(struct vmw_private *dev_priv)
> -{
> -	drm_global_item_unref(&dev_priv->bo_global_ref.ref);
> -}
> diff --git a/drivers/staging/vboxvideo/vbox_ttm.c b/drivers/staging/vboxvideo/vbox_ttm.c
> index 88cdacf2b0f0..6c8ba8625ad9 100644
> --- a/drivers/staging/vboxvideo/vbox_ttm.c
> +++ b/drivers/staging/vboxvideo/vbox_ttm.c
> @@ -35,37 +35,6 @@ static inline struct vbox_private *vbox_bdev(struct ttm_bo_device *bd)
>   	return container_of(bd, struct vbox_private, ttm.bdev);
>   }
>   
> -/**
> - * Adds the vbox memory manager object/structures to the global memory manager.
> - */
> -static int vbox_ttm_global_init(struct vbox_private *vbox)
> -{
> -	struct drm_global_reference *global_ref;
> -	int ret;
> -
> -	global_ref = &vbox->ttm.bo_global_ref.ref;
> -	global_ref->global_type = DRM_GLOBAL_TTM_BO;
> -	global_ref->size = sizeof(struct ttm_bo_global);
> -	global_ref->init = &ttm_bo_global_ref_init;
> -	global_ref->release = &ttm_bo_global_ref_release;
> -
> -	ret = drm_global_item_ref(global_ref);
> -	if (ret) {
> -		DRM_ERROR("Failed setting up TTM BO subsystem.\n");
> -		return ret;
> -	}
> -
> -	return 0;
> -}
> -
> -/**
> - * Removes the vbox memory manager object from the global memory manager.
> - */
> -static void vbox_ttm_global_release(struct vbox_private *vbox)
> -{
> -	drm_global_item_unref(&vbox->ttm.bo_global_ref.ref);
> -}
> -
>   static void vbox_bo_ttm_destroy(struct ttm_buffer_object *tbo)
>   {
>   	struct vbox_bo *bo;
> @@ -203,12 +172,7 @@ int vbox_mm_init(struct vbox_private *vbox)
>   	struct drm_device *dev = vbox->dev;
>   	struct ttm_bo_device *bdev = &vbox->ttm.bdev;
>   
> -	ret = vbox_ttm_global_init(vbox);
> -	if (ret)
> -		return ret;
> -
>   	ret = ttm_bo_device_init(&vbox->ttm.bdev,
> -				 vbox->ttm.bo_global_ref.ref.object,
>   				 &vbox_bo_driver,
>   				 dev->anon_inode->i_mapping,
>   				 DRM_FILE_PAGE_OFFSET, true);
> diff --git a/include/drm/ttm/ttm_bo_driver.h b/include/drm/ttm/ttm_bo_driver.h
> index 26be74939f10..6fb589f64633 100644
> --- a/include/drm/ttm/ttm_bo_driver.h
> +++ b/include/drm/ttm/ttm_bo_driver.h
> @@ -569,9 +569,6 @@ void ttm_bo_mem_put(struct ttm_buffer_object *bo, struct ttm_mem_reg *mem);
>   void ttm_bo_mem_put_locked(struct ttm_buffer_object *bo,
>   			   struct ttm_mem_reg *mem);
>   
> -void ttm_bo_global_release(void);
> -int ttm_bo_global_init(void);
> -
>   int ttm_bo_device_release(struct ttm_bo_device *bdev);
>   
>   /**
> @@ -589,7 +586,7 @@ int ttm_bo_device_release(struct ttm_bo_device *bdev);
>    * Returns:
>    * !0: Failure.
>    */
> -int ttm_bo_device_init(struct ttm_bo_device *bdev, struct ttm_bo_global *glob,
> +int ttm_bo_device_init(struct ttm_bo_device *bdev,
>   		       struct ttm_bo_driver *driver,
>   		       struct address_space *mapping,
>   		       uint64_t file_page_offset, bool need_dma32);
> @@ -888,40 +885,4 @@ pgprot_t ttm_io_prot(uint32_t caching_flags, pgprot_t tmp);
>   
>   extern const struct ttm_mem_type_manager_func ttm_bo_manager_func;
>   
> -/**
> - * struct ttm_bo_global_ref - Argument to initialize a struct ttm_bo_global.
> - */
> -
> -struct ttm_bo_global_ref {
> -	struct drm_global_reference ref;
> -};
> -
> -/**
> - * ttm_bo_global_ref_init
> - *
> - * @ref: DRM global reference
> - *
> - * Helper function that initializes a struct ttm_bo_global. This function
> - * is used as init call-back function for DRM global references of type
> - * DRM_GLOBAL_TTM_BO_REF.
> - */
> -static inline int ttm_bo_global_ref_init(struct drm_global_reference *ref)
> -{
> -	return ttm_bo_global_init();
> -}
> -
> -/**
> - * ttm_bo_global_ref_release
> - *
> - * @ref: DRM global reference
> - *
> - * Helper function that releases a struct ttm_bo_global. This function
> - * is used as release call-back function for DRM global references of type
> - * DRM_GLOBAL_TTM_BO_REF.
> - */
> -static inline void ttm_bo_global_ref_release(struct drm_global_reference *ref)
> -{
> -	ttm_bo_global_release();
> -}
> -
>   #endif

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 1/5] drm/ttm: use a static ttm_mem_global instance
  2018-10-19 16:41 [PATCH 1/5] drm/ttm: use a static ttm_mem_global instance Christian König
       [not found] ` <20181019164138.32993-1-christian.koenig-5C7GfCeVMHo@public.gmane.org>
@ 2018-10-22  6:47 ` Zhang, Jerry(Junwei)
  1 sibling, 0 replies; 12+ messages in thread
From: Zhang, Jerry(Junwei) @ 2018-10-22  6:47 UTC (permalink / raw)
  To: Christian König, dri-devel, tzimmermann, amd-gfx

On 10/20/2018 12:41 AM, Christian König wrote:
> As the name says we only need one global instance of ttm_mem_global.
>
> Drop all the driver initialization and just use a single exported
> instance which is initialized during BO global initialization.
>
> Signed-off-by: Christian König <christian.koenig@amd.com>

Patch 1, 2, 3, 5 look good for me.
Reviewed-by: Junwei Zhang <Jerry.Zhang@amd.com>

a question for patch 4.

Jerry
> ---
>   drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c         | 44 -------------------------
>   drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h         |  1 -
>   drivers/gpu/drm/ast/ast_drv.h                   |  1 -
>   drivers/gpu/drm/ast/ast_ttm.c                   | 32 ++----------------
>   drivers/gpu/drm/bochs/bochs.h                   |  1 -
>   drivers/gpu/drm/bochs/bochs_mm.c                | 30 ++---------------
>   drivers/gpu/drm/cirrus/cirrus_drv.h             |  1 -
>   drivers/gpu/drm/cirrus/cirrus_ttm.c             | 32 ++----------------
>   drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h |  1 -
>   drivers/gpu/drm/hisilicon/hibmc/hibmc_ttm.c     | 31 +++--------------
>   drivers/gpu/drm/mgag200/mgag200_drv.h           |  1 -
>   drivers/gpu/drm/mgag200/mgag200_ttm.c           | 32 ++----------------
>   drivers/gpu/drm/nouveau/nouveau_drv.h           |  1 -
>   drivers/gpu/drm/nouveau/nouveau_ttm.c           | 34 ++-----------------
>   drivers/gpu/drm/qxl/qxl_drv.h                   |  1 -
>   drivers/gpu/drm/qxl/qxl_ttm.c                   | 28 ----------------
>   drivers/gpu/drm/radeon/radeon.h                 |  1 -
>   drivers/gpu/drm/radeon/radeon_ttm.c             | 26 ---------------
>   drivers/gpu/drm/ttm/ttm_bo.c                    | 10 ++++--
>   drivers/gpu/drm/ttm/ttm_memory.c                |  5 +--
>   drivers/gpu/drm/virtio/virtgpu_drv.h            |  1 -
>   drivers/gpu/drm/virtio/virtgpu_ttm.c            | 27 ---------------
>   drivers/gpu/drm/vmwgfx/vmwgfx_drv.c             |  4 +--
>   drivers/gpu/drm/vmwgfx/vmwgfx_drv.h             |  3 +-
>   drivers/gpu/drm/vmwgfx/vmwgfx_ttm_glue.c        | 27 ---------------
>   drivers/staging/vboxvideo/vbox_drv.h            |  1 -
>   drivers/staging/vboxvideo/vbox_ttm.c            | 24 --------------
>   include/drm/ttm/ttm_bo_driver.h                 |  8 ++---
>   include/drm/ttm/ttm_memory.h                    |  4 +--
>   29 files changed, 32 insertions(+), 380 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> index 3a6802846698..fda252022b15 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> @@ -65,33 +65,6 @@ static void amdgpu_ttm_debugfs_fini(struct amdgpu_device *adev);
>    * Global memory.
>    */
>   
> -/**
> - * amdgpu_ttm_mem_global_init - Initialize and acquire reference to
> - * memory object
> - *
> - * @ref: Object for initialization.
> - *
> - * This is called by drm_global_item_ref() when an object is being
> - * initialized.
> - */
> -static int amdgpu_ttm_mem_global_init(struct drm_global_reference *ref)
> -{
> -	return ttm_mem_global_init(ref->object);
> -}
> -
> -/**
> - * amdgpu_ttm_mem_global_release - Drop reference to a memory object
> - *
> - * @ref: Object being removed
> - *
> - * This is called by drm_global_item_unref() when an object is being
> - * released.
> - */
> -static void amdgpu_ttm_mem_global_release(struct drm_global_reference *ref)
> -{
> -	ttm_mem_global_release(ref->object);
> -}
> -
>   /**
>    * amdgpu_ttm_global_init - Initialize global TTM memory reference structures.
>    *
> @@ -108,20 +81,6 @@ static int amdgpu_ttm_global_init(struct amdgpu_device *adev)
>   	/* ensure reference is false in case init fails */
>   	adev->mman.mem_global_referenced = false;
>   
> -	global_ref = &adev->mman.mem_global_ref;
> -	global_ref->global_type = DRM_GLOBAL_TTM_MEM;
> -	global_ref->size = sizeof(struct ttm_mem_global);
> -	global_ref->init = &amdgpu_ttm_mem_global_init;
> -	global_ref->release = &amdgpu_ttm_mem_global_release;
> -	r = drm_global_item_ref(global_ref);
> -	if (r) {
> -		DRM_ERROR("Failed setting up TTM memory accounting "
> -			  "subsystem.\n");
> -		goto error_mem;
> -	}
> -
> -	adev->mman.bo_global_ref.mem_glob =
> -		adev->mman.mem_global_ref.object;
>   	global_ref = &adev->mman.bo_global_ref.ref;
>   	global_ref->global_type = DRM_GLOBAL_TTM_BO;
>   	global_ref->size = sizeof(struct ttm_bo_global);
> @@ -140,8 +99,6 @@ static int amdgpu_ttm_global_init(struct amdgpu_device *adev)
>   	return 0;
>   
>   error_bo:
> -	drm_global_item_unref(&adev->mman.mem_global_ref);
> -error_mem:
>   	return r;
>   }
>   
> @@ -150,7 +107,6 @@ static void amdgpu_ttm_global_fini(struct amdgpu_device *adev)
>   	if (adev->mman.mem_global_referenced) {
>   		mutex_destroy(&adev->mman.gtt_window_lock);
>   		drm_global_item_unref(&adev->mman.bo_global_ref.ref);
> -		drm_global_item_unref(&adev->mman.mem_global_ref);
>   		adev->mman.mem_global_referenced = false;
>   	}
>   }
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
> index fe8f276e9811..e114f209b701 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
> @@ -40,7 +40,6 @@
>   
>   struct amdgpu_mman {
>   	struct ttm_bo_global_ref        bo_global_ref;
> -	struct drm_global_reference	mem_global_ref;
>   	struct ttm_bo_device		bdev;
>   	bool				mem_global_referenced;
>   	bool				initialized;
> diff --git a/drivers/gpu/drm/ast/ast_drv.h b/drivers/gpu/drm/ast/ast_drv.h
> index e6c4cd3dc50e..6ae11a477643 100644
> --- a/drivers/gpu/drm/ast/ast_drv.h
> +++ b/drivers/gpu/drm/ast/ast_drv.h
> @@ -104,7 +104,6 @@ struct ast_private {
>   	int fb_mtrr;
>   
>   	struct {
> -		struct drm_global_reference mem_global_ref;
>   		struct ttm_bo_global_ref bo_global_ref;
>   		struct ttm_bo_device bdev;
>   	} ttm;
> diff --git a/drivers/gpu/drm/ast/ast_ttm.c b/drivers/gpu/drm/ast/ast_ttm.c
> index d21fbd26785a..8a59d6fc1160 100644
> --- a/drivers/gpu/drm/ast/ast_ttm.c
> +++ b/drivers/gpu/drm/ast/ast_ttm.c
> @@ -36,37 +36,11 @@ ast_bdev(struct ttm_bo_device *bd)
>   	return container_of(bd, struct ast_private, ttm.bdev);
>   }
>   
> -static int
> -ast_ttm_mem_global_init(struct drm_global_reference *ref)
> -{
> -	return ttm_mem_global_init(ref->object);
> -}
> -
> -static void
> -ast_ttm_mem_global_release(struct drm_global_reference *ref)
> -{
> -	ttm_mem_global_release(ref->object);
> -}
> -
>   static int ast_ttm_global_init(struct ast_private *ast)
>   {
>   	struct drm_global_reference *global_ref;
>   	int r;
>   
> -	global_ref = &ast->ttm.mem_global_ref;
> -	global_ref->global_type = DRM_GLOBAL_TTM_MEM;
> -	global_ref->size = sizeof(struct ttm_mem_global);
> -	global_ref->init = &ast_ttm_mem_global_init;
> -	global_ref->release = &ast_ttm_mem_global_release;
> -	r = drm_global_item_ref(global_ref);
> -	if (r != 0) {
> -		DRM_ERROR("Failed setting up TTM memory accounting "
> -			  "subsystem.\n");
> -		return r;
> -	}
> -
> -	ast->ttm.bo_global_ref.mem_glob =
> -		ast->ttm.mem_global_ref.object;
>   	global_ref = &ast->ttm.bo_global_ref.ref;
>   	global_ref->global_type = DRM_GLOBAL_TTM_BO;
>   	global_ref->size = sizeof(struct ttm_bo_global);
> @@ -75,7 +49,6 @@ static int ast_ttm_global_init(struct ast_private *ast)
>   	r = drm_global_item_ref(global_ref);
>   	if (r != 0) {
>   		DRM_ERROR("Failed setting up TTM BO subsystem.\n");
> -		drm_global_item_unref(&ast->ttm.mem_global_ref);
>   		return r;
>   	}
>   	return 0;
> @@ -84,12 +57,11 @@ static int ast_ttm_global_init(struct ast_private *ast)
>   static void
>   ast_ttm_global_release(struct ast_private *ast)
>   {
> -	if (ast->ttm.mem_global_ref.release == NULL)
> +	if (ast->ttm.bo_global_ref.ref.release == NULL)
>   		return;
>   
>   	drm_global_item_unref(&ast->ttm.bo_global_ref.ref);
> -	drm_global_item_unref(&ast->ttm.mem_global_ref);
> -	ast->ttm.mem_global_ref.release = NULL;
> +	ast->ttm.bo_global_ref.ref.release = NULL;
>   }
>   
>   
> diff --git a/drivers/gpu/drm/bochs/bochs.h b/drivers/gpu/drm/bochs/bochs.h
> index 375bf92cd04f..c7c2f85b28fa 100644
> --- a/drivers/gpu/drm/bochs/bochs.h
> +++ b/drivers/gpu/drm/bochs/bochs.h
> @@ -80,7 +80,6 @@ struct bochs_device {
>   
>   	/* ttm */
>   	struct {
> -		struct drm_global_reference mem_global_ref;
>   		struct ttm_bo_global_ref bo_global_ref;
>   		struct ttm_bo_device bdev;
>   		bool initialized;
> diff --git a/drivers/gpu/drm/bochs/bochs_mm.c b/drivers/gpu/drm/bochs/bochs_mm.c
> index e794986e6b7c..22fe13545992 100644
> --- a/drivers/gpu/drm/bochs/bochs_mm.c
> +++ b/drivers/gpu/drm/bochs/bochs_mm.c
> @@ -16,35 +16,11 @@ static inline struct bochs_device *bochs_bdev(struct ttm_bo_device *bd)
>   	return container_of(bd, struct bochs_device, ttm.bdev);
>   }
>   
> -static int bochs_ttm_mem_global_init(struct drm_global_reference *ref)
> -{
> -	return ttm_mem_global_init(ref->object);
> -}
> -
> -static void bochs_ttm_mem_global_release(struct drm_global_reference *ref)
> -{
> -	ttm_mem_global_release(ref->object);
> -}
> -
>   static int bochs_ttm_global_init(struct bochs_device *bochs)
>   {
>   	struct drm_global_reference *global_ref;
>   	int r;
>   
> -	global_ref = &bochs->ttm.mem_global_ref;
> -	global_ref->global_type = DRM_GLOBAL_TTM_MEM;
> -	global_ref->size = sizeof(struct ttm_mem_global);
> -	global_ref->init = &bochs_ttm_mem_global_init;
> -	global_ref->release = &bochs_ttm_mem_global_release;
> -	r = drm_global_item_ref(global_ref);
> -	if (r != 0) {
> -		DRM_ERROR("Failed setting up TTM memory accounting "
> -			  "subsystem.\n");
> -		return r;
> -	}
> -
> -	bochs->ttm.bo_global_ref.mem_glob =
> -		bochs->ttm.mem_global_ref.object;
>   	global_ref = &bochs->ttm.bo_global_ref.ref;
>   	global_ref->global_type = DRM_GLOBAL_TTM_BO;
>   	global_ref->size = sizeof(struct ttm_bo_global);
> @@ -53,7 +29,6 @@ static int bochs_ttm_global_init(struct bochs_device *bochs)
>   	r = drm_global_item_ref(global_ref);
>   	if (r != 0) {
>   		DRM_ERROR("Failed setting up TTM BO subsystem.\n");
> -		drm_global_item_unref(&bochs->ttm.mem_global_ref);
>   		return r;
>   	}
>   
> @@ -62,12 +37,11 @@ static int bochs_ttm_global_init(struct bochs_device *bochs)
>   
>   static void bochs_ttm_global_release(struct bochs_device *bochs)
>   {
> -	if (bochs->ttm.mem_global_ref.release == NULL)
> +	if (bochs->ttm.bo_global_ref.ref.release == NULL)
>   		return;
>   
>   	drm_global_item_unref(&bochs->ttm.bo_global_ref.ref);
> -	drm_global_item_unref(&bochs->ttm.mem_global_ref);
> -	bochs->ttm.mem_global_ref.release = NULL;
> +	bochs->ttm.bo_global_ref.ref.release = NULL;
>   }
>   
>   
> diff --git a/drivers/gpu/drm/cirrus/cirrus_drv.h b/drivers/gpu/drm/cirrus/cirrus_drv.h
> index ce9db7aab225..1c784dc2ac17 100644
> --- a/drivers/gpu/drm/cirrus/cirrus_drv.h
> +++ b/drivers/gpu/drm/cirrus/cirrus_drv.h
> @@ -136,7 +136,6 @@ struct cirrus_device {
>   	int fb_mtrr;
>   
>   	struct {
> -		struct drm_global_reference mem_global_ref;
>   		struct ttm_bo_global_ref bo_global_ref;
>   		struct ttm_bo_device bdev;
>   	} ttm;
> diff --git a/drivers/gpu/drm/cirrus/cirrus_ttm.c b/drivers/gpu/drm/cirrus/cirrus_ttm.c
> index 2e2141f26c5b..7801c56c3c9b 100644
> --- a/drivers/gpu/drm/cirrus/cirrus_ttm.c
> +++ b/drivers/gpu/drm/cirrus/cirrus_ttm.c
> @@ -36,37 +36,11 @@ cirrus_bdev(struct ttm_bo_device *bd)
>   	return container_of(bd, struct cirrus_device, ttm.bdev);
>   }
>   
> -static int
> -cirrus_ttm_mem_global_init(struct drm_global_reference *ref)
> -{
> -	return ttm_mem_global_init(ref->object);
> -}
> -
> -static void
> -cirrus_ttm_mem_global_release(struct drm_global_reference *ref)
> -{
> -	ttm_mem_global_release(ref->object);
> -}
> -
>   static int cirrus_ttm_global_init(struct cirrus_device *cirrus)
>   {
>   	struct drm_global_reference *global_ref;
>   	int r;
>   
> -	global_ref = &cirrus->ttm.mem_global_ref;
> -	global_ref->global_type = DRM_GLOBAL_TTM_MEM;
> -	global_ref->size = sizeof(struct ttm_mem_global);
> -	global_ref->init = &cirrus_ttm_mem_global_init;
> -	global_ref->release = &cirrus_ttm_mem_global_release;
> -	r = drm_global_item_ref(global_ref);
> -	if (r != 0) {
> -		DRM_ERROR("Failed setting up TTM memory accounting "
> -			  "subsystem.\n");
> -		return r;
> -	}
> -
> -	cirrus->ttm.bo_global_ref.mem_glob =
> -		cirrus->ttm.mem_global_ref.object;
>   	global_ref = &cirrus->ttm.bo_global_ref.ref;
>   	global_ref->global_type = DRM_GLOBAL_TTM_BO;
>   	global_ref->size = sizeof(struct ttm_bo_global);
> @@ -75,7 +49,6 @@ static int cirrus_ttm_global_init(struct cirrus_device *cirrus)
>   	r = drm_global_item_ref(global_ref);
>   	if (r != 0) {
>   		DRM_ERROR("Failed setting up TTM BO subsystem.\n");
> -		drm_global_item_unref(&cirrus->ttm.mem_global_ref);
>   		return r;
>   	}
>   	return 0;
> @@ -84,12 +57,11 @@ static int cirrus_ttm_global_init(struct cirrus_device *cirrus)
>   static void
>   cirrus_ttm_global_release(struct cirrus_device *cirrus)
>   {
> -	if (cirrus->ttm.mem_global_ref.release == NULL)
> +	if (cirrus->ttm.bo_global_ref.ref.release == NULL)
>   		return;
>   
>   	drm_global_item_unref(&cirrus->ttm.bo_global_ref.ref);
> -	drm_global_item_unref(&cirrus->ttm.mem_global_ref);
> -	cirrus->ttm.mem_global_ref.release = NULL;
> +	cirrus->ttm.bo_global_ref.ref.release = NULL;
>   }
>   
>   
> diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h
> index e195521eb41e..a890546b666e 100644
> --- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h
> +++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h
> @@ -50,7 +50,6 @@ struct hibmc_drm_private {
>   	struct drm_atomic_state *suspend_state;
>   
>   	/* ttm */
> -	struct drm_global_reference mem_global_ref;
>   	struct ttm_bo_global_ref bo_global_ref;
>   	struct ttm_bo_device bdev;
>   	bool initialized;
> diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_ttm.c b/drivers/gpu/drm/hisilicon/hibmc/hibmc_ttm.c
> index 786269f0c0f1..b15d60f1b1d1 100644
> --- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_ttm.c
> +++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_ttm.c
> @@ -29,34 +29,10 @@ hibmc_bdev(struct ttm_bo_device *bd)
>   	return container_of(bd, struct hibmc_drm_private, bdev);
>   }
>   
> -static int
> -hibmc_ttm_mem_global_init(struct drm_global_reference *ref)
> -{
> -	return ttm_mem_global_init(ref->object);
> -}
> -
> -static void
> -hibmc_ttm_mem_global_release(struct drm_global_reference *ref)
> -{
> -	ttm_mem_global_release(ref->object);
> -}
> -
>   static int hibmc_ttm_global_init(struct hibmc_drm_private *hibmc)
>   {
>   	int ret;
>   
> -	hibmc->mem_global_ref.global_type = DRM_GLOBAL_TTM_MEM;
> -	hibmc->mem_global_ref.size = sizeof(struct ttm_mem_global);
> -	hibmc->mem_global_ref.init = &hibmc_ttm_mem_global_init;
> -	hibmc->mem_global_ref.release = &hibmc_ttm_mem_global_release;
> -	ret = drm_global_item_ref(&hibmc->mem_global_ref);
> -	if (ret) {
> -		DRM_ERROR("could not get ref on ttm global: %d\n", ret);
> -		return ret;
> -	}
> -
> -	hibmc->bo_global_ref.mem_glob =
> -		hibmc->mem_global_ref.object;
>   	hibmc->bo_global_ref.ref.global_type = DRM_GLOBAL_TTM_BO;
>   	hibmc->bo_global_ref.ref.size = sizeof(struct ttm_bo_global);
>   	hibmc->bo_global_ref.ref.init = &ttm_bo_global_ref_init;
> @@ -64,7 +40,6 @@ static int hibmc_ttm_global_init(struct hibmc_drm_private *hibmc)
>   	ret = drm_global_item_ref(&hibmc->bo_global_ref.ref);
>   	if (ret) {
>   		DRM_ERROR("failed setting up TTM BO subsystem: %d\n", ret);
> -		drm_global_item_unref(&hibmc->mem_global_ref);
>   		return ret;
>   	}
>   	return 0;
> @@ -73,9 +48,11 @@ static int hibmc_ttm_global_init(struct hibmc_drm_private *hibmc)
>   static void
>   hibmc_ttm_global_release(struct hibmc_drm_private *hibmc)
>   {
> +	if (hibmc->bo_global_ref.ref.release == NULL)
> +		return;
> +
>   	drm_global_item_unref(&hibmc->bo_global_ref.ref);
> -	drm_global_item_unref(&hibmc->mem_global_ref);
> -	hibmc->mem_global_ref.release = NULL;
> +	hibmc->bo_global_ref.ref.release = NULL;
>   }
>   
>   static void hibmc_bo_ttm_destroy(struct ttm_buffer_object *tbo)
> diff --git a/drivers/gpu/drm/mgag200/mgag200_drv.h b/drivers/gpu/drm/mgag200/mgag200_drv.h
> index 04f1dfba12e5..e5348955a3cc 100644
> --- a/drivers/gpu/drm/mgag200/mgag200_drv.h
> +++ b/drivers/gpu/drm/mgag200/mgag200_drv.h
> @@ -212,7 +212,6 @@ struct mga_device {
>   	int fb_mtrr;
>   
>   	struct {
> -		struct drm_global_reference mem_global_ref;
>   		struct ttm_bo_global_ref bo_global_ref;
>   		struct ttm_bo_device bdev;
>   	} ttm;
> diff --git a/drivers/gpu/drm/mgag200/mgag200_ttm.c b/drivers/gpu/drm/mgag200/mgag200_ttm.c
> index 3444b539e7f4..11bdc8121a7d 100644
> --- a/drivers/gpu/drm/mgag200/mgag200_ttm.c
> +++ b/drivers/gpu/drm/mgag200/mgag200_ttm.c
> @@ -36,37 +36,11 @@ mgag200_bdev(struct ttm_bo_device *bd)
>   	return container_of(bd, struct mga_device, ttm.bdev);
>   }
>   
> -static int
> -mgag200_ttm_mem_global_init(struct drm_global_reference *ref)
> -{
> -	return ttm_mem_global_init(ref->object);
> -}
> -
> -static void
> -mgag200_ttm_mem_global_release(struct drm_global_reference *ref)
> -{
> -	ttm_mem_global_release(ref->object);
> -}
> -
>   static int mgag200_ttm_global_init(struct mga_device *ast)
>   {
>   	struct drm_global_reference *global_ref;
>   	int r;
>   
> -	global_ref = &ast->ttm.mem_global_ref;
> -	global_ref->global_type = DRM_GLOBAL_TTM_MEM;
> -	global_ref->size = sizeof(struct ttm_mem_global);
> -	global_ref->init = &mgag200_ttm_mem_global_init;
> -	global_ref->release = &mgag200_ttm_mem_global_release;
> -	r = drm_global_item_ref(global_ref);
> -	if (r != 0) {
> -		DRM_ERROR("Failed setting up TTM memory accounting "
> -			  "subsystem.\n");
> -		return r;
> -	}
> -
> -	ast->ttm.bo_global_ref.mem_glob =
> -		ast->ttm.mem_global_ref.object;
>   	global_ref = &ast->ttm.bo_global_ref.ref;
>   	global_ref->global_type = DRM_GLOBAL_TTM_BO;
>   	global_ref->size = sizeof(struct ttm_bo_global);
> @@ -75,7 +49,6 @@ static int mgag200_ttm_global_init(struct mga_device *ast)
>   	r = drm_global_item_ref(global_ref);
>   	if (r != 0) {
>   		DRM_ERROR("Failed setting up TTM BO subsystem.\n");
> -		drm_global_item_unref(&ast->ttm.mem_global_ref);
>   		return r;
>   	}
>   	return 0;
> @@ -84,12 +57,11 @@ static int mgag200_ttm_global_init(struct mga_device *ast)
>   static void
>   mgag200_ttm_global_release(struct mga_device *ast)
>   {
> -	if (ast->ttm.mem_global_ref.release == NULL)
> +	if (ast->ttm.bo_global_ref.ref.release == NULL)
>   		return;
>   
>   	drm_global_item_unref(&ast->ttm.bo_global_ref.ref);
> -	drm_global_item_unref(&ast->ttm.mem_global_ref);
> -	ast->ttm.mem_global_ref.release = NULL;
> +	ast->ttm.bo_global_ref.ref.release = NULL;
>   }
>   
>   
> diff --git a/drivers/gpu/drm/nouveau/nouveau_drv.h b/drivers/gpu/drm/nouveau/nouveau_drv.h
> index 6e1acaec3400..937b8e61f654 100644
> --- a/drivers/gpu/drm/nouveau/nouveau_drv.h
> +++ b/drivers/gpu/drm/nouveau/nouveau_drv.h
> @@ -146,7 +146,6 @@ struct nouveau_drm {
>   
>   	/* TTM interface support */
>   	struct {
> -		struct drm_global_reference mem_global_ref;
>   		struct ttm_bo_global_ref bo_global_ref;
>   		struct ttm_bo_device bdev;
>   		atomic_t validate_sequence;
> diff --git a/drivers/gpu/drm/nouveau/nouveau_ttm.c b/drivers/gpu/drm/nouveau/nouveau_ttm.c
> index a293383c8654..69448b02649e 100644
> --- a/drivers/gpu/drm/nouveau/nouveau_ttm.c
> +++ b/drivers/gpu/drm/nouveau/nouveau_ttm.c
> @@ -174,38 +174,12 @@ nouveau_ttm_mmap(struct file *filp, struct vm_area_struct *vma)
>   	return ttm_bo_mmap(filp, vma, &drm->ttm.bdev);
>   }
>   
> -static int
> -nouveau_ttm_mem_global_init(struct drm_global_reference *ref)
> -{
> -	return ttm_mem_global_init(ref->object);
> -}
> -
> -static void
> -nouveau_ttm_mem_global_release(struct drm_global_reference *ref)
> -{
> -	ttm_mem_global_release(ref->object);
> -}
> -
>   int
>   nouveau_ttm_global_init(struct nouveau_drm *drm)
>   {
>   	struct drm_global_reference *global_ref;
>   	int ret;
>   
> -	global_ref = &drm->ttm.mem_global_ref;
> -	global_ref->global_type = DRM_GLOBAL_TTM_MEM;
> -	global_ref->size = sizeof(struct ttm_mem_global);
> -	global_ref->init = &nouveau_ttm_mem_global_init;
> -	global_ref->release = &nouveau_ttm_mem_global_release;
> -
> -	ret = drm_global_item_ref(global_ref);
> -	if (unlikely(ret != 0)) {
> -		DRM_ERROR("Failed setting up TTM memory accounting\n");
> -		drm->ttm.mem_global_ref.release = NULL;
> -		return ret;
> -	}
> -
> -	drm->ttm.bo_global_ref.mem_glob = global_ref->object;
>   	global_ref = &drm->ttm.bo_global_ref.ref;
>   	global_ref->global_type = DRM_GLOBAL_TTM_BO;
>   	global_ref->size = sizeof(struct ttm_bo_global);
> @@ -215,8 +189,7 @@ nouveau_ttm_global_init(struct nouveau_drm *drm)
>   	ret = drm_global_item_ref(global_ref);
>   	if (unlikely(ret != 0)) {
>   		DRM_ERROR("Failed setting up TTM BO subsystem\n");
> -		drm_global_item_unref(&drm->ttm.mem_global_ref);
> -		drm->ttm.mem_global_ref.release = NULL;
> +		drm->ttm.bo_global_ref.ref.release = NULL;
>   		return ret;
>   	}
>   
> @@ -226,12 +199,11 @@ nouveau_ttm_global_init(struct nouveau_drm *drm)
>   void
>   nouveau_ttm_global_release(struct nouveau_drm *drm)
>   {
> -	if (drm->ttm.mem_global_ref.release == NULL)
> +	if (drm->ttm.bo_global_ref.ref.release == NULL)
>   		return;
>   
>   	drm_global_item_unref(&drm->ttm.bo_global_ref.ref);
> -	drm_global_item_unref(&drm->ttm.mem_global_ref);
> -	drm->ttm.mem_global_ref.release = NULL;
> +	drm->ttm.bo_global_ref.ref.release = NULL;
>   }
>   
>   static int
> diff --git a/drivers/gpu/drm/qxl/qxl_drv.h b/drivers/gpu/drm/qxl/qxl_drv.h
> index 01220d386b0a..b2c1cef0005a 100644
> --- a/drivers/gpu/drm/qxl/qxl_drv.h
> +++ b/drivers/gpu/drm/qxl/qxl_drv.h
> @@ -133,7 +133,6 @@ struct qxl_framebuffer {
>   
>   struct qxl_mman {
>   	struct ttm_bo_global_ref        bo_global_ref;
> -	struct drm_global_reference	mem_global_ref;
>   	bool				mem_global_referenced;
>   	struct ttm_bo_device		bdev;
>   };
> diff --git a/drivers/gpu/drm/qxl/qxl_ttm.c b/drivers/gpu/drm/qxl/qxl_ttm.c
> index db2a0036e9c4..bb8cc9b16780 100644
> --- a/drivers/gpu/drm/qxl/qxl_ttm.c
> +++ b/drivers/gpu/drm/qxl/qxl_ttm.c
> @@ -46,37 +46,11 @@ static struct qxl_device *qxl_get_qdev(struct ttm_bo_device *bdev)
>   	return qdev;
>   }
>   
> -static int qxl_ttm_mem_global_init(struct drm_global_reference *ref)
> -{
> -	return ttm_mem_global_init(ref->object);
> -}
> -
> -static void qxl_ttm_mem_global_release(struct drm_global_reference *ref)
> -{
> -	ttm_mem_global_release(ref->object);
> -}
> -
>   static int qxl_ttm_global_init(struct qxl_device *qdev)
>   {
>   	struct drm_global_reference *global_ref;
>   	int r;
>   
> -	qdev->mman.mem_global_referenced = false;
> -	global_ref = &qdev->mman.mem_global_ref;
> -	global_ref->global_type = DRM_GLOBAL_TTM_MEM;
> -	global_ref->size = sizeof(struct ttm_mem_global);
> -	global_ref->init = &qxl_ttm_mem_global_init;
> -	global_ref->release = &qxl_ttm_mem_global_release;
> -
> -	r = drm_global_item_ref(global_ref);
> -	if (r != 0) {
> -		DRM_ERROR("Failed setting up TTM memory accounting "
> -			  "subsystem.\n");
> -		return r;
> -	}
> -
> -	qdev->mman.bo_global_ref.mem_glob =
> -		qdev->mman.mem_global_ref.object;
>   	global_ref = &qdev->mman.bo_global_ref.ref;
>   	global_ref->global_type = DRM_GLOBAL_TTM_BO;
>   	global_ref->size = sizeof(struct ttm_bo_global);
> @@ -85,7 +59,6 @@ static int qxl_ttm_global_init(struct qxl_device *qdev)
>   	r = drm_global_item_ref(global_ref);
>   	if (r != 0) {
>   		DRM_ERROR("Failed setting up TTM BO subsystem.\n");
> -		drm_global_item_unref(&qdev->mman.mem_global_ref);
>   		return r;
>   	}
>   
> @@ -97,7 +70,6 @@ static void qxl_ttm_global_fini(struct qxl_device *qdev)
>   {
>   	if (qdev->mman.mem_global_referenced) {
>   		drm_global_item_unref(&qdev->mman.bo_global_ref.ref);
> -		drm_global_item_unref(&qdev->mman.mem_global_ref);
>   		qdev->mman.mem_global_referenced = false;
>   	}
>   }
> diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
> index 1a6f6edb3515..06fb952b6290 100644
> --- a/drivers/gpu/drm/radeon/radeon.h
> +++ b/drivers/gpu/drm/radeon/radeon.h
> @@ -449,7 +449,6 @@ struct radeon_surface_reg {
>    */
>   struct radeon_mman {
>   	struct ttm_bo_global_ref        bo_global_ref;
> -	struct drm_global_reference	mem_global_ref;
>   	struct ttm_bo_device		bdev;
>   	bool				mem_global_referenced;
>   	bool				initialized;
> diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c
> index dac4ec5a120b..2104429ddbac 100644
> --- a/drivers/gpu/drm/radeon/radeon_ttm.c
> +++ b/drivers/gpu/drm/radeon/radeon_ttm.c
> @@ -64,36 +64,12 @@ static struct radeon_device *radeon_get_rdev(struct ttm_bo_device *bdev)
>   /*
>    * Global memory.
>    */
> -static int radeon_ttm_mem_global_init(struct drm_global_reference *ref)
> -{
> -	return ttm_mem_global_init(ref->object);
> -}
> -
> -static void radeon_ttm_mem_global_release(struct drm_global_reference *ref)
> -{
> -	ttm_mem_global_release(ref->object);
> -}
> -
>   static int radeon_ttm_global_init(struct radeon_device *rdev)
>   {
>   	struct drm_global_reference *global_ref;
>   	int r;
>   
>   	rdev->mman.mem_global_referenced = false;
> -	global_ref = &rdev->mman.mem_global_ref;
> -	global_ref->global_type = DRM_GLOBAL_TTM_MEM;
> -	global_ref->size = sizeof(struct ttm_mem_global);
> -	global_ref->init = &radeon_ttm_mem_global_init;
> -	global_ref->release = &radeon_ttm_mem_global_release;
> -	r = drm_global_item_ref(global_ref);
> -	if (r != 0) {
> -		DRM_ERROR("Failed setting up TTM memory accounting "
> -			  "subsystem.\n");
> -		return r;
> -	}
> -
> -	rdev->mman.bo_global_ref.mem_glob =
> -		rdev->mman.mem_global_ref.object;
>   	global_ref = &rdev->mman.bo_global_ref.ref;
>   	global_ref->global_type = DRM_GLOBAL_TTM_BO;
>   	global_ref->size = sizeof(struct ttm_bo_global);
> @@ -102,7 +78,6 @@ static int radeon_ttm_global_init(struct radeon_device *rdev)
>   	r = drm_global_item_ref(global_ref);
>   	if (r != 0) {
>   		DRM_ERROR("Failed setting up TTM BO subsystem.\n");
> -		drm_global_item_unref(&rdev->mman.mem_global_ref);
>   		return r;
>   	}
>   
> @@ -114,7 +89,6 @@ static void radeon_ttm_global_fini(struct radeon_device *rdev)
>   {
>   	if (rdev->mman.mem_global_referenced) {
>   		drm_global_item_unref(&rdev->mman.bo_global_ref.ref);
> -		drm_global_item_unref(&rdev->mman.mem_global_ref);
>   		rdev->mman.mem_global_referenced = false;
>   	}
>   }
> diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c
> index 9edece6510d3..3006050b1720 100644
> --- a/drivers/gpu/drm/ttm/ttm_bo.c
> +++ b/drivers/gpu/drm/ttm/ttm_bo.c
> @@ -1526,18 +1526,22 @@ void ttm_bo_global_release(struct ttm_bo_global *glob)
>   {
>   	kobject_del(&glob->kobj);
>   	kobject_put(&glob->kobj);
> +	ttm_mem_global_release(&ttm_mem_glob);
>   }
>   EXPORT_SYMBOL(ttm_bo_global_release);
>   
> -int ttm_bo_global_init(struct ttm_bo_global *glob,
> -		       struct ttm_mem_global *mem_glob)
> +int ttm_bo_global_init(struct ttm_bo_global *glob)
>   {
>   	int ret;
>   	unsigned i;
>   
> +	ret = ttm_mem_global_init(&ttm_mem_glob);
> +	if (ret)
> +		return ret;
> +
>   	mutex_init(&glob->device_list_mutex);
>   	spin_lock_init(&glob->lru_lock);
> -	glob->mem_glob = mem_glob;
> +	glob->mem_glob = &ttm_mem_glob;
>   	glob->mem_glob->bo_glob = glob;
>   	glob->dummy_read_page = alloc_page(__GFP_ZERO | GFP_DMA32);
>   
> diff --git a/drivers/gpu/drm/ttm/ttm_memory.c b/drivers/gpu/drm/ttm/ttm_memory.c
> index 450387c92b63..7704e17c402f 100644
> --- a/drivers/gpu/drm/ttm/ttm_memory.c
> +++ b/drivers/gpu/drm/ttm/ttm_memory.c
> @@ -41,6 +41,9 @@
>   
>   #define TTM_MEMORY_ALLOC_RETRIES 4
>   
> +struct ttm_mem_global ttm_mem_glob;
> +EXPORT_SYMBOL(ttm_mem_glob);
> +
>   struct ttm_mem_zone {
>   	struct kobject kobj;
>   	struct ttm_mem_global *glob;
> @@ -464,7 +467,6 @@ int ttm_mem_global_init(struct ttm_mem_global *glob)
>   	ttm_mem_global_release(glob);
>   	return ret;
>   }
> -EXPORT_SYMBOL(ttm_mem_global_init);
>   
>   void ttm_mem_global_release(struct ttm_mem_global *glob)
>   {
> @@ -486,7 +488,6 @@ void ttm_mem_global_release(struct ttm_mem_global *glob)
>   	kobject_del(&glob->kobj);
>   	kobject_put(&glob->kobj);
>   }
> -EXPORT_SYMBOL(ttm_mem_global_release);
>   
>   static void ttm_check_swapping(struct ttm_mem_global *glob)
>   {
> diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.h b/drivers/gpu/drm/virtio/virtgpu_drv.h
> index 65605e207bbe..dec42d421e00 100644
> --- a/drivers/gpu/drm/virtio/virtgpu_drv.h
> +++ b/drivers/gpu/drm/virtio/virtgpu_drv.h
> @@ -133,7 +133,6 @@ struct virtio_gpu_framebuffer {
>   
>   struct virtio_gpu_mman {
>   	struct ttm_bo_global_ref        bo_global_ref;
> -	struct drm_global_reference	mem_global_ref;
>   	bool				mem_global_referenced;
>   	struct ttm_bo_device		bdev;
>   };
> diff --git a/drivers/gpu/drm/virtio/virtgpu_ttm.c b/drivers/gpu/drm/virtio/virtgpu_ttm.c
> index 0ec46b47b423..b99ecc6d97d3 100644
> --- a/drivers/gpu/drm/virtio/virtgpu_ttm.c
> +++ b/drivers/gpu/drm/virtio/virtgpu_ttm.c
> @@ -50,37 +50,12 @@ virtio_gpu_device *virtio_gpu_get_vgdev(struct ttm_bo_device *bdev)
>   	return vgdev;
>   }
>   
> -static int virtio_gpu_ttm_mem_global_init(struct drm_global_reference *ref)
> -{
> -	return ttm_mem_global_init(ref->object);
> -}
> -
> -static void virtio_gpu_ttm_mem_global_release(struct drm_global_reference *ref)
> -{
> -	ttm_mem_global_release(ref->object);
> -}
> -
>   static int virtio_gpu_ttm_global_init(struct virtio_gpu_device *vgdev)
>   {
>   	struct drm_global_reference *global_ref;
>   	int r;
>   
>   	vgdev->mman.mem_global_referenced = false;
> -	global_ref = &vgdev->mman.mem_global_ref;
> -	global_ref->global_type = DRM_GLOBAL_TTM_MEM;
> -	global_ref->size = sizeof(struct ttm_mem_global);
> -	global_ref->init = &virtio_gpu_ttm_mem_global_init;
> -	global_ref->release = &virtio_gpu_ttm_mem_global_release;
> -
> -	r = drm_global_item_ref(global_ref);
> -	if (r != 0) {
> -		DRM_ERROR("Failed setting up TTM memory accounting "
> -			  "subsystem.\n");
> -		return r;
> -	}
> -
> -	vgdev->mman.bo_global_ref.mem_glob =
> -		vgdev->mman.mem_global_ref.object;
>   	global_ref = &vgdev->mman.bo_global_ref.ref;
>   	global_ref->global_type = DRM_GLOBAL_TTM_BO;
>   	global_ref->size = sizeof(struct ttm_bo_global);
> @@ -89,7 +64,6 @@ static int virtio_gpu_ttm_global_init(struct virtio_gpu_device *vgdev)
>   	r = drm_global_item_ref(global_ref);
>   	if (r != 0) {
>   		DRM_ERROR("Failed setting up TTM BO subsystem.\n");
> -		drm_global_item_unref(&vgdev->mman.mem_global_ref);
>   		return r;
>   	}
>   
> @@ -101,7 +75,6 @@ static void virtio_gpu_ttm_global_fini(struct virtio_gpu_device *vgdev)
>   {
>   	if (vgdev->mman.mem_global_referenced) {
>   		drm_global_item_unref(&vgdev->mman.bo_global_ref.ref);
> -		drm_global_item_unref(&vgdev->mman.mem_global_ref);
>   		vgdev->mman.mem_global_referenced = false;
>   	}
>   }
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
> index bb6dbbe18835..57df776d987c 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
> @@ -828,8 +828,8 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
>   		goto out_err4;
>   	}
>   
> -	dev_priv->tdev = ttm_object_device_init
> -		(dev_priv->mem_global_ref.object, 12, &vmw_prime_dmabuf_ops);
> +	dev_priv->tdev = ttm_object_device_init(&ttm_mem_glob, 12,
> +						&vmw_prime_dmabuf_ops);
>   
>   	if (unlikely(dev_priv->tdev == NULL)) {
>   		DRM_ERROR("Unable to initialize TTM object management.\n");
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
> index 1abe21758b0d..df15a745efc3 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
> @@ -366,7 +366,6 @@ enum {
>   struct vmw_private {
>   	struct ttm_bo_device bdev;
>   	struct ttm_bo_global_ref bo_global_ref;
> -	struct drm_global_reference mem_global_ref;
>   
>   	struct vmw_fifo_state fifo;
>   
> @@ -1288,7 +1287,7 @@ vmw_bo_reference(struct vmw_buffer_object *buf)
>   
>   static inline struct ttm_mem_global *vmw_mem_glob(struct vmw_private *dev_priv)
>   {
> -	return (struct ttm_mem_global *) dev_priv->mem_global_ref.object;
> +	return &ttm_mem_glob;
>   }
>   
>   static inline void vmw_fifo_resource_inc(struct vmw_private *dev_priv)
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_glue.c b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_glue.c
> index f3ce43c41978..0ac473cd5136 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_glue.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_glue.c
> @@ -43,36 +43,11 @@ int vmw_mmap(struct file *filp, struct vm_area_struct *vma)
>   	return ttm_bo_mmap(filp, vma, &dev_priv->bdev);
>   }
>   
> -static int vmw_ttm_mem_global_init(struct drm_global_reference *ref)
> -{
> -	DRM_INFO("global init.\n");
> -	return ttm_mem_global_init(ref->object);
> -}
> -
> -static void vmw_ttm_mem_global_release(struct drm_global_reference *ref)
> -{
> -	ttm_mem_global_release(ref->object);
> -}
> -
>   int vmw_ttm_global_init(struct vmw_private *dev_priv)
>   {
>   	struct drm_global_reference *global_ref;
>   	int ret;
>   
> -	global_ref = &dev_priv->mem_global_ref;
> -	global_ref->global_type = DRM_GLOBAL_TTM_MEM;
> -	global_ref->size = sizeof(struct ttm_mem_global);
> -	global_ref->init = &vmw_ttm_mem_global_init;
> -	global_ref->release = &vmw_ttm_mem_global_release;
> -
> -	ret = drm_global_item_ref(global_ref);
> -	if (unlikely(ret != 0)) {
> -		DRM_ERROR("Failed setting up TTM memory accounting.\n");
> -		return ret;
> -	}
> -
> -	dev_priv->bo_global_ref.mem_glob =
> -		dev_priv->mem_global_ref.object;
>   	global_ref = &dev_priv->bo_global_ref.ref;
>   	global_ref->global_type = DRM_GLOBAL_TTM_BO;
>   	global_ref->size = sizeof(struct ttm_bo_global);
> @@ -87,12 +62,10 @@ int vmw_ttm_global_init(struct vmw_private *dev_priv)
>   
>   	return 0;
>   out_no_bo:
> -	drm_global_item_unref(&dev_priv->mem_global_ref);
>   	return ret;
>   }
>   
>   void vmw_ttm_global_release(struct vmw_private *dev_priv)
>   {
>   	drm_global_item_unref(&dev_priv->bo_global_ref.ref);
> -	drm_global_item_unref(&dev_priv->mem_global_ref);
>   }
> diff --git a/drivers/staging/vboxvideo/vbox_drv.h b/drivers/staging/vboxvideo/vbox_drv.h
> index 594f84272957..41f760b77704 100644
> --- a/drivers/staging/vboxvideo/vbox_drv.h
> +++ b/drivers/staging/vboxvideo/vbox_drv.h
> @@ -95,7 +95,6 @@ struct vbox_private {
>   	int fb_mtrr;
>   
>   	struct {
> -		struct drm_global_reference mem_global_ref;
>   		struct ttm_bo_global_ref bo_global_ref;
>   		struct ttm_bo_device bdev;
>   	} ttm;
> diff --git a/drivers/staging/vboxvideo/vbox_ttm.c b/drivers/staging/vboxvideo/vbox_ttm.c
> index 2329a55d4636..88cdacf2b0f0 100644
> --- a/drivers/staging/vboxvideo/vbox_ttm.c
> +++ b/drivers/staging/vboxvideo/vbox_ttm.c
> @@ -35,16 +35,6 @@ static inline struct vbox_private *vbox_bdev(struct ttm_bo_device *bd)
>   	return container_of(bd, struct vbox_private, ttm.bdev);
>   }
>   
> -static int vbox_ttm_mem_global_init(struct drm_global_reference *ref)
> -{
> -	return ttm_mem_global_init(ref->object);
> -}
> -
> -static void vbox_ttm_mem_global_release(struct drm_global_reference *ref)
> -{
> -	ttm_mem_global_release(ref->object);
> -}
> -
>   /**
>    * Adds the vbox memory manager object/structures to the global memory manager.
>    */
> @@ -53,18 +43,6 @@ static int vbox_ttm_global_init(struct vbox_private *vbox)
>   	struct drm_global_reference *global_ref;
>   	int ret;
>   
> -	global_ref = &vbox->ttm.mem_global_ref;
> -	global_ref->global_type = DRM_GLOBAL_TTM_MEM;
> -	global_ref->size = sizeof(struct ttm_mem_global);
> -	global_ref->init = &vbox_ttm_mem_global_init;
> -	global_ref->release = &vbox_ttm_mem_global_release;
> -	ret = drm_global_item_ref(global_ref);
> -	if (ret) {
> -		DRM_ERROR("Failed setting up TTM memory subsystem.\n");
> -		return ret;
> -	}
> -
> -	vbox->ttm.bo_global_ref.mem_glob = vbox->ttm.mem_global_ref.object;
>   	global_ref = &vbox->ttm.bo_global_ref.ref;
>   	global_ref->global_type = DRM_GLOBAL_TTM_BO;
>   	global_ref->size = sizeof(struct ttm_bo_global);
> @@ -74,7 +52,6 @@ static int vbox_ttm_global_init(struct vbox_private *vbox)
>   	ret = drm_global_item_ref(global_ref);
>   	if (ret) {
>   		DRM_ERROR("Failed setting up TTM BO subsystem.\n");
> -		drm_global_item_unref(&vbox->ttm.mem_global_ref);
>   		return ret;
>   	}
>   
> @@ -87,7 +64,6 @@ static int vbox_ttm_global_init(struct vbox_private *vbox)
>   static void vbox_ttm_global_release(struct vbox_private *vbox)
>   {
>   	drm_global_item_unref(&vbox->ttm.bo_global_ref.ref);
> -	drm_global_item_unref(&vbox->ttm.mem_global_ref);
>   }
>   
>   static void vbox_bo_ttm_destroy(struct ttm_buffer_object *tbo)
> diff --git a/include/drm/ttm/ttm_bo_driver.h b/include/drm/ttm/ttm_bo_driver.h
> index c6ee07d10281..4ae6fc33f761 100644
> --- a/include/drm/ttm/ttm_bo_driver.h
> +++ b/include/drm/ttm/ttm_bo_driver.h
> @@ -570,8 +570,7 @@ void ttm_bo_mem_put_locked(struct ttm_buffer_object *bo,
>   			   struct ttm_mem_reg *mem);
>   
>   void ttm_bo_global_release(struct ttm_bo_global *glob);
> -int ttm_bo_global_init(struct ttm_bo_global *glob,
> -		       struct ttm_mem_global *mem_glob);
> +int ttm_bo_global_init(struct ttm_bo_global *glob);
>   
>   int ttm_bo_device_release(struct ttm_bo_device *bdev);
>   
> @@ -895,7 +894,6 @@ extern const struct ttm_mem_type_manager_func ttm_bo_manager_func;
>   
>   struct ttm_bo_global_ref {
>   	struct drm_global_reference ref;
> -	struct ttm_mem_global *mem_glob;
>   };
>   
>   /**
> @@ -909,9 +907,7 @@ struct ttm_bo_global_ref {
>    */
>   static inline int ttm_bo_global_ref_init(struct drm_global_reference *ref)
>   {
> -	struct ttm_bo_global_ref *bo_ref =
> -		container_of(ref, struct ttm_bo_global_ref, ref);
> -	return ttm_bo_global_init(ref->object, bo_ref->mem_glob);
> +	return ttm_bo_global_init(ref->object);
>   }
>   
>   /**
> diff --git a/include/drm/ttm/ttm_memory.h b/include/drm/ttm/ttm_memory.h
> index 737b5fed8003..3ff48a0a2d7b 100644
> --- a/include/drm/ttm/ttm_memory.h
> +++ b/include/drm/ttm/ttm_memory.h
> @@ -63,7 +63,7 @@
>   
>   #define TTM_MEM_MAX_ZONES 2
>   struct ttm_mem_zone;
> -struct ttm_mem_global {
> +extern struct ttm_mem_global {
>   	struct kobject kobj;
>   	struct ttm_bo_global *bo_glob;
>   	struct workqueue_struct *swap_queue;
> @@ -78,7 +78,7 @@ struct ttm_mem_global {
>   #else
>   	struct ttm_mem_zone *zone_dma32;
>   #endif
> -};
> +} ttm_mem_glob;
>   
>   extern int ttm_mem_global_init(struct ttm_mem_global *glob);
>   extern void ttm_mem_global_release(struct ttm_mem_global *glob);

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 4/5] drm/ttm: initialize globals during device init
       [not found]     ` <20181019164138.32993-4-christian.koenig-5C7GfCeVMHo@public.gmane.org>
  2018-10-22  6:45       ` Zhang, Jerry(Junwei)
@ 2018-10-22  6:51       ` Zhang, Jerry(Junwei)
  1 sibling, 0 replies; 12+ messages in thread
From: Zhang, Jerry(Junwei) @ 2018-10-22  6:51 UTC (permalink / raw)
  To: Christian König, dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW,
	tzimmermann-l3A5Bk7waGM,
	amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW

A question for ttm_bo.c

On 10/20/2018 12:41 AM, Christian König wrote:
> Make sure that the global BO state is always correctly initialized.
>
> This allows removing all the device code to initialize it.
>
> Signed-off-by: Christian König <christian.koenig@amd.com>
> ---
>   drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c         | 59 +------------------------
>   drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h         |  1 -
>   drivers/gpu/drm/ast/ast_drv.h                   |  1 -
>   drivers/gpu/drm/ast/ast_ttm.c                   | 36 ---------------
>   drivers/gpu/drm/bochs/bochs.h                   |  1 -
>   drivers/gpu/drm/bochs/bochs_mm.c                | 35 ---------------
>   drivers/gpu/drm/cirrus/cirrus_drv.h             |  1 -
>   drivers/gpu/drm/cirrus/cirrus_ttm.c             | 36 ---------------
>   drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h |  1 -
>   drivers/gpu/drm/hisilicon/hibmc/hibmc_ttm.c     | 34 --------------
>   drivers/gpu/drm/mgag200/mgag200_drv.h           |  1 -
>   drivers/gpu/drm/mgag200/mgag200_ttm.c           | 36 ---------------
>   drivers/gpu/drm/nouveau/nouveau_drv.h           |  1 -
>   drivers/gpu/drm/nouveau/nouveau_ttm.c           | 39 ----------------
>   drivers/gpu/drm/qxl/qxl_drv.h                   |  2 -
>   drivers/gpu/drm/qxl/qxl_ttm.c                   | 33 --------------
>   drivers/gpu/drm/radeon/radeon.h                 |  2 -
>   drivers/gpu/drm/radeon/radeon_ttm.c             | 39 ----------------
>   drivers/gpu/drm/ttm/ttm_bo.c                    | 19 +++++---
>   drivers/gpu/drm/virtio/virtgpu_drv.h            |  2 -
>   drivers/gpu/drm/virtio/virtgpu_ttm.c            | 35 ---------------
>   drivers/gpu/drm/vmwgfx/vmwgfx_drv.c             | 11 +----
>   drivers/gpu/drm/vmwgfx/vmwgfx_drv.h             |  3 --
>   drivers/gpu/drm/vmwgfx/vmwgfx_ttm_glue.c        | 27 -----------
>   drivers/staging/vboxvideo/vbox_ttm.c            | 36 ---------------
>   include/drm/ttm/ttm_bo_driver.h                 | 41 +----------------
>   26 files changed, 16 insertions(+), 516 deletions(-)
>
> [... skip above ...]
> diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c
> index d89183f95570..df028805b7e2 100644
> --- a/drivers/gpu/drm/ttm/ttm_bo.c
> +++ b/drivers/gpu/drm/ttm/ttm_bo.c
> @@ -1530,7 +1530,7 @@ static void ttm_bo_global_kobj_release(struct kobject *kobj)
>   	kfree(glob);
>   }
>   
> -void ttm_bo_global_release(void)
> +static void ttm_bo_global_release(void)
>   {
>   	struct ttm_bo_global *glob = &ttm_bo_glob;
>   
> @@ -1544,9 +1544,8 @@ void ttm_bo_global_release(void)
>   out:
>   	mutex_unlock(&ttm_global_mutex);
>   }
> -EXPORT_SYMBOL(ttm_bo_global_release);
>   
> -int ttm_bo_global_init(void)
> +static int ttm_bo_global_init(void)
>   {
>   	struct ttm_bo_global *glob = &ttm_bo_glob;
>   	int ret = 0;
> @@ -1583,8 +1582,6 @@ int ttm_bo_global_init(void)
>   	mutex_unlock(&ttm_global_mutex);
>   	return ret;
>   }
> -EXPORT_SYMBOL(ttm_bo_global_init);
> -
>   
>   int ttm_bo_device_release(struct ttm_bo_device *bdev)
>   {
> @@ -1623,18 +1620,25 @@ int ttm_bo_device_release(struct ttm_bo_device *bdev)
>   
>   	drm_vma_offset_manager_destroy(&bdev->vma_manager);
>   
> +	if (!ret)
> +		ttm_bo_global_release();
> +

If ttm_bo_clean_mm() fails, it will skip ttm_bo_global_release()
When it will be called?

Shall we add it to a delayed work or we may call it directly here.

Regards
Jerry


>   	return ret;
>   }
>   EXPORT_SYMBOL(ttm_bo_device_release);
>   
>   int ttm_bo_device_init(struct ttm_bo_device *bdev,
> -		       struct ttm_bo_global *glob,
>   		       struct ttm_bo_driver *driver,
>   		       struct address_space *mapping,
>   		       uint64_t file_page_offset,
>   		       bool need_dma32)
>   {
> -	int ret = -EINVAL;
> +	struct ttm_bo_global *glob = &ttm_bo_glob;
> +	int ret;
> +
> +	ret = ttm_bo_global_init();
> +	if (ret)
> +		return ret;
>   
>   	bdev->driver = driver;
>   
> @@ -1661,6 +1665,7 @@ int ttm_bo_device_init(struct ttm_bo_device *bdev,
>   
>   	return 0;
>   out_no_sys:
> +	ttm_bo_global_release();
>   	return ret;
>   }
>   EXPORT_SYMBOL(ttm_bo_device_init);
> diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.h b/drivers/gpu/drm/virtio/virtgpu_drv.h
> index dec42d421e00..30caa20d9fcf 100644
> --- a/drivers/gpu/drm/virtio/virtgpu_drv.h
> +++ b/drivers/gpu/drm/virtio/virtgpu_drv.h
> @@ -132,8 +132,6 @@ struct virtio_gpu_framebuffer {
>   	container_of(x, struct virtio_gpu_framebuffer, base)
>   
>   struct virtio_gpu_mman {
> -	struct ttm_bo_global_ref        bo_global_ref;
> -	bool				mem_global_referenced;
>   	struct ttm_bo_device		bdev;
>   };
>   
> diff --git a/drivers/gpu/drm/virtio/virtgpu_ttm.c b/drivers/gpu/drm/virtio/virtgpu_ttm.c
> index b99ecc6d97d3..c1a56d640121 100644
> --- a/drivers/gpu/drm/virtio/virtgpu_ttm.c
> +++ b/drivers/gpu/drm/virtio/virtgpu_ttm.c
> @@ -50,35 +50,6 @@ virtio_gpu_device *virtio_gpu_get_vgdev(struct ttm_bo_device *bdev)
>   	return vgdev;
>   }
>   
> -static int virtio_gpu_ttm_global_init(struct virtio_gpu_device *vgdev)
> -{
> -	struct drm_global_reference *global_ref;
> -	int r;
> -
> -	vgdev->mman.mem_global_referenced = false;
> -	global_ref = &vgdev->mman.bo_global_ref.ref;
> -	global_ref->global_type = DRM_GLOBAL_TTM_BO;
> -	global_ref->size = sizeof(struct ttm_bo_global);
> -	global_ref->init = &ttm_bo_global_ref_init;
> -	global_ref->release = &ttm_bo_global_ref_release;
> -	r = drm_global_item_ref(global_ref);
> -	if (r != 0) {
> -		DRM_ERROR("Failed setting up TTM BO subsystem.\n");
> -		return r;
> -	}
> -
> -	vgdev->mman.mem_global_referenced = true;
> -	return 0;
> -}
> -
> -static void virtio_gpu_ttm_global_fini(struct virtio_gpu_device *vgdev)
> -{
> -	if (vgdev->mman.mem_global_referenced) {
> -		drm_global_item_unref(&vgdev->mman.bo_global_ref.ref);
> -		vgdev->mman.mem_global_referenced = false;
> -	}
> -}
> -
>   #if 0
>   /*
>    * Hmm, seems to not do anything useful.  Leftover debug hack?
> @@ -391,12 +362,8 @@ int virtio_gpu_ttm_init(struct virtio_gpu_device *vgdev)
>   {
>   	int r;
>   
> -	r = virtio_gpu_ttm_global_init(vgdev);
> -	if (r)
> -		return r;
>   	/* No others user of address space so set it to 0 */
>   	r = ttm_bo_device_init(&vgdev->mman.bdev,
> -			       vgdev->mman.bo_global_ref.ref.object,
>   			       &virtio_gpu_bo_driver,
>   			       vgdev->ddev->anon_inode->i_mapping,
>   			       DRM_FILE_PAGE_OFFSET, 0);
> @@ -415,13 +382,11 @@ int virtio_gpu_ttm_init(struct virtio_gpu_device *vgdev)
>   err_mm_init:
>   	ttm_bo_device_release(&vgdev->mman.bdev);
>   err_dev_init:
> -	virtio_gpu_ttm_global_fini(vgdev);
>   	return r;
>   }
>   
>   void virtio_gpu_ttm_fini(struct virtio_gpu_device *vgdev)
>   {
>   	ttm_bo_device_release(&vgdev->mman.bdev);
> -	virtio_gpu_ttm_global_fini(vgdev);
>   	DRM_INFO("virtio_gpu: ttm finalized\n");
>   }
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
> index 57df776d987c..29da63a0a0f2 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
> @@ -801,11 +801,6 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
>   	DRM_INFO("MMIO at 0x%08x size is %u kiB\n",
>   		 dev_priv->mmio_start, dev_priv->mmio_size / 1024);
>   
> -	ret = vmw_ttm_global_init(dev_priv);
> -	if (unlikely(ret != 0))
> -		goto out_err0;
> -
> -
>   	vmw_master_init(&dev_priv->fbdev_master);
>   	ttm_lock_set_kill(&dev_priv->fbdev_master.lock, false, SIGTERM);
>   	dev_priv->active_master = &dev_priv->fbdev_master;
> @@ -816,7 +811,7 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
>   	if (unlikely(dev_priv->mmio_virt == NULL)) {
>   		ret = -ENOMEM;
>   		DRM_ERROR("Failed mapping MMIO.\n");
> -		goto out_err3;
> +		goto out_err0;
>   	}
>   
>   	/* Need mmio memory to check for fifo pitchlock cap. */
> @@ -870,7 +865,6 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
>   	}
>   
>   	ret = ttm_bo_device_init(&dev_priv->bdev,
> -				 dev_priv->bo_global_ref.ref.object,
>   				 &vmw_bo_driver,
>   				 dev->anon_inode->i_mapping,
>   				 VMWGFX_FILE_PAGE_OFFSET,
> @@ -992,8 +986,6 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
>   	ttm_object_device_release(&dev_priv->tdev);
>   out_err4:
>   	memunmap(dev_priv->mmio_virt);
> -out_err3:
> -	vmw_ttm_global_release(dev_priv);
>   out_err0:
>   	for (i = vmw_res_context; i < vmw_res_max; ++i)
>   		idr_destroy(&dev_priv->res_idr[i]);
> @@ -1045,7 +1037,6 @@ static void vmw_driver_unload(struct drm_device *dev)
>   	memunmap(dev_priv->mmio_virt);
>   	if (dev_priv->ctx.staged_bindings)
>   		vmw_binding_state_free(dev_priv->ctx.staged_bindings);
> -	vmw_ttm_global_release(dev_priv);
>   
>   	for (i = vmw_res_context; i < vmw_res_max; ++i)
>   		idr_destroy(&dev_priv->res_idr[i]);
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
> index df15a745efc3..a23f1c1fd4c9 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
> @@ -365,7 +365,6 @@ enum {
>   
>   struct vmw_private {
>   	struct ttm_bo_device bdev;
> -	struct ttm_bo_global_ref bo_global_ref;
>   
>   	struct vmw_fifo_state fifo;
>   
> @@ -762,8 +761,6 @@ extern int vmw_fifo_flush(struct vmw_private *dev_priv,
>    * TTM glue - vmwgfx_ttm_glue.c
>    */
>   
> -extern int vmw_ttm_global_init(struct vmw_private *dev_priv);
> -extern void vmw_ttm_global_release(struct vmw_private *dev_priv);
>   extern int vmw_mmap(struct file *filp, struct vm_area_struct *vma);
>   
>   /**
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_glue.c b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_glue.c
> index 0ac473cd5136..154eb09aa91e 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_glue.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_glue.c
> @@ -42,30 +42,3 @@ int vmw_mmap(struct file *filp, struct vm_area_struct *vma)
>   	dev_priv = vmw_priv(file_priv->minor->dev);
>   	return ttm_bo_mmap(filp, vma, &dev_priv->bdev);
>   }
> -
> -int vmw_ttm_global_init(struct vmw_private *dev_priv)
> -{
> -	struct drm_global_reference *global_ref;
> -	int ret;
> -
> -	global_ref = &dev_priv->bo_global_ref.ref;
> -	global_ref->global_type = DRM_GLOBAL_TTM_BO;
> -	global_ref->size = sizeof(struct ttm_bo_global);
> -	global_ref->init = &ttm_bo_global_ref_init;
> -	global_ref->release = &ttm_bo_global_ref_release;
> -	ret = drm_global_item_ref(global_ref);
> -
> -	if (unlikely(ret != 0)) {
> -		DRM_ERROR("Failed setting up TTM buffer objects.\n");
> -		goto out_no_bo;
> -	}
> -
> -	return 0;
> -out_no_bo:
> -	return ret;
> -}
> -
> -void vmw_ttm_global_release(struct vmw_private *dev_priv)
> -{
> -	drm_global_item_unref(&dev_priv->bo_global_ref.ref);
> -}
> diff --git a/drivers/staging/vboxvideo/vbox_ttm.c b/drivers/staging/vboxvideo/vbox_ttm.c
> index 88cdacf2b0f0..6c8ba8625ad9 100644
> --- a/drivers/staging/vboxvideo/vbox_ttm.c
> +++ b/drivers/staging/vboxvideo/vbox_ttm.c
> @@ -35,37 +35,6 @@ static inline struct vbox_private *vbox_bdev(struct ttm_bo_device *bd)
>   	return container_of(bd, struct vbox_private, ttm.bdev);
>   }
>   
> -/**
> - * Adds the vbox memory manager object/structures to the global memory manager.
> - */
> -static int vbox_ttm_global_init(struct vbox_private *vbox)
> -{
> -	struct drm_global_reference *global_ref;
> -	int ret;
> -
> -	global_ref = &vbox->ttm.bo_global_ref.ref;
> -	global_ref->global_type = DRM_GLOBAL_TTM_BO;
> -	global_ref->size = sizeof(struct ttm_bo_global);
> -	global_ref->init = &ttm_bo_global_ref_init;
> -	global_ref->release = &ttm_bo_global_ref_release;
> -
> -	ret = drm_global_item_ref(global_ref);
> -	if (ret) {
> -		DRM_ERROR("Failed setting up TTM BO subsystem.\n");
> -		return ret;
> -	}
> -
> -	return 0;
> -}
> -
> -/**
> - * Removes the vbox memory manager object from the global memory manager.
> - */
> -static void vbox_ttm_global_release(struct vbox_private *vbox)
> -{
> -	drm_global_item_unref(&vbox->ttm.bo_global_ref.ref);
> -}
> -
>   static void vbox_bo_ttm_destroy(struct ttm_buffer_object *tbo)
>   {
>   	struct vbox_bo *bo;
> @@ -203,12 +172,7 @@ int vbox_mm_init(struct vbox_private *vbox)
>   	struct drm_device *dev = vbox->dev;
>   	struct ttm_bo_device *bdev = &vbox->ttm.bdev;
>   
> -	ret = vbox_ttm_global_init(vbox);
> -	if (ret)
> -		return ret;
> -
>   	ret = ttm_bo_device_init(&vbox->ttm.bdev,
> -				 vbox->ttm.bo_global_ref.ref.object,
>   				 &vbox_bo_driver,
>   				 dev->anon_inode->i_mapping,
>   				 DRM_FILE_PAGE_OFFSET, true);
> diff --git a/include/drm/ttm/ttm_bo_driver.h b/include/drm/ttm/ttm_bo_driver.h
> index 26be74939f10..6fb589f64633 100644
> --- a/include/drm/ttm/ttm_bo_driver.h
> +++ b/include/drm/ttm/ttm_bo_driver.h
> @@ -569,9 +569,6 @@ void ttm_bo_mem_put(struct ttm_buffer_object *bo, struct ttm_mem_reg *mem);
>   void ttm_bo_mem_put_locked(struct ttm_buffer_object *bo,
>   			   struct ttm_mem_reg *mem);
>   
> -void ttm_bo_global_release(void);
> -int ttm_bo_global_init(void);
> -
>   int ttm_bo_device_release(struct ttm_bo_device *bdev);
>   
>   /**
> @@ -589,7 +586,7 @@ int ttm_bo_device_release(struct ttm_bo_device *bdev);
>    * Returns:
>    * !0: Failure.
>    */
> -int ttm_bo_device_init(struct ttm_bo_device *bdev, struct ttm_bo_global *glob,
> +int ttm_bo_device_init(struct ttm_bo_device *bdev,
>   		       struct ttm_bo_driver *driver,
>   		       struct address_space *mapping,
>   		       uint64_t file_page_offset, bool need_dma32);
> @@ -888,40 +885,4 @@ pgprot_t ttm_io_prot(uint32_t caching_flags, pgprot_t tmp);
>   
>   extern const struct ttm_mem_type_manager_func ttm_bo_manager_func;
>   
> -/**
> - * struct ttm_bo_global_ref - Argument to initialize a struct ttm_bo_global.
> - */
> -
> -struct ttm_bo_global_ref {
> -	struct drm_global_reference ref;
> -};
> -
> -/**
> - * ttm_bo_global_ref_init
> - *
> - * @ref: DRM global reference
> - *
> - * Helper function that initializes a struct ttm_bo_global. This function
> - * is used as init call-back function for DRM global references of type
> - * DRM_GLOBAL_TTM_BO_REF.
> - */
> -static inline int ttm_bo_global_ref_init(struct drm_global_reference *ref)
> -{
> -	return ttm_bo_global_init();
> -}
> -
> -/**
> - * ttm_bo_global_ref_release
> - *
> - * @ref: DRM global reference
> - *
> - * Helper function that releases a struct ttm_bo_global. This function
> - * is used as release call-back function for DRM global references of type
> - * DRM_GLOBAL_TTM_BO_REF.
> - */
> -static inline void ttm_bo_global_ref_release(struct drm_global_reference *ref)
> -{
> -	ttm_bo_global_release();
> -}
> -
>   #endif

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 4/5] drm/ttm: initialize globals during device init
       [not found]         ` <91e7b5e4-f91a-f3a9-983a-2f1dbb5bc6c9-5C7GfCeVMHo@public.gmane.org>
@ 2018-10-22 12:35           ` Christian König
       [not found]             ` <05f388d9-7f49-125c-22a7-395aec17e324-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
  0 siblings, 1 reply; 12+ messages in thread
From: Christian König @ 2018-10-22 12:35 UTC (permalink / raw)
  To: Zhang, Jerry(Junwei),
	dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW,
	tzimmermann-l3A5Bk7waGM,
	amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW

Am 22.10.18 um 08:45 schrieb Zhang, Jerry(Junwei):
> A question in ttm_bo.c
> [SNIP]
>>     int ttm_bo_device_release(struct ttm_bo_device *bdev)
>>   {
>> @@ -1623,18 +1620,25 @@ int ttm_bo_device_release(struct 
>> ttm_bo_device *bdev)
>> drm_vma_offset_manager_destroy(&bdev->vma_manager);
>>   +    if (!ret)
>> +        ttm_bo_global_release();
>
> if ttm_bo_clean_mm() fails, it will skip ttm_bo_global_release().
> When will it be called?

Never.

>
> Shall add it to delayed work? or maybe we could release it directly?

No, when ttm_bo_device_release() fails somebody is trying to unload a 
driver while this driver still has memory allocated.

In this case BO accounting should not be released because we should make 
sure that all the leaked memory is still accounted.

Christian.

>
> Regards,
> Jerry

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 4/5] drm/ttm: initialize globals during device init
       [not found]             ` <05f388d9-7f49-125c-22a7-395aec17e324-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
@ 2018-10-23  1:48               ` Zhang, Jerry(Junwei)
  0 siblings, 0 replies; 12+ messages in thread
From: Zhang, Jerry(Junwei) @ 2018-10-23  1:48 UTC (permalink / raw)
  To: christian.koenig-5C7GfCeVMHo,
	dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW,
	tzimmermann-l3A5Bk7waGM,
	amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW

On 10/22/2018 08:35 PM, Christian König wrote:
> Am 22.10.18 um 08:45 schrieb Zhang, Jerry(Junwei):
>> A question in ttm_bo.c
>> [SNIP]
>>>     int ttm_bo_device_release(struct ttm_bo_device *bdev)
>>>   {
>>> @@ -1623,18 +1620,25 @@ int ttm_bo_device_release(struct 
>>> ttm_bo_device *bdev)
>>> drm_vma_offset_manager_destroy(&bdev->vma_manager);
>>>   +    if (!ret)
>>> +        ttm_bo_global_release();
>>
>> if ttm_bo_clean_mm() fails, it will skip ttm_bo_global_release().
>> When will it be called?
>
> Never.
>
>>
>> Shall add it to delayed work? or maybe we could release it directly?
>
> No, when ttm_bo_device_release() fails somebody is trying to unload a 
> driver while this driver still has memory allocated.
>
> In this case BO accounting should not be released because we should 
> make sure that all the leaked memory is still accounted.

In this case, it's rather a bug to fix then.
Thanks to explain it .

looks fine for me, feel free to add
Reviewed-by: Junwei Zhang <Jerry.Zhang@amd.com>

Jerry

>
> Christian.
>
>>
>> Regards,
>> Jerry
>

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 1/5] drm/ttm: use a static ttm_mem_global instance
       [not found] ` <20181019164138.32993-1-christian.koenig-5C7GfCeVMHo@public.gmane.org>
                     ` (3 preceding siblings ...)
  2018-10-19 16:41   ` [PATCH 5/5] drm: Remove drm_global.{c,h} v2 Christian König
@ 2018-10-23  6:22   ` Thomas Zimmermann
  2018-10-23  9:12     ` Christian König
  4 siblings, 1 reply; 12+ messages in thread
From: Thomas Zimmermann @ 2018-10-23  6:22 UTC (permalink / raw)
  To: Christian König, dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW,
	amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW


[-- Attachment #1.1.1: Type: text/plain, Size: 16121 bytes --]

Hi Christian

Am 19.10.18 um 18:41 schrieb Christian König:
> As the name says we only need one global instance of ttm_mem_global.
> 
> Drop all the driver initialization and just use a single exported
> instance which is initialized during BO global initialization.
> 
> Signed-off-by: Christian König <christian.koenig-5C7GfCeVMHo@public.gmane.org>
> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c         | 44 -------------------------
>  drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h         |  1 -
>  drivers/gpu/drm/ast/ast_drv.h                   |  1 -
>  drivers/gpu/drm/ast/ast_ttm.c                   | 32 ++----------------
>  drivers/gpu/drm/bochs/bochs.h                   |  1 -
>  drivers/gpu/drm/bochs/bochs_mm.c                | 30 ++---------------
>  drivers/gpu/drm/cirrus/cirrus_drv.h             |  1 -
>  drivers/gpu/drm/cirrus/cirrus_ttm.c             | 32 ++----------------
>  drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h |  1 -
>  drivers/gpu/drm/hisilicon/hibmc/hibmc_ttm.c     | 31 +++--------------
>  drivers/gpu/drm/mgag200/mgag200_drv.h           |  1 -
>  drivers/gpu/drm/mgag200/mgag200_ttm.c           | 32 ++----------------
>  drivers/gpu/drm/nouveau/nouveau_drv.h           |  1 -
>  drivers/gpu/drm/nouveau/nouveau_ttm.c           | 34 ++-----------------
>  drivers/gpu/drm/qxl/qxl_drv.h                   |  1 -
>  drivers/gpu/drm/qxl/qxl_ttm.c                   | 28 ----------------
>  drivers/gpu/drm/radeon/radeon.h                 |  1 -
>  drivers/gpu/drm/radeon/radeon_ttm.c             | 26 ---------------
>  drivers/gpu/drm/ttm/ttm_bo.c                    | 10 ++++--
>  drivers/gpu/drm/ttm/ttm_memory.c                |  5 +--
>  drivers/gpu/drm/virtio/virtgpu_drv.h            |  1 -
>  drivers/gpu/drm/virtio/virtgpu_ttm.c            | 27 ---------------
>  drivers/gpu/drm/vmwgfx/vmwgfx_drv.c             |  4 +--
>  drivers/gpu/drm/vmwgfx/vmwgfx_drv.h             |  3 +-
>  drivers/gpu/drm/vmwgfx/vmwgfx_ttm_glue.c        | 27 ---------------
>  drivers/staging/vboxvideo/vbox_drv.h            |  1 -
>  drivers/staging/vboxvideo/vbox_ttm.c            | 24 --------------
>  include/drm/ttm/ttm_bo_driver.h                 |  8 ++---
>  include/drm/ttm/ttm_memory.h                    |  4 +--
>  29 files changed, 32 insertions(+), 380 deletions(-)

Great that you removed all the global TTM state from all the drivers.
This removes a lot of duplication and simplifies driver development a bit.


> diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c
> index 9edece6510d3..3006050b1720 100644
> --- a/drivers/gpu/drm/ttm/ttm_bo.c
> +++ b/drivers/gpu/drm/ttm/ttm_bo.c
> @@ -1526,18 +1526,22 @@ void ttm_bo_global_release(struct ttm_bo_global *glob)
>  {
>  	kobject_del(&glob->kobj);
>  	kobject_put(&glob->kobj);
> +	ttm_mem_global_release(&ttm_mem_glob);
>  }
>  EXPORT_SYMBOL(ttm_bo_global_release);
>  
> -int ttm_bo_global_init(struct ttm_bo_global *glob,
> -		       struct ttm_mem_global *mem_glob)
> +int ttm_bo_global_init(struct ttm_bo_global *glob)
>  {
>  	int ret;
>  	unsigned i;
>  
> +	ret = ttm_mem_global_init(&ttm_mem_glob);
> +	if (ret)
> +		return ret;
> +

What I really dislike about this patch set is that it mixes state and
implementation into that same functions. The original code had a fairly
good separation of both. Now the mechanisms and policies are located in
the same places.[^1]

This looks like a simplification, but from my experience, such code is a
setup for long-term maintenance problems. For example, I can imagine
that someone at some point wants multiple global buffers (e.g., on a
NUMA-like architecture).

I understand that I'm new here, have no say, and probably don't get the
big picture, but from my point of view, this is not a forward-thinking
change.

Best regards
Thomas

[^1] More philosophically speaking, program state can be global, but
data structures can only be share-able. ttm_mem_global and ttm_bo_global
should be renamed to something like ttm_shared_mem, rsp. ttm_shared_bo.


>  	mutex_init(&glob->device_list_mutex);
>  	spin_lock_init(&glob->lru_lock);
> -	glob->mem_glob = mem_glob;
> +	glob->mem_glob = &ttm_mem_glob;
>  	glob->mem_glob->bo_glob = glob;
>  	glob->dummy_read_page = alloc_page(__GFP_ZERO | GFP_DMA32);
>  
> diff --git a/drivers/gpu/drm/ttm/ttm_memory.c b/drivers/gpu/drm/ttm/ttm_memory.c
> index 450387c92b63..7704e17c402f 100644
> --- a/drivers/gpu/drm/ttm/ttm_memory.c
> +++ b/drivers/gpu/drm/ttm/ttm_memory.c
> @@ -41,6 +41,9 @@
>  
>  #define TTM_MEMORY_ALLOC_RETRIES 4
>  
> +struct ttm_mem_global ttm_mem_glob;
> +EXPORT_SYMBOL(ttm_mem_glob);
> +
>  struct ttm_mem_zone {
>  	struct kobject kobj;
>  	struct ttm_mem_global *glob;
> @@ -464,7 +467,6 @@ int ttm_mem_global_init(struct ttm_mem_global *glob)
>  	ttm_mem_global_release(glob);
>  	return ret;
>  }
> -EXPORT_SYMBOL(ttm_mem_global_init);
>  
>  void ttm_mem_global_release(struct ttm_mem_global *glob)
>  {
> @@ -486,7 +488,6 @@ void ttm_mem_global_release(struct ttm_mem_global *glob)
>  	kobject_del(&glob->kobj);
>  	kobject_put(&glob->kobj);
>  }
> -EXPORT_SYMBOL(ttm_mem_global_release);
>  
>  static void ttm_check_swapping(struct ttm_mem_global *glob)
>  {
> diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.h b/drivers/gpu/drm/virtio/virtgpu_drv.h
> index 65605e207bbe..dec42d421e00 100644
> --- a/drivers/gpu/drm/virtio/virtgpu_drv.h
> +++ b/drivers/gpu/drm/virtio/virtgpu_drv.h
> @@ -133,7 +133,6 @@ struct virtio_gpu_framebuffer {
>  
>  struct virtio_gpu_mman {
>  	struct ttm_bo_global_ref        bo_global_ref;
> -	struct drm_global_reference	mem_global_ref;
>  	bool				mem_global_referenced;
>  	struct ttm_bo_device		bdev;
>  };
> diff --git a/drivers/gpu/drm/virtio/virtgpu_ttm.c b/drivers/gpu/drm/virtio/virtgpu_ttm.c
> index 0ec46b47b423..b99ecc6d97d3 100644
> --- a/drivers/gpu/drm/virtio/virtgpu_ttm.c
> +++ b/drivers/gpu/drm/virtio/virtgpu_ttm.c
> @@ -50,37 +50,12 @@ virtio_gpu_device *virtio_gpu_get_vgdev(struct ttm_bo_device *bdev)
>  	return vgdev;
>  }
>  
> -static int virtio_gpu_ttm_mem_global_init(struct drm_global_reference *ref)
> -{
> -	return ttm_mem_global_init(ref->object);
> -}
> -
> -static void virtio_gpu_ttm_mem_global_release(struct drm_global_reference *ref)
> -{
> -	ttm_mem_global_release(ref->object);
> -}
> -
>  static int virtio_gpu_ttm_global_init(struct virtio_gpu_device *vgdev)
>  {
>  	struct drm_global_reference *global_ref;
>  	int r;
>  
>  	vgdev->mman.mem_global_referenced = false;
> -	global_ref = &vgdev->mman.mem_global_ref;
> -	global_ref->global_type = DRM_GLOBAL_TTM_MEM;
> -	global_ref->size = sizeof(struct ttm_mem_global);
> -	global_ref->init = &virtio_gpu_ttm_mem_global_init;
> -	global_ref->release = &virtio_gpu_ttm_mem_global_release;
> -
> -	r = drm_global_item_ref(global_ref);
> -	if (r != 0) {
> -		DRM_ERROR("Failed setting up TTM memory accounting "
> -			  "subsystem.\n");
> -		return r;
> -	}
> -
> -	vgdev->mman.bo_global_ref.mem_glob =
> -		vgdev->mman.mem_global_ref.object;
>  	global_ref = &vgdev->mman.bo_global_ref.ref;
>  	global_ref->global_type = DRM_GLOBAL_TTM_BO;
>  	global_ref->size = sizeof(struct ttm_bo_global);
> @@ -89,7 +64,6 @@ static int virtio_gpu_ttm_global_init(struct virtio_gpu_device *vgdev)
>  	r = drm_global_item_ref(global_ref);
>  	if (r != 0) {
>  		DRM_ERROR("Failed setting up TTM BO subsystem.\n");
> -		drm_global_item_unref(&vgdev->mman.mem_global_ref);
>  		return r;
>  	}
>  
> @@ -101,7 +75,6 @@ static void virtio_gpu_ttm_global_fini(struct virtio_gpu_device *vgdev)
>  {
>  	if (vgdev->mman.mem_global_referenced) {
>  		drm_global_item_unref(&vgdev->mman.bo_global_ref.ref);
> -		drm_global_item_unref(&vgdev->mman.mem_global_ref);
>  		vgdev->mman.mem_global_referenced = false;
>  	}
>  }
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
> index bb6dbbe18835..57df776d987c 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
> @@ -828,8 +828,8 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
>  		goto out_err4;
>  	}
>  
> -	dev_priv->tdev = ttm_object_device_init
> -		(dev_priv->mem_global_ref.object, 12, &vmw_prime_dmabuf_ops);
> +	dev_priv->tdev = ttm_object_device_init(&ttm_mem_glob, 12,
> +						&vmw_prime_dmabuf_ops);
>  
>  	if (unlikely(dev_priv->tdev == NULL)) {
>  		DRM_ERROR("Unable to initialize TTM object management.\n");
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
> index 1abe21758b0d..df15a745efc3 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
> @@ -366,7 +366,6 @@ enum {
>  struct vmw_private {
>  	struct ttm_bo_device bdev;
>  	struct ttm_bo_global_ref bo_global_ref;
> -	struct drm_global_reference mem_global_ref;
>  
>  	struct vmw_fifo_state fifo;
>  
> @@ -1288,7 +1287,7 @@ vmw_bo_reference(struct vmw_buffer_object *buf)
>  
>  static inline struct ttm_mem_global *vmw_mem_glob(struct vmw_private *dev_priv)
>  {
> -	return (struct ttm_mem_global *) dev_priv->mem_global_ref.object;
> +	return &ttm_mem_glob;
>  }
>  
>  static inline void vmw_fifo_resource_inc(struct vmw_private *dev_priv)
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_glue.c b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_glue.c
> index f3ce43c41978..0ac473cd5136 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_glue.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_glue.c
> @@ -43,36 +43,11 @@ int vmw_mmap(struct file *filp, struct vm_area_struct *vma)
>  	return ttm_bo_mmap(filp, vma, &dev_priv->bdev);
>  }
>  
> -static int vmw_ttm_mem_global_init(struct drm_global_reference *ref)
> -{
> -	DRM_INFO("global init.\n");
> -	return ttm_mem_global_init(ref->object);
> -}
> -
> -static void vmw_ttm_mem_global_release(struct drm_global_reference *ref)
> -{
> -	ttm_mem_global_release(ref->object);
> -}
> -
>  int vmw_ttm_global_init(struct vmw_private *dev_priv)
>  {
>  	struct drm_global_reference *global_ref;
>  	int ret;
>  
> -	global_ref = &dev_priv->mem_global_ref;
> -	global_ref->global_type = DRM_GLOBAL_TTM_MEM;
> -	global_ref->size = sizeof(struct ttm_mem_global);
> -	global_ref->init = &vmw_ttm_mem_global_init;
> -	global_ref->release = &vmw_ttm_mem_global_release;
> -
> -	ret = drm_global_item_ref(global_ref);
> -	if (unlikely(ret != 0)) {
> -		DRM_ERROR("Failed setting up TTM memory accounting.\n");
> -		return ret;
> -	}
> -
> -	dev_priv->bo_global_ref.mem_glob =
> -		dev_priv->mem_global_ref.object;
>  	global_ref = &dev_priv->bo_global_ref.ref;
>  	global_ref->global_type = DRM_GLOBAL_TTM_BO;
>  	global_ref->size = sizeof(struct ttm_bo_global);
> @@ -87,12 +62,10 @@ int vmw_ttm_global_init(struct vmw_private *dev_priv)
>  
>  	return 0;
>  out_no_bo:
> -	drm_global_item_unref(&dev_priv->mem_global_ref);
>  	return ret;
>  }
>  
>  void vmw_ttm_global_release(struct vmw_private *dev_priv)
>  {
>  	drm_global_item_unref(&dev_priv->bo_global_ref.ref);
> -	drm_global_item_unref(&dev_priv->mem_global_ref);
>  }
> diff --git a/drivers/staging/vboxvideo/vbox_drv.h b/drivers/staging/vboxvideo/vbox_drv.h
> index 594f84272957..41f760b77704 100644
> --- a/drivers/staging/vboxvideo/vbox_drv.h
> +++ b/drivers/staging/vboxvideo/vbox_drv.h
> @@ -95,7 +95,6 @@ struct vbox_private {
>  	int fb_mtrr;
>  
>  	struct {
> -		struct drm_global_reference mem_global_ref;
>  		struct ttm_bo_global_ref bo_global_ref;
>  		struct ttm_bo_device bdev;
>  	} ttm;
> diff --git a/drivers/staging/vboxvideo/vbox_ttm.c b/drivers/staging/vboxvideo/vbox_ttm.c
> index 2329a55d4636..88cdacf2b0f0 100644
> --- a/drivers/staging/vboxvideo/vbox_ttm.c
> +++ b/drivers/staging/vboxvideo/vbox_ttm.c
> @@ -35,16 +35,6 @@ static inline struct vbox_private *vbox_bdev(struct ttm_bo_device *bd)
>  	return container_of(bd, struct vbox_private, ttm.bdev);
>  }
>  
> -static int vbox_ttm_mem_global_init(struct drm_global_reference *ref)
> -{
> -	return ttm_mem_global_init(ref->object);
> -}
> -
> -static void vbox_ttm_mem_global_release(struct drm_global_reference *ref)
> -{
> -	ttm_mem_global_release(ref->object);
> -}
> -
>  /**
>   * Adds the vbox memory manager object/structures to the global memory manager.
>   */
> @@ -53,18 +43,6 @@ static int vbox_ttm_global_init(struct vbox_private *vbox)
>  	struct drm_global_reference *global_ref;
>  	int ret;
>  
> -	global_ref = &vbox->ttm.mem_global_ref;
> -	global_ref->global_type = DRM_GLOBAL_TTM_MEM;
> -	global_ref->size = sizeof(struct ttm_mem_global);
> -	global_ref->init = &vbox_ttm_mem_global_init;
> -	global_ref->release = &vbox_ttm_mem_global_release;
> -	ret = drm_global_item_ref(global_ref);
> -	if (ret) {
> -		DRM_ERROR("Failed setting up TTM memory subsystem.\n");
> -		return ret;
> -	}
> -
> -	vbox->ttm.bo_global_ref.mem_glob = vbox->ttm.mem_global_ref.object;
>  	global_ref = &vbox->ttm.bo_global_ref.ref;
>  	global_ref->global_type = DRM_GLOBAL_TTM_BO;
>  	global_ref->size = sizeof(struct ttm_bo_global);
> @@ -74,7 +52,6 @@ static int vbox_ttm_global_init(struct vbox_private *vbox)
>  	ret = drm_global_item_ref(global_ref);
>  	if (ret) {
>  		DRM_ERROR("Failed setting up TTM BO subsystem.\n");
> -		drm_global_item_unref(&vbox->ttm.mem_global_ref);
>  		return ret;
>  	}
>  
> @@ -87,7 +64,6 @@ static int vbox_ttm_global_init(struct vbox_private *vbox)
>  static void vbox_ttm_global_release(struct vbox_private *vbox)
>  {
>  	drm_global_item_unref(&vbox->ttm.bo_global_ref.ref);
> -	drm_global_item_unref(&vbox->ttm.mem_global_ref);
>  }
>  
>  static void vbox_bo_ttm_destroy(struct ttm_buffer_object *tbo)
> diff --git a/include/drm/ttm/ttm_bo_driver.h b/include/drm/ttm/ttm_bo_driver.h
> index c6ee07d10281..4ae6fc33f761 100644
> --- a/include/drm/ttm/ttm_bo_driver.h
> +++ b/include/drm/ttm/ttm_bo_driver.h
> @@ -570,8 +570,7 @@ void ttm_bo_mem_put_locked(struct ttm_buffer_object *bo,
>  			   struct ttm_mem_reg *mem);
>  
>  void ttm_bo_global_release(struct ttm_bo_global *glob);
> -int ttm_bo_global_init(struct ttm_bo_global *glob,
> -		       struct ttm_mem_global *mem_glob);
> +int ttm_bo_global_init(struct ttm_bo_global *glob);
>  
>  int ttm_bo_device_release(struct ttm_bo_device *bdev);
>  
> @@ -895,7 +894,6 @@ extern const struct ttm_mem_type_manager_func ttm_bo_manager_func;
>  
>  struct ttm_bo_global_ref {
>  	struct drm_global_reference ref;
> -	struct ttm_mem_global *mem_glob;
>  };
>  
>  /**
> @@ -909,9 +907,7 @@ struct ttm_bo_global_ref {
>   */
>  static inline int ttm_bo_global_ref_init(struct drm_global_reference *ref)
>  {
> -	struct ttm_bo_global_ref *bo_ref =
> -		container_of(ref, struct ttm_bo_global_ref, ref);
> -	return ttm_bo_global_init(ref->object, bo_ref->mem_glob);
> +	return ttm_bo_global_init(ref->object);
>  }
>  
>  /**
> diff --git a/include/drm/ttm/ttm_memory.h b/include/drm/ttm/ttm_memory.h
> index 737b5fed8003..3ff48a0a2d7b 100644
> --- a/include/drm/ttm/ttm_memory.h
> +++ b/include/drm/ttm/ttm_memory.h
> @@ -63,7 +63,7 @@
>  
>  #define TTM_MEM_MAX_ZONES 2
>  struct ttm_mem_zone;
> -struct ttm_mem_global {
> +extern struct ttm_mem_global {
>  	struct kobject kobj;
>  	struct ttm_bo_global *bo_glob;
>  	struct workqueue_struct *swap_queue;
> @@ -78,7 +78,7 @@ struct ttm_mem_global {
>  #else
>  	struct ttm_mem_zone *zone_dma32;
>  #endif
> -};
> +} ttm_mem_glob;
>  
>  extern int ttm_mem_global_init(struct ttm_mem_global *glob);
>  extern void ttm_mem_global_release(struct ttm_mem_global *glob);
> 

-- 
Thomas Zimmermann
Graphics Driver Developer
SUSE Linux GmbH, Maxfeldstr. 5, D-90409 Nürnberg
Tel: +49-911-74053-0; Fax: +49-911-7417755;  https://www.suse.com/
SUSE Linux GmbH, GF: Felix Imendörffer, Jane Smithard,
Graham Norton, HRB 21284 (AG Nürnberg)


[-- Attachment #1.2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

[-- Attachment #2: Type: text/plain, Size: 154 bytes --]

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 1/5] drm/ttm: use a static ttm_mem_global instance
  2018-10-23  6:22   ` [PATCH 1/5] drm/ttm: use a static ttm_mem_global instance Thomas Zimmermann
@ 2018-10-23  9:12     ` Christian König
  0 siblings, 0 replies; 12+ messages in thread
From: Christian König @ 2018-10-23  9:12 UTC (permalink / raw)
  To: Thomas Zimmermann, dri-devel, amd-gfx

Am 23.10.18 um 08:22 schrieb Thomas Zimmermann:
> Hi Christian
>
> Am 19.10.18 um 18:41 schrieb Christian König:
>> As the name says we only need one global instance of ttm_mem_global.
>>
>> Drop all the driver initialization and just use a single exported
>> instance which is initialized during BO global initialization.
>>
>> Signed-off-by: Christian König <christian.koenig@amd.com>
>> ---
>>   drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c         | 44 -------------------------
>>   drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h         |  1 -
>>   drivers/gpu/drm/ast/ast_drv.h                   |  1 -
>>   drivers/gpu/drm/ast/ast_ttm.c                   | 32 ++----------------
>>   drivers/gpu/drm/bochs/bochs.h                   |  1 -
>>   drivers/gpu/drm/bochs/bochs_mm.c                | 30 ++---------------
>>   drivers/gpu/drm/cirrus/cirrus_drv.h             |  1 -
>>   drivers/gpu/drm/cirrus/cirrus_ttm.c             | 32 ++----------------
>>   drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h |  1 -
>>   drivers/gpu/drm/hisilicon/hibmc/hibmc_ttm.c     | 31 +++--------------
>>   drivers/gpu/drm/mgag200/mgag200_drv.h           |  1 -
>>   drivers/gpu/drm/mgag200/mgag200_ttm.c           | 32 ++----------------
>>   drivers/gpu/drm/nouveau/nouveau_drv.h           |  1 -
>>   drivers/gpu/drm/nouveau/nouveau_ttm.c           | 34 ++-----------------
>>   drivers/gpu/drm/qxl/qxl_drv.h                   |  1 -
>>   drivers/gpu/drm/qxl/qxl_ttm.c                   | 28 ----------------
>>   drivers/gpu/drm/radeon/radeon.h                 |  1 -
>>   drivers/gpu/drm/radeon/radeon_ttm.c             | 26 ---------------
>>   drivers/gpu/drm/ttm/ttm_bo.c                    | 10 ++++--
>>   drivers/gpu/drm/ttm/ttm_memory.c                |  5 +--
>>   drivers/gpu/drm/virtio/virtgpu_drv.h            |  1 -
>>   drivers/gpu/drm/virtio/virtgpu_ttm.c            | 27 ---------------
>>   drivers/gpu/drm/vmwgfx/vmwgfx_drv.c             |  4 +--
>>   drivers/gpu/drm/vmwgfx/vmwgfx_drv.h             |  3 +-
>>   drivers/gpu/drm/vmwgfx/vmwgfx_ttm_glue.c        | 27 ---------------
>>   drivers/staging/vboxvideo/vbox_drv.h            |  1 -
>>   drivers/staging/vboxvideo/vbox_ttm.c            | 24 --------------
>>   include/drm/ttm/ttm_bo_driver.h                 |  8 ++---
>>   include/drm/ttm/ttm_memory.h                    |  4 +--
>>   29 files changed, 32 insertions(+), 380 deletions(-)
> Great that you removed all the global TTM state from all the drivers.
> This removes a lot of duplication and simplifies driver development a bit.
>
>
>> diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c
>> index 9edece6510d3..3006050b1720 100644
>> --- a/drivers/gpu/drm/ttm/ttm_bo.c
>> +++ b/drivers/gpu/drm/ttm/ttm_bo.c
>> @@ -1526,18 +1526,22 @@ void ttm_bo_global_release(struct ttm_bo_global *glob)
>>   {
>>   	kobject_del(&glob->kobj);
>>   	kobject_put(&glob->kobj);
>> +	ttm_mem_global_release(&ttm_mem_glob);
>>   }
>>   EXPORT_SYMBOL(ttm_bo_global_release);
>>   
>> -int ttm_bo_global_init(struct ttm_bo_global *glob,
>> -		       struct ttm_mem_global *mem_glob)
>> +int ttm_bo_global_init(struct ttm_bo_global *glob)
>>   {
>>   	int ret;
>>   	unsigned i;
>>   
>> +	ret = ttm_mem_global_init(&ttm_mem_glob);
>> +	if (ret)
>> +		return ret;
>> +
> What I really dislike about this patch set is that it mixes state and
> implementation into that same functions. The original code had a fairly
> good separation of both. Now the mechanisms and policies are located in
> the same places.[^1]
>
> This looks like a simplification, but from my experience, such code is a
> setup for long-term maintenance problems. For example, I can imagine
> that someone at some point wants multiple global buffers (e.g., on a
> NUMA-like architecture).

That is exactly the thinking which messed up things in the first place. 
Keep in mind that this is the kernel and not a userspace C++ project.

Handling this as global state in a module is perfectly and we already 
support NUMA use cases with this. E.g. if we would have this state 
multiple times I would actually consider this a bug.

So pushing this into a structure makes it much more error prone and 
doesn't buy us anything.

In the long term I'm actually thinking about getting completely rid of 
the ttm_mem_global and ttm_bo_global and just use static variables for this.

Regards,
Christian.

>
> I understand that I'm new here, have no say, and probably don't get the
> big picture, but from my point of view, this is not a forward-thinking
> change.
>
> Best regards
> Thomas
>
> [^1] More philosophically speaking, program state can be global, but
> data structures can only be share-able. ttm_mem_global and ttm_bo_global
> should be renamed to something like ttm_shared_mem, rsp. ttm_shared_bo.
>
>
>>   	mutex_init(&glob->device_list_mutex);
>>   	spin_lock_init(&glob->lru_lock);
>> -	glob->mem_glob = mem_glob;
>> +	glob->mem_glob = &ttm_mem_glob;
>>   	glob->mem_glob->bo_glob = glob;
>>   	glob->dummy_read_page = alloc_page(__GFP_ZERO | GFP_DMA32);
>>   
>> diff --git a/drivers/gpu/drm/ttm/ttm_memory.c b/drivers/gpu/drm/ttm/ttm_memory.c
>> index 450387c92b63..7704e17c402f 100644
>> --- a/drivers/gpu/drm/ttm/ttm_memory.c
>> +++ b/drivers/gpu/drm/ttm/ttm_memory.c
>> @@ -41,6 +41,9 @@
>>   
>>   #define TTM_MEMORY_ALLOC_RETRIES 4
>>   
>> +struct ttm_mem_global ttm_mem_glob;
>> +EXPORT_SYMBOL(ttm_mem_glob);
>> +
>>   struct ttm_mem_zone {
>>   	struct kobject kobj;
>>   	struct ttm_mem_global *glob;
>> @@ -464,7 +467,6 @@ int ttm_mem_global_init(struct ttm_mem_global *glob)
>>   	ttm_mem_global_release(glob);
>>   	return ret;
>>   }
>> -EXPORT_SYMBOL(ttm_mem_global_init);
>>   
>>   void ttm_mem_global_release(struct ttm_mem_global *glob)
>>   {
>> @@ -486,7 +488,6 @@ void ttm_mem_global_release(struct ttm_mem_global *glob)
>>   	kobject_del(&glob->kobj);
>>   	kobject_put(&glob->kobj);
>>   }
>> -EXPORT_SYMBOL(ttm_mem_global_release);
>>   
>>   static void ttm_check_swapping(struct ttm_mem_global *glob)
>>   {
>> diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.h b/drivers/gpu/drm/virtio/virtgpu_drv.h
>> index 65605e207bbe..dec42d421e00 100644
>> --- a/drivers/gpu/drm/virtio/virtgpu_drv.h
>> +++ b/drivers/gpu/drm/virtio/virtgpu_drv.h
>> @@ -133,7 +133,6 @@ struct virtio_gpu_framebuffer {
>>   
>>   struct virtio_gpu_mman {
>>   	struct ttm_bo_global_ref        bo_global_ref;
>> -	struct drm_global_reference	mem_global_ref;
>>   	bool				mem_global_referenced;
>>   	struct ttm_bo_device		bdev;
>>   };
>> diff --git a/drivers/gpu/drm/virtio/virtgpu_ttm.c b/drivers/gpu/drm/virtio/virtgpu_ttm.c
>> index 0ec46b47b423..b99ecc6d97d3 100644
>> --- a/drivers/gpu/drm/virtio/virtgpu_ttm.c
>> +++ b/drivers/gpu/drm/virtio/virtgpu_ttm.c
>> @@ -50,37 +50,12 @@ virtio_gpu_device *virtio_gpu_get_vgdev(struct ttm_bo_device *bdev)
>>   	return vgdev;
>>   }
>>   
>> -static int virtio_gpu_ttm_mem_global_init(struct drm_global_reference *ref)
>> -{
>> -	return ttm_mem_global_init(ref->object);
>> -}
>> -
>> -static void virtio_gpu_ttm_mem_global_release(struct drm_global_reference *ref)
>> -{
>> -	ttm_mem_global_release(ref->object);
>> -}
>> -
>>   static int virtio_gpu_ttm_global_init(struct virtio_gpu_device *vgdev)
>>   {
>>   	struct drm_global_reference *global_ref;
>>   	int r;
>>   
>>   	vgdev->mman.mem_global_referenced = false;
>> -	global_ref = &vgdev->mman.mem_global_ref;
>> -	global_ref->global_type = DRM_GLOBAL_TTM_MEM;
>> -	global_ref->size = sizeof(struct ttm_mem_global);
>> -	global_ref->init = &virtio_gpu_ttm_mem_global_init;
>> -	global_ref->release = &virtio_gpu_ttm_mem_global_release;
>> -
>> -	r = drm_global_item_ref(global_ref);
>> -	if (r != 0) {
>> -		DRM_ERROR("Failed setting up TTM memory accounting "
>> -			  "subsystem.\n");
>> -		return r;
>> -	}
>> -
>> -	vgdev->mman.bo_global_ref.mem_glob =
>> -		vgdev->mman.mem_global_ref.object;
>>   	global_ref = &vgdev->mman.bo_global_ref.ref;
>>   	global_ref->global_type = DRM_GLOBAL_TTM_BO;
>>   	global_ref->size = sizeof(struct ttm_bo_global);
>> @@ -89,7 +64,6 @@ static int virtio_gpu_ttm_global_init(struct virtio_gpu_device *vgdev)
>>   	r = drm_global_item_ref(global_ref);
>>   	if (r != 0) {
>>   		DRM_ERROR("Failed setting up TTM BO subsystem.\n");
>> -		drm_global_item_unref(&vgdev->mman.mem_global_ref);
>>   		return r;
>>   	}
>>   
>> @@ -101,7 +75,6 @@ static void virtio_gpu_ttm_global_fini(struct virtio_gpu_device *vgdev)
>>   {
>>   	if (vgdev->mman.mem_global_referenced) {
>>   		drm_global_item_unref(&vgdev->mman.bo_global_ref.ref);
>> -		drm_global_item_unref(&vgdev->mman.mem_global_ref);
>>   		vgdev->mman.mem_global_referenced = false;
>>   	}
>>   }
>> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
>> index bb6dbbe18835..57df776d987c 100644
>> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
>> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
>> @@ -828,8 +828,8 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
>>   		goto out_err4;
>>   	}
>>   
>> -	dev_priv->tdev = ttm_object_device_init
>> -		(dev_priv->mem_global_ref.object, 12, &vmw_prime_dmabuf_ops);
>> +	dev_priv->tdev = ttm_object_device_init(&ttm_mem_glob, 12,
>> +						&vmw_prime_dmabuf_ops);
>>   
>>   	if (unlikely(dev_priv->tdev == NULL)) {
>>   		DRM_ERROR("Unable to initialize TTM object management.\n");
>> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
>> index 1abe21758b0d..df15a745efc3 100644
>> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
>> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
>> @@ -366,7 +366,6 @@ enum {
>>   struct vmw_private {
>>   	struct ttm_bo_device bdev;
>>   	struct ttm_bo_global_ref bo_global_ref;
>> -	struct drm_global_reference mem_global_ref;
>>   
>>   	struct vmw_fifo_state fifo;
>>   
>> @@ -1288,7 +1287,7 @@ vmw_bo_reference(struct vmw_buffer_object *buf)
>>   
>>   static inline struct ttm_mem_global *vmw_mem_glob(struct vmw_private *dev_priv)
>>   {
>> -	return (struct ttm_mem_global *) dev_priv->mem_global_ref.object;
>> +	return &ttm_mem_glob;
>>   }
>>   
>>   static inline void vmw_fifo_resource_inc(struct vmw_private *dev_priv)
>> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_glue.c b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_glue.c
>> index f3ce43c41978..0ac473cd5136 100644
>> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_glue.c
>> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_glue.c
>> @@ -43,36 +43,11 @@ int vmw_mmap(struct file *filp, struct vm_area_struct *vma)
>>   	return ttm_bo_mmap(filp, vma, &dev_priv->bdev);
>>   }
>>   
>> -static int vmw_ttm_mem_global_init(struct drm_global_reference *ref)
>> -{
>> -	DRM_INFO("global init.\n");
>> -	return ttm_mem_global_init(ref->object);
>> -}
>> -
>> -static void vmw_ttm_mem_global_release(struct drm_global_reference *ref)
>> -{
>> -	ttm_mem_global_release(ref->object);
>> -}
>> -
>>   int vmw_ttm_global_init(struct vmw_private *dev_priv)
>>   {
>>   	struct drm_global_reference *global_ref;
>>   	int ret;
>>   
>> -	global_ref = &dev_priv->mem_global_ref;
>> -	global_ref->global_type = DRM_GLOBAL_TTM_MEM;
>> -	global_ref->size = sizeof(struct ttm_mem_global);
>> -	global_ref->init = &vmw_ttm_mem_global_init;
>> -	global_ref->release = &vmw_ttm_mem_global_release;
>> -
>> -	ret = drm_global_item_ref(global_ref);
>> -	if (unlikely(ret != 0)) {
>> -		DRM_ERROR("Failed setting up TTM memory accounting.\n");
>> -		return ret;
>> -	}
>> -
>> -	dev_priv->bo_global_ref.mem_glob =
>> -		dev_priv->mem_global_ref.object;
>>   	global_ref = &dev_priv->bo_global_ref.ref;
>>   	global_ref->global_type = DRM_GLOBAL_TTM_BO;
>>   	global_ref->size = sizeof(struct ttm_bo_global);
>> @@ -87,12 +62,10 @@ int vmw_ttm_global_init(struct vmw_private *dev_priv)
>>   
>>   	return 0;
>>   out_no_bo:
>> -	drm_global_item_unref(&dev_priv->mem_global_ref);
>>   	return ret;
>>   }
>>   
>>   void vmw_ttm_global_release(struct vmw_private *dev_priv)
>>   {
>>   	drm_global_item_unref(&dev_priv->bo_global_ref.ref);
>> -	drm_global_item_unref(&dev_priv->mem_global_ref);
>>   }
>> diff --git a/drivers/staging/vboxvideo/vbox_drv.h b/drivers/staging/vboxvideo/vbox_drv.h
>> index 594f84272957..41f760b77704 100644
>> --- a/drivers/staging/vboxvideo/vbox_drv.h
>> +++ b/drivers/staging/vboxvideo/vbox_drv.h
>> @@ -95,7 +95,6 @@ struct vbox_private {
>>   	int fb_mtrr;
>>   
>>   	struct {
>> -		struct drm_global_reference mem_global_ref;
>>   		struct ttm_bo_global_ref bo_global_ref;
>>   		struct ttm_bo_device bdev;
>>   	} ttm;
>> diff --git a/drivers/staging/vboxvideo/vbox_ttm.c b/drivers/staging/vboxvideo/vbox_ttm.c
>> index 2329a55d4636..88cdacf2b0f0 100644
>> --- a/drivers/staging/vboxvideo/vbox_ttm.c
>> +++ b/drivers/staging/vboxvideo/vbox_ttm.c
>> @@ -35,16 +35,6 @@ static inline struct vbox_private *vbox_bdev(struct ttm_bo_device *bd)
>>   	return container_of(bd, struct vbox_private, ttm.bdev);
>>   }
>>   
>> -static int vbox_ttm_mem_global_init(struct drm_global_reference *ref)
>> -{
>> -	return ttm_mem_global_init(ref->object);
>> -}
>> -
>> -static void vbox_ttm_mem_global_release(struct drm_global_reference *ref)
>> -{
>> -	ttm_mem_global_release(ref->object);
>> -}
>> -
>>   /**
>>    * Adds the vbox memory manager object/structures to the global memory manager.
>>    */
>> @@ -53,18 +43,6 @@ static int vbox_ttm_global_init(struct vbox_private *vbox)
>>   	struct drm_global_reference *global_ref;
>>   	int ret;
>>   
>> -	global_ref = &vbox->ttm.mem_global_ref;
>> -	global_ref->global_type = DRM_GLOBAL_TTM_MEM;
>> -	global_ref->size = sizeof(struct ttm_mem_global);
>> -	global_ref->init = &vbox_ttm_mem_global_init;
>> -	global_ref->release = &vbox_ttm_mem_global_release;
>> -	ret = drm_global_item_ref(global_ref);
>> -	if (ret) {
>> -		DRM_ERROR("Failed setting up TTM memory subsystem.\n");
>> -		return ret;
>> -	}
>> -
>> -	vbox->ttm.bo_global_ref.mem_glob = vbox->ttm.mem_global_ref.object;
>>   	global_ref = &vbox->ttm.bo_global_ref.ref;
>>   	global_ref->global_type = DRM_GLOBAL_TTM_BO;
>>   	global_ref->size = sizeof(struct ttm_bo_global);
>> @@ -74,7 +52,6 @@ static int vbox_ttm_global_init(struct vbox_private *vbox)
>>   	ret = drm_global_item_ref(global_ref);
>>   	if (ret) {
>>   		DRM_ERROR("Failed setting up TTM BO subsystem.\n");
>> -		drm_global_item_unref(&vbox->ttm.mem_global_ref);
>>   		return ret;
>>   	}
>>   
>> @@ -87,7 +64,6 @@ static int vbox_ttm_global_init(struct vbox_private *vbox)
>>   static void vbox_ttm_global_release(struct vbox_private *vbox)
>>   {
>>   	drm_global_item_unref(&vbox->ttm.bo_global_ref.ref);
>> -	drm_global_item_unref(&vbox->ttm.mem_global_ref);
>>   }
>>   
>>   static void vbox_bo_ttm_destroy(struct ttm_buffer_object *tbo)
>> diff --git a/include/drm/ttm/ttm_bo_driver.h b/include/drm/ttm/ttm_bo_driver.h
>> index c6ee07d10281..4ae6fc33f761 100644
>> --- a/include/drm/ttm/ttm_bo_driver.h
>> +++ b/include/drm/ttm/ttm_bo_driver.h
>> @@ -570,8 +570,7 @@ void ttm_bo_mem_put_locked(struct ttm_buffer_object *bo,
>>   			   struct ttm_mem_reg *mem);
>>   
>>   void ttm_bo_global_release(struct ttm_bo_global *glob);
>> -int ttm_bo_global_init(struct ttm_bo_global *glob,
>> -		       struct ttm_mem_global *mem_glob);
>> +int ttm_bo_global_init(struct ttm_bo_global *glob);
>>   
>>   int ttm_bo_device_release(struct ttm_bo_device *bdev);
>>   
>> @@ -895,7 +894,6 @@ extern const struct ttm_mem_type_manager_func ttm_bo_manager_func;
>>   
>>   struct ttm_bo_global_ref {
>>   	struct drm_global_reference ref;
>> -	struct ttm_mem_global *mem_glob;
>>   };
>>   
>>   /**
>> @@ -909,9 +907,7 @@ struct ttm_bo_global_ref {
>>    */
>>   static inline int ttm_bo_global_ref_init(struct drm_global_reference *ref)
>>   {
>> -	struct ttm_bo_global_ref *bo_ref =
>> -		container_of(ref, struct ttm_bo_global_ref, ref);
>> -	return ttm_bo_global_init(ref->object, bo_ref->mem_glob);
>> +	return ttm_bo_global_init(ref->object);
>>   }
>>   
>>   /**
>> diff --git a/include/drm/ttm/ttm_memory.h b/include/drm/ttm/ttm_memory.h
>> index 737b5fed8003..3ff48a0a2d7b 100644
>> --- a/include/drm/ttm/ttm_memory.h
>> +++ b/include/drm/ttm/ttm_memory.h
>> @@ -63,7 +63,7 @@
>>   
>>   #define TTM_MEM_MAX_ZONES 2
>>   struct ttm_mem_zone;
>> -struct ttm_mem_global {
>> +extern struct ttm_mem_global {
>>   	struct kobject kobj;
>>   	struct ttm_bo_global *bo_glob;
>>   	struct workqueue_struct *swap_queue;
>> @@ -78,7 +78,7 @@ struct ttm_mem_global {
>>   #else
>>   	struct ttm_mem_zone *zone_dma32;
>>   #endif
>> -};
>> +} ttm_mem_glob;
>>   
>>   extern int ttm_mem_global_init(struct ttm_mem_global *glob);
>>   extern void ttm_mem_global_release(struct ttm_mem_global *glob);
>>

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2018-10-23  9:12 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-10-19 16:41 [PATCH 1/5] drm/ttm: use a static ttm_mem_global instance Christian König
     [not found] ` <20181019164138.32993-1-christian.koenig-5C7GfCeVMHo@public.gmane.org>
2018-10-19 16:41   ` [PATCH 2/5] drm/ttm: make the device list mutex static Christian König
2018-10-19 16:41   ` [PATCH 3/5] drm/ttm: use a static ttm_bo_global instance Christian König
2018-10-19 16:41   ` [PATCH 4/5] drm/ttm: initialize globals during device init Christian König
     [not found]     ` <20181019164138.32993-4-christian.koenig-5C7GfCeVMHo@public.gmane.org>
2018-10-22  6:45       ` Zhang, Jerry(Junwei)
     [not found]         ` <91e7b5e4-f91a-f3a9-983a-2f1dbb5bc6c9-5C7GfCeVMHo@public.gmane.org>
2018-10-22 12:35           ` Christian König
     [not found]             ` <05f388d9-7f49-125c-22a7-395aec17e324-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2018-10-23  1:48               ` Zhang, Jerry(Junwei)
2018-10-22  6:51       ` Zhang, Jerry(Junwei)
2018-10-19 16:41   ` [PATCH 5/5] drm: Remove drm_global.{c,h} v2 Christian König
2018-10-23  6:22   ` [PATCH 1/5] drm/ttm: use a static ttm_mem_global instance Thomas Zimmermann
2018-10-23  9:12     ` Christian König
2018-10-22  6:47 ` Zhang, Jerry(Junwei)

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.