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 1/3] drm/ttm: move swapout logic around v2
Date: Fri, 19 Mar 2021 12:28:31 +0800 [thread overview]
Message-ID: <20210319042831.GA3262181@hr-amd> (raw)
In-Reply-To: <20210318124719.13656-1-christian.koenig@amd.com>
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@amd.com>
Reviewed-by: Huang Rui <ray.huang@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@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
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
next prev parent reply other threads:[~2021-03-19 4:29 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
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 [this message]
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=20210319042831.GA3262181@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