OSDN Git Service

drm/vmwgfx/ttm: move thp to driver managed
authorDave Airlie <airlied@redhat.com>
Tue, 4 Aug 2020 02:56:21 +0000 (12:56 +1000)
committerDave Airlie <airlied@redhat.com>
Thu, 6 Aug 2020 03:12:39 +0000 (13:12 +1000)
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: Dave Airlie <airlied@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200804025632.3868079-49-airlied@gmail.com
drivers/gpu/drm/vmwgfx/vmwgfx_thp.c

index 720a242..1cefd9c 100644 (file)
  * @lock: Manager lock.
  */
 struct vmw_thp_manager {
+       struct ttm_mem_type_manager manager;
        struct drm_mm mm;
        spinlock_t lock;
 };
 
+static struct vmw_thp_manager *to_thp_manager(struct ttm_mem_type_manager *man)
+{
+       return container_of(man, struct vmw_thp_manager, manager);
+}
+
 static int vmw_thp_insert_aligned(struct drm_mm *mm, struct drm_mm_node *node,
                                  unsigned long align_pages,
                                  const struct ttm_place *place,
@@ -43,7 +49,7 @@ static int vmw_thp_get_node(struct ttm_mem_type_manager *man,
                            const struct ttm_place *place,
                            struct ttm_mem_reg *mem)
 {
-       struct vmw_thp_manager *rman = (struct vmw_thp_manager *) man->priv;
+       struct vmw_thp_manager *rman = to_thp_manager(man);
        struct drm_mm *mm = &rman->mm;
        struct drm_mm_node *node;
        unsigned long align_pages;
@@ -103,7 +109,7 @@ found_unlock:
 static void vmw_thp_put_node(struct ttm_mem_type_manager *man,
                             struct ttm_mem_reg *mem)
 {
-       struct vmw_thp_manager *rman = (struct vmw_thp_manager *) man->priv;
+       struct vmw_thp_manager *rman = to_thp_manager(man);
 
        if (mem->mm_node) {
                spin_lock(&rman->lock);
@@ -117,20 +123,24 @@ static void vmw_thp_put_node(struct ttm_mem_type_manager *man,
 
 int vmw_thp_init(struct vmw_private *dev_priv)
 {
-       struct ttm_mem_type_manager *man = ttm_manager_type(&dev_priv->bdev, TTM_PL_VRAM);
+       struct ttm_mem_type_manager *man;
        struct vmw_thp_manager *rman;
+
+       rman = kzalloc(sizeof(*rman), GFP_KERNEL);
+       if (!rman)
+               return -ENOMEM;
+
+       man = &rman->manager;
        man->available_caching = TTM_PL_FLAG_CACHED;
        man->default_caching = TTM_PL_FLAG_CACHED;
 
        ttm_mem_type_manager_init(&dev_priv->bdev, man,
                                  dev_priv->vram_size >> PAGE_SHIFT);
-       rman = kzalloc(sizeof(*rman), GFP_KERNEL);
-       if (!rman)
-               return -ENOMEM;
 
        drm_mm_init(&rman->mm, 0, man->size);
        spin_lock_init(&rman->lock);
-       man->priv = rman;
+
+       ttm_set_driver_manager(&dev_priv->bdev, TTM_PL_VRAM, &rman->manager);
        ttm_mem_type_manager_set_used(man, true);
        return 0;
 }
@@ -138,7 +148,7 @@ int vmw_thp_init(struct vmw_private *dev_priv)
 void vmw_thp_fini(struct vmw_private *dev_priv)
 {
        struct ttm_mem_type_manager *man = ttm_manager_type(&dev_priv->bdev, TTM_PL_VRAM);
-       struct vmw_thp_manager *rman = (struct vmw_thp_manager *) man->priv;
+       struct vmw_thp_manager *rman = to_thp_manager(man);
        struct drm_mm *mm = &rman->mm;
        int ret;
 
@@ -151,15 +161,15 @@ void vmw_thp_fini(struct vmw_private *dev_priv)
        drm_mm_clean(mm);
        drm_mm_takedown(mm);
        spin_unlock(&rman->lock);
-       kfree(rman);
-       man->priv = NULL;
        ttm_mem_type_manager_cleanup(man);
+       ttm_set_driver_manager(&dev_priv->bdev, TTM_PL_VRAM, NULL);
+       kfree(rman);
 }
 
 static void vmw_thp_debug(struct ttm_mem_type_manager *man,
                          struct drm_printer *printer)
 {
-       struct vmw_thp_manager *rman = (struct vmw_thp_manager *) man->priv;
+       struct vmw_thp_manager *rman = to_thp_manager(man);
 
        spin_lock(&rman->lock);
        drm_mm_print(&rman->mm, printer);