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

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: signature.asc
Description: OpenPGP digital signature

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

Reply via email to