On Tue, Aug 04, 2020 at 12:56:22PM +1000, Dave Airlie wrote: > From: Dave Airlie <airlied@xxxxxxxxxx> > > Signed-off-by: Dave Airlie <airlied@xxxxxxxxxx> > --- > drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c | 32 +++++++++++-------- > 1 file changed, 18 insertions(+), 14 deletions(-) > > diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c b/drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c > index 54c85a59dd8b..bc51b7773084 100644 > --- a/drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c > +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c > @@ -37,6 +37,7 @@ > #include <linux/kernel.h> > > struct vmwgfx_gmrid_man { > + struct ttm_mem_type_manager manager; > spinlock_t lock; > struct ida gmr_ida; > uint32_t max_gmr_ids; > @@ -44,13 +45,17 @@ struct vmwgfx_gmrid_man { > uint32_t used_gmr_pages; > }; > > +static struct vmwgfx_gmrid_man *to_gmrid_manager(struct ttm_mem_type_manager *man) > +{ > + return container_of(man, struct vmwgfx_gmrid_man, manager); > +} > + > static int vmw_gmrid_man_get_node(struct ttm_mem_type_manager *man, > struct ttm_buffer_object *bo, > const struct ttm_place *place, > struct ttm_mem_reg *mem) > { > - struct vmwgfx_gmrid_man *gman = > - (struct vmwgfx_gmrid_man *)man->priv; > + struct vmwgfx_gmrid_man *gman = to_gmrid_manager(man); > int id; > > id = ida_alloc_max(&gman->gmr_ida, gman->max_gmr_ids - 1, GFP_KERNEL); > @@ -82,8 +87,7 @@ static int vmw_gmrid_man_get_node(struct ttm_mem_type_manager *man, > static void vmw_gmrid_man_put_node(struct ttm_mem_type_manager *man, > struct ttm_mem_reg *mem) > { > - struct vmwgfx_gmrid_man *gman = > - (struct vmwgfx_gmrid_man *)man->priv; > + struct vmwgfx_gmrid_man *gman = to_gmrid_manager(man); > > if (mem->mm_node) { > ida_free(&gman->gmr_ida, mem->start); > @@ -98,13 +102,15 @@ static const struct ttm_mem_type_manager_func vmw_gmrid_manager_func; > > int vmw_gmrid_man_init(struct vmw_private *dev_priv, int type) > { > - struct ttm_mem_type_manager *man = ttm_manager_type(&dev_priv->bdev, type); > + struct ttm_mem_type_manager *man; > struct vmwgfx_gmrid_man *gman = > kzalloc(sizeof(*gman), GFP_KERNEL); > > if (unlikely(!gman)) > return -ENOMEM; > > + man = &gman->manager; > + > man->func = &vmw_gmrid_manager_func; > man->available_caching = TTM_PL_FLAG_CACHED; > man->default_caching = TTM_PL_FLAG_CACHED; > @@ -127,8 +133,7 @@ int vmw_gmrid_man_init(struct vmw_private *dev_priv, int type) > default: > BUG(); > } > - man->priv = (void *) gman; > - > + ttm_set_driver_manager(&dev_priv->bdev, type, &gman->manager); > ttm_mem_type_manager_set_used(man, true); > return 0; > } > @@ -136,19 +141,18 @@ int vmw_gmrid_man_init(struct vmw_private *dev_priv, int type) > void vmw_gmrid_man_fini(struct vmw_private *dev_priv, int type) > { > struct ttm_mem_type_manager *man = ttm_manager_type(&dev_priv->bdev, type); > - struct vmwgfx_gmrid_man *gman = > - (struct vmwgfx_gmrid_man *)man->priv; > + struct vmwgfx_gmrid_man *gman = to_gmrid_manager(man); > > ttm_mem_type_manager_disable(man); > > ttm_mem_type_manager_force_list_clean(&dev_priv->bdev, man); > > - if (gman) { Ah, here it goes, please disregard my suggestion earlier for adding a WARN_ON, that's just churn. Reviewed-by: Daniel Vetter <daniel.vetter@xxxxxxxx> > - ida_destroy(&gman->gmr_ida); > - kfree(gman); > - } > - > ttm_mem_type_manager_cleanup(man); > + > + ttm_set_driver_manager(&dev_priv->bdev, type, NULL); > + ida_destroy(&gman->gmr_ida); > + kfree(gman); > + > } > > static const struct ttm_mem_type_manager_func vmw_gmrid_manager_func = { > -- > 2.26.2 > > _______________________________________________ > dri-devel mailing list > dri-devel@xxxxxxxxxxxxxxxxxxxxx > https://lists.freedesktop.org/mailman/listinfo/dri-devel -- Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel