[PATCH 1/3] drm/ttm: move swapout logic around v2

Huang Rui ray.huang at amd.com
Fri Mar 19 04:28:31 UTC 2021


On Thu, Mar 18, 2021 at 08:47:17PM +0800, Christian K�nig wrote:
> Move the iteration of the global lru into the new function
> ttm_global_swapout() and use that instead in drivers.
> 
> v2: consistently return int
> 
> Signed-off-by: Christian K?nig <christian.koenig at amd.com>

Reviewed-by: Huang Rui <ray.huang at amd.com>

> ---
>  drivers/gpu/drm/ttm/ttm_bo.c        | 57 ++++++++---------------------
>  drivers/gpu/drm/ttm/ttm_device.c    | 29 +++++++++++++++
>  drivers/gpu/drm/ttm/ttm_tt.c        |  2 +-
>  drivers/gpu/drm/vmwgfx/ttm_memory.c |  3 +-
>  drivers/gpu/drm/vmwgfx/vmwgfx_drv.c |  2 +-
>  include/drm/ttm/ttm_bo_api.h        |  3 +-
>  include/drm/ttm/ttm_device.h        |  2 +
>  7 files changed, 53 insertions(+), 45 deletions(-)
> 
> diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c
> index 3c23e863a3f0..66e00b404ec3 100644
> --- a/drivers/gpu/drm/ttm/ttm_bo.c
> +++ b/drivers/gpu/drm/ttm/ttm_bo.c
> @@ -1193,56 +1193,35 @@ int ttm_bo_wait(struct ttm_buffer_object *bo,
>  }
>  EXPORT_SYMBOL(ttm_bo_wait);
>  
> -/*
> - * A buffer object shrink method that tries to swap out the first
> - * buffer object on the bo_global::swap_lru list.
> - */
> -int ttm_bo_swapout(struct ttm_operation_ctx *ctx, gfp_t gfp_flags)
> +int ttm_bo_swapout(struct ttm_buffer_object *bo, struct ttm_operation_ctx *ctx,
> +		   gfp_t gfp_flags)
>  {
>  	struct ttm_global *glob = &ttm_glob;
> -	struct ttm_buffer_object *bo;
> -	int ret = -EBUSY;
>  	bool locked;
> -	unsigned i;
> -
> -	spin_lock(&glob->lru_lock);
> -	for (i = 0; i < TTM_MAX_BO_PRIORITY; ++i) {
> -		list_for_each_entry(bo, &glob->swap_lru[i], swap) {
> -			if (!ttm_bo_evict_swapout_allowable(bo, ctx, &locked,
> -							    NULL))
> -				continue;
> -
> -			if (!ttm_bo_get_unless_zero(bo)) {
> -				if (locked)
> -					dma_resv_unlock(bo->base.resv);
> -				continue;
> -			}
> +	int ret;
>  
> -			ret = 0;
> -			break;
> -		}
> -		if (!ret)
> -			break;
> -	}
> +	if (!ttm_bo_evict_swapout_allowable(bo, ctx, &locked, NULL))
> +		return -EBUSY;
>  
> -	if (ret) {
> -		spin_unlock(&glob->lru_lock);
> -		return ret;
> +	if (!ttm_bo_get_unless_zero(bo)) {
> +		if (locked)
> +			dma_resv_unlock(bo->base.resv);
> +		return -EBUSY;
>  	}
>  
>  	if (bo->deleted) {
> -		ret = ttm_bo_cleanup_refs(bo, false, false, locked);
> +		ttm_bo_cleanup_refs(bo, false, false, locked);
>  		ttm_bo_put(bo);
> -		return ret;
> +		return 0;
>  	}
>  
>  	ttm_bo_del_from_lru(bo);
> +	/* TODO: Cleanup the locking */
>  	spin_unlock(&glob->lru_lock);
>  
> -	/**
> +	/*
>  	 * Move to system cached
>  	 */
> -
>  	if (bo->mem.mem_type != TTM_PL_SYSTEM) {
>  		struct ttm_operation_ctx ctx = { false, false };
>  		struct ttm_resource evict_mem;
> @@ -1262,29 +1241,26 @@ int ttm_bo_swapout(struct ttm_operation_ctx *ctx, gfp_t gfp_flags)
>  		}
>  	}
>  
> -	/**
> +	/*
>  	 * Make sure BO is idle.
>  	 */
> -
>  	ret = ttm_bo_wait(bo, false, false);
>  	if (unlikely(ret != 0))
>  		goto out;
>  
>  	ttm_bo_unmap_virtual(bo);
>  
> -	/**
> +	/*
>  	 * Swap out. Buffer will be swapped in again as soon as
>  	 * anyone tries to access a ttm page.
>  	 */
> -
>  	if (bo->bdev->funcs->swap_notify)
>  		bo->bdev->funcs->swap_notify(bo);
>  
>  	ret = ttm_tt_swapout(bo->bdev, bo->ttm, gfp_flags);
>  out:
>  
> -	/**
> -	 *
> +	/*
>  	 * Unreserve without putting on LRU to avoid swapping out an
>  	 * already swapped buffer.
>  	 */
> @@ -1293,7 +1269,6 @@ int ttm_bo_swapout(struct ttm_operation_ctx *ctx, gfp_t gfp_flags)
>  	ttm_bo_put(bo);
>  	return ret;
>  }
> -EXPORT_SYMBOL(ttm_bo_swapout);
>  
>  void ttm_bo_tt_destroy(struct ttm_buffer_object *bo)
>  {
> diff --git a/drivers/gpu/drm/ttm/ttm_device.c b/drivers/gpu/drm/ttm/ttm_device.c
> index 95e1b7b1f2e6..b1424189fdfb 100644
> --- a/drivers/gpu/drm/ttm/ttm_device.c
> +++ b/drivers/gpu/drm/ttm/ttm_device.c
> @@ -102,6 +102,35 @@ static int ttm_global_init(void)
>  	return ret;
>  }
>  
> +/**
> + * A buffer object shrink method that tries to swap out the first
> + * buffer object on the global::swap_lru list.
> + */
> +int ttm_global_swapout(struct ttm_operation_ctx *ctx, gfp_t gfp_flags)
> +{
> +	struct ttm_global *glob = &ttm_glob;
> +	struct ttm_buffer_object *bo;
> +	unsigned i;
> +	int ret;
> +
> +	spin_lock(&glob->lru_lock);
> +	for (i = 0; i < TTM_MAX_BO_PRIORITY; ++i) {
> +		list_for_each_entry(bo, &glob->swap_lru[i], swap) {
> +			uint32_t num_pages = bo->ttm->num_pages;
> +
> +			ret = ttm_bo_swapout(bo, ctx, gfp_flags);
> +			/* ttm_bo_swapout has dropped the lru_lock */
> +			if (!ret)
> +				return num_pages;
> +			if (ret != -EBUSY)
> +				return ret;
> +		}
> +	}
> +	spin_unlock(&glob->lru_lock);
> +	return 0;
> +}
> +EXPORT_SYMBOL(ttm_global_swapout);
> +
>  static void ttm_init_sysman(struct ttm_device *bdev)
>  {
>  	struct ttm_resource_manager *man = &bdev->sysman;
> diff --git a/drivers/gpu/drm/ttm/ttm_tt.c b/drivers/gpu/drm/ttm/ttm_tt.c
> index 2f0833c98d2c..95b5cff25f4c 100644
> --- a/drivers/gpu/drm/ttm/ttm_tt.c
> +++ b/drivers/gpu/drm/ttm/ttm_tt.c
> @@ -369,7 +369,7 @@ static unsigned long ttm_tt_shrinker_scan(struct shrinker *shrink,
>  	};
>  	int ret;
>  
> -	ret = ttm_bo_swapout(&ctx, GFP_NOFS);
> +	ret = ttm_global_swapout(&ctx, GFP_NOFS);
>  	return ret < 0 ? SHRINK_EMPTY : ret;
>  }
>  
> diff --git a/drivers/gpu/drm/vmwgfx/ttm_memory.c b/drivers/gpu/drm/vmwgfx/ttm_memory.c
> index e972af07d029..104b95a8c7a2 100644
> --- a/drivers/gpu/drm/vmwgfx/ttm_memory.c
> +++ b/drivers/gpu/drm/vmwgfx/ttm_memory.c
> @@ -38,6 +38,7 @@
>  
>  #include <drm/drm_device.h>
>  #include <drm/drm_file.h>
> +#include <drm/ttm/ttm_device.h>
>  
>  #include "ttm_memory.h"
>  
> @@ -277,7 +278,7 @@ static void ttm_shrink(struct ttm_mem_global *glob, bool from_wq,
>  
>  	while (ttm_zones_above_swap_target(glob, from_wq, extra)) {
>  		spin_unlock(&glob->lock);
> -		ret = ttm_bo_swapout(ctx, GFP_KERNEL);
> +		ret = ttm_global_swapout(ctx, GFP_KERNEL);
>  		spin_lock(&glob->lock);
>  		if (unlikely(ret < 0))
>  			break;
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
> index 6910111099c8..b991422e156c 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
> @@ -1371,7 +1371,7 @@ static int vmw_pm_freeze(struct device *kdev)
>  	vmw_execbuf_release_pinned_bo(dev_priv);
>  	vmw_resource_evict_all(dev_priv);
>  	vmw_release_device_early(dev_priv);
> -	while (ttm_bo_swapout(&ctx, GFP_KERNEL) > 0);
> +	while (ttm_global_swapout(&ctx, GFP_KERNEL) > 0);
>  	if (dev_priv->enable_fb)
>  		vmw_fifo_resource_dec(dev_priv);
>  	if (atomic_read(&dev_priv->num_fifo_resources) != 0) {
> diff --git a/include/drm/ttm/ttm_bo_api.h b/include/drm/ttm/ttm_bo_api.h
> index 4fb523dfab32..5044ac330858 100644
> --- a/include/drm/ttm/ttm_bo_api.h
> +++ b/include/drm/ttm/ttm_bo_api.h
> @@ -560,7 +560,8 @@ ssize_t ttm_bo_io(struct ttm_device *bdev, struct file *filp,
>  		  const char __user *wbuf, char __user *rbuf,
>  		  size_t count, loff_t *f_pos, bool write);
>  
> -int ttm_bo_swapout(struct ttm_operation_ctx *ctx, gfp_t gfp_flags);
> +int ttm_bo_swapout(struct ttm_buffer_object *bo, struct ttm_operation_ctx *ctx,
> +		   gfp_t gfp_flags);
>  
>  /**
>   * ttm_bo_uses_embedded_gem_object - check if the given bo uses the
> diff --git a/include/drm/ttm/ttm_device.h b/include/drm/ttm/ttm_device.h
> index 035bbc044a3b..6a0b267d4fe6 100644
> --- a/include/drm/ttm/ttm_device.h
> +++ b/include/drm/ttm/ttm_device.h
> @@ -297,6 +297,8 @@ struct ttm_device {
>  	struct delayed_work wq;
>  };
>  
> +long ttm_global_swapout(struct ttm_operation_ctx *ctx, gfp_t gfp_flags);
> +
>  static inline struct ttm_resource_manager *
>  ttm_manager_type(struct ttm_device *bdev, int mem_type)
>  {
> -- 
> 2.25.1
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Flists.freedesktop.org%2Fmailman%2Flistinfo%2Fdri-devel&data=04%7C01%7Cray.huang%40amd.com%7C5e884dc7218341f5405a08d8ea0bfab3%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637516684478741238%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&sdata=brmyK0mL95w5aG52hDFdMDw1CymMDnuIRTQK64roKKk%3D&reserved=0


More information about the dri-devel mailing list