dri-devel Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Huang Rui <ray.huang@amd.com>
To: "Christian König" <ckoenig.leichtzumerken@gmail.com>
Cc: "matthew.william.auld@gmail.com" <matthew.william.auld@gmail.com>,
	"dri-devel@lists.freedesktop.org"
	<dri-devel@lists.freedesktop.org>
Subject: Re: [PATCH 2/3] drm/ttm: remove swap LRU v3
Date: Fri, 19 Mar 2021 12:30:32 +0800	[thread overview]
Message-ID: <20210319043032.GB3262181@hr-amd> (raw)
In-Reply-To: <20210318124719.13656-2-christian.koenig@amd.com>

On Thu, Mar 18, 2021 at 08:47:18PM +0800, Christian König wrote:
> Instead evict round robin from each devices SYSTEM and TT domain.
> 
> v2: reorder num_pages access reported by Dan's script
> v3: fix rebase fallout, num_pages should be 32bit
> 
> Signed-off-by: Christian König <christian.koenig@amd.com>

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

> ---
>  drivers/gpu/drm/ttm/ttm_bo.c        | 29 --------------
>  drivers/gpu/drm/ttm/ttm_bo_util.c   |  1 -
>  drivers/gpu/drm/ttm/ttm_device.c    | 60 +++++++++++++++++++++--------
>  drivers/gpu/drm/vmwgfx/vmwgfx_drv.c |  2 +-
>  include/drm/ttm/ttm_bo_api.h        |  1 -
>  include/drm/ttm/ttm_bo_driver.h     |  1 -
>  include/drm/ttm/ttm_device.h        |  7 +---
>  7 files changed, 48 insertions(+), 53 deletions(-)
> 
> diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c
> index 66e00b404ec3..3673157527ff 100644
> --- a/drivers/gpu/drm/ttm/ttm_bo.c
> +++ b/drivers/gpu/drm/ttm/ttm_bo.c
> @@ -73,7 +73,6 @@ static void ttm_bo_del_from_lru(struct ttm_buffer_object *bo)
>  {
>  	struct ttm_device *bdev = bo->bdev;
>  
> -	list_del_init(&bo->swap);
>  	list_del_init(&bo->lru);
>  
>  	if (bdev->funcs->del_from_lru_notify)
> @@ -105,16 +104,6 @@ void ttm_bo_move_to_lru_tail(struct ttm_buffer_object *bo,
>  
>  	man = ttm_manager_type(bdev, mem->mem_type);
>  	list_move_tail(&bo->lru, &man->lru[bo->priority]);
> -	if (man->use_tt && bo->ttm &&
> -	    !(bo->ttm->page_flags & (TTM_PAGE_FLAG_SG |
> -				     TTM_PAGE_FLAG_SWAPPED))) {
> -		struct list_head *swap;
> -
> -		swap = &ttm_glob.swap_lru[bo->priority];
> -		list_move_tail(&bo->swap, swap);
> -	} else {
> -		list_del_init(&bo->swap);
> -	}
>  
>  	if (bdev->funcs->del_from_lru_notify)
>  		bdev->funcs->del_from_lru_notify(bo);
> @@ -129,9 +118,6 @@ void ttm_bo_move_to_lru_tail(struct ttm_buffer_object *bo,
>  			ttm_bo_bulk_move_set_pos(&bulk->vram[bo->priority], bo);
>  			break;
>  		}
> -		if (bo->ttm && !(bo->ttm->page_flags &
> -				 (TTM_PAGE_FLAG_SG | TTM_PAGE_FLAG_SWAPPED)))
> -			ttm_bo_bulk_move_set_pos(&bulk->swap[bo->priority], bo);
>  	}
>  }
>  EXPORT_SYMBOL(ttm_bo_move_to_lru_tail);
> @@ -169,20 +155,6 @@ void ttm_bo_bulk_move_lru_tail(struct ttm_lru_bulk_move *bulk)
>  		list_bulk_move_tail(&man->lru[i], &pos->first->lru,
>  				    &pos->last->lru);
>  	}
> -
> -	for (i = 0; i < TTM_MAX_BO_PRIORITY; ++i) {
> -		struct ttm_lru_bulk_move_pos *pos = &bulk->swap[i];
> -		struct list_head *lru;
> -
> -		if (!pos->first)
> -			continue;
> -
> -		dma_resv_assert_held(pos->first->base.resv);
> -		dma_resv_assert_held(pos->last->base.resv);
> -
> -		lru = &ttm_glob.swap_lru[i];
> -		list_bulk_move_tail(lru, &pos->first->swap, &pos->last->swap);
> -	}
>  }
>  EXPORT_SYMBOL(ttm_bo_bulk_move_lru_tail);
>  
> @@ -1065,7 +1037,6 @@ int ttm_bo_init_reserved(struct ttm_device *bdev,
>  	kref_init(&bo->kref);
>  	INIT_LIST_HEAD(&bo->lru);
>  	INIT_LIST_HEAD(&bo->ddestroy);
> -	INIT_LIST_HEAD(&bo->swap);
>  	bo->bdev = bdev;
>  	bo->type = type;
>  	bo->mem.mem_type = TTM_PL_SYSTEM;
> diff --git a/drivers/gpu/drm/ttm/ttm_bo_util.c b/drivers/gpu/drm/ttm/ttm_bo_util.c
> index 031e5819fec4..a2a17c84ceb3 100644
> --- a/drivers/gpu/drm/ttm/ttm_bo_util.c
> +++ b/drivers/gpu/drm/ttm/ttm_bo_util.c
> @@ -303,7 +303,6 @@ static int ttm_buffer_object_transfer(struct ttm_buffer_object *bo,
>  	atomic_inc(&ttm_glob.bo_count);
>  	INIT_LIST_HEAD(&fbo->base.ddestroy);
>  	INIT_LIST_HEAD(&fbo->base.lru);
> -	INIT_LIST_HEAD(&fbo->base.swap);
>  	fbo->base.moving = NULL;
>  	drm_vma_node_reset(&fbo->base.base.vma_node);
>  
> diff --git a/drivers/gpu/drm/ttm/ttm_device.c b/drivers/gpu/drm/ttm/ttm_device.c
> index b1424189fdfb..2096a0fd9c35 100644
> --- a/drivers/gpu/drm/ttm/ttm_device.c
> +++ b/drivers/gpu/drm/ttm/ttm_device.c
> @@ -67,7 +67,6 @@ static int ttm_global_init(void)
>  	unsigned long num_pages;
>  	struct sysinfo si;
>  	int ret = 0;
> -	unsigned i;
>  
>  	mutex_lock(&ttm_global_mutex);
>  	if (++ttm_glob_use_count > 1)
> @@ -90,8 +89,6 @@ static int ttm_global_init(void)
>  		goto out;
>  	}
>  
> -	for (i = 0; i < TTM_MAX_BO_PRIORITY; ++i)
> -		INIT_LIST_HEAD(&glob->swap_lru[i]);
>  	INIT_LIST_HEAD(&glob->device_list);
>  	atomic_set(&glob->bo_count, 0);
>  
> @@ -109,27 +106,60 @@ static int ttm_global_init(void)
>  int ttm_global_swapout(struct ttm_operation_ctx *ctx, gfp_t gfp_flags)
>  {
>  	struct ttm_global *glob = &ttm_glob;
> +	struct ttm_device *bdev;
> +	int ret = -EBUSY;
> +
> +	mutex_lock(&ttm_global_mutex);
> +	list_for_each_entry(bdev, &glob->device_list, device_list) {
> +		ret = ttm_device_swapout(bdev, ctx, gfp_flags);
> +		if (ret > 0) {
> +			list_move_tail(&bdev->device_list, &glob->device_list);
> +			break;
> +		}
> +	}
> +	mutex_unlock(&ttm_global_mutex);
> +	return ret;
> +}
> +EXPORT_SYMBOL(ttm_global_swapout);
> +
> +long ttm_device_swapout(struct ttm_device *bdev, struct ttm_operation_ctx *ctx,
> +			gfp_t gfp_flags)
> +{
> +	struct ttm_global *glob = &ttm_glob;
> +	struct ttm_resource_manager *man;
>  	struct ttm_buffer_object *bo;
> -	unsigned i;
> +	unsigned i, j;
>  	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;
> +	for (i = TTM_PL_SYSTEM; i < TTM_NUM_MEM_TYPES; ++i) {
> +		man = ttm_manager_type(bdev, i);
> +		if (!man || !man->use_tt)
> +			continue;
> +
> +		for (j = 0; j < TTM_MAX_BO_PRIORITY; ++j) {
> +			list_for_each_entry(bo, &man->lru[j], lru) {
> +				uint32_t num_pages;
> +
> +				if (!bo->ttm ||
> +				    bo->ttm->page_flags & TTM_PAGE_FLAG_SG ||
> +				    bo->ttm->page_flags & TTM_PAGE_FLAG_SWAPPED)
> +					continue;
> +
> +				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);
> +EXPORT_SYMBOL(ttm_device_swapout);
>  
>  static void ttm_init_sysman(struct ttm_device *bdev)
>  {
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
> index b991422e156c..4e41d8221f06 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_global_swapout(&ctx, GFP_KERNEL) > 0);
> +	while (ttm_device_swapout(&dev_priv->bdev, &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 5044ac330858..3587f660e8f4 100644
> --- a/include/drm/ttm/ttm_bo_api.h
> +++ b/include/drm/ttm/ttm_bo_api.h
> @@ -144,7 +144,6 @@ struct ttm_buffer_object {
>  
>  	struct list_head lru;
>  	struct list_head ddestroy;
> -	struct list_head swap;
>  
>  	/**
>  	 * Members protected by a bo reservation.
> diff --git a/include/drm/ttm/ttm_bo_driver.h b/include/drm/ttm/ttm_bo_driver.h
> index 8959c0075cfd..d007feef7676 100644
> --- a/include/drm/ttm/ttm_bo_driver.h
> +++ b/include/drm/ttm/ttm_bo_driver.h
> @@ -69,7 +69,6 @@ struct ttm_lru_bulk_move_pos {
>  struct ttm_lru_bulk_move {
>  	struct ttm_lru_bulk_move_pos tt[TTM_MAX_BO_PRIORITY];
>  	struct ttm_lru_bulk_move_pos vram[TTM_MAX_BO_PRIORITY];
> -	struct ttm_lru_bulk_move_pos swap[TTM_MAX_BO_PRIORITY];
>  };
>  
>  /*
> diff --git a/include/drm/ttm/ttm_device.h b/include/drm/ttm/ttm_device.h
> index 6a0b267d4fe6..cda6efb4c34b 100644
> --- a/include/drm/ttm/ttm_device.h
> +++ b/include/drm/ttm/ttm_device.h
> @@ -63,11 +63,6 @@ extern struct ttm_global {
>  	 */
>  	struct list_head device_list;
>  
> -	/**
> -	 * Protected by the lru_lock.
> -	 */
> -	struct list_head swap_lru[TTM_MAX_BO_PRIORITY];
> -
>  	/**
>  	 * Internal protection.
>  	 */
> @@ -298,6 +293,8 @@ struct ttm_device {
>  };
>  
>  long ttm_global_swapout(struct ttm_operation_ctx *ctx, gfp_t gfp_flags);
> +long ttm_device_swapout(struct ttm_device *bdev, 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@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

  reply	other threads:[~2021-03-19  4:31 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-03-18 12:47 [PATCH 1/3] drm/ttm: move swapout logic around v2 Christian König
2021-03-18 12:47 ` [PATCH 2/3] drm/ttm: remove swap LRU v3 Christian König
2021-03-19  4:30   ` Huang Rui [this message]
2021-03-18 12:47 ` [PATCH 3/3] drm/ttm: switch to per device LRU lock Christian König
2021-03-19  4:32   ` Huang Rui
2021-03-19 12:10     ` Christian König
2021-03-22  7:13       ` Huang Rui
2021-03-18 14:43 ` [PATCH 1/3] drm/ttm: move swapout logic around v2 Nirmoy
2021-03-18 15:26   ` Christian König
2021-03-18 19:46     ` Nirmoy
2021-03-18 15:08 ` kernel test robot
2021-03-18 18:13 ` kernel test robot
2021-03-19 12:07   ` Christian König
2021-03-19  4:28 ` Huang Rui
2021-03-19  9:41 ` Matthew Auld

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210319043032.GB3262181@hr-amd \
    --to=ray.huang@amd.com \
    --cc=ckoenig.leichtzumerken@gmail.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=matthew.william.auld@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox