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.koe...@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

Reply via email to