[PATCH 33/59] drm/vmwgfx: fix gmrid takedown paths to new interface

daniel at ffwll.ch daniel at ffwll.ch
Wed Aug 5 09:21:48 UTC 2020


On Tue, Aug 04, 2020 at 12:56:06PM +1000, Dave Airlie wrote:
> From: Dave Airlie <airlied at redhat.com>
> 
> Signed-off-by: Dave Airlie <airlied at redhat.com>
> ---
>  drivers/gpu/drm/vmwgfx/vmwgfx_drv.c           |  9 ++++-----
>  drivers/gpu/drm/vmwgfx/vmwgfx_drv.h           |  1 +
>  drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c | 11 ++++++++---
>  3 files changed, 13 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
> index 4f4d22bac477..f368a9cc0c2a 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
> @@ -996,9 +996,9 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
>  	vmw_kms_close(dev_priv);
>  out_no_kms:
>  	if (dev_priv->has_mob)
> -		(void) ttm_bo_clean_mm(&dev_priv->bdev, VMW_PL_MOB);
> +		vmw_gmrid_man_fini(dev_priv, VMW_PL_MOB);
>  	if (dev_priv->has_gmr)
> -		(void) ttm_bo_clean_mm(&dev_priv->bdev, VMW_PL_GMR);
> +		vmw_gmrid_man_fini(dev_priv, VMW_PL_GMR);
>  	vmw_vram_manager_fini(dev_priv);
>  out_no_vram:
>  	(void)ttm_bo_device_release(&dev_priv->bdev);
> @@ -1047,12 +1047,11 @@ static void vmw_driver_unload(struct drm_device *dev)
>  	vmw_overlay_close(dev_priv);
>  
>  	if (dev_priv->has_gmr)
> -		(void)ttm_bo_clean_mm(&dev_priv->bdev, VMW_PL_GMR);
> -	(void)ttm_bo_clean_mm(&dev_priv->bdev, TTM_PL_VRAM);
> +		vmw_gmrid_man_fini(dev_priv, VMW_PL_GMR);
>  
>  	vmw_release_device_early(dev_priv);
>  	if (dev_priv->has_mob)
> -		(void) ttm_bo_clean_mm(&dev_priv->bdev, VMW_PL_MOB);
> +		vmw_gmrid_man_fini(dev_priv, VMW_PL_MOB);
>  	vmw_vram_manager_fini(dev_priv);
>  	(void) ttm_bo_device_release(&dev_priv->bdev);
>  	drm_vma_offset_manager_destroy(&dev_priv->vma_manager);
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
> index c6530d7b6d51..aa763c6b1146 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
> @@ -1222,6 +1222,7 @@ int vmw_overlay_num_free_overlays(struct vmw_private *dev_priv);
>   */
>  
>  int vmw_gmrid_man_init(struct vmw_private *dev_priv, int type);
> +void vmw_gmrid_man_fini(struct vmw_private *dev_priv, int type);
>  
>  /**
>   * Prime - vmwgfx_prime.c
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c b/drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c
> index 141fb14e3583..ec1b5bb01a93 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c
> @@ -133,20 +133,25 @@ int vmw_gmrid_man_init(struct vmw_private *dev_priv, int type)
>  	return 0;
>  }
>  
> -static int vmw_gmrid_man_takedown(struct ttm_mem_type_manager *man)
> +void vmw_gmrid_man_fini(struct vmw_private *dev_priv, int type)
>  {
> +	struct ttm_mem_type_manager *man = &dev_priv->bdev.man[type];
>  	struct vmwgfx_gmrid_man *gman =
>  		(struct vmwgfx_gmrid_man *)man->priv;
>  
> +	ttm_mem_type_manager_disable(man);
> +
> +	ttm_mem_type_manager_force_list_clean(&dev_priv->bdev, man);
> +
>  	if (gman) {

I don't think this can ever be non-NULL if init worked, not after the
demidlayering. Maybe put a WARN_ON(!gman) in here. With that:

Reviewed-by: Daniel Vetter <daniel.vetter at ffwll.ch>

>  		ida_destroy(&gman->gmr_ida);
>  		kfree(gman);
>  	}
> -	return 0;
> +
> +	ttm_mem_type_manager_cleanup(man);
>  }
>  
>  static const struct ttm_mem_type_manager_func vmw_gmrid_manager_func = {
> -	.takedown = vmw_gmrid_man_takedown,
>  	.get_node = vmw_gmrid_man_get_node,
>  	.put_node = vmw_gmrid_man_put_node,
>  };
> -- 
> 2.26.2
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel

-- 
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch


More information about the dri-devel mailing list