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@xxxxxxx> Reviewed-by: Huang Rui <ray.huang@xxxxxxx> > --- > 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@xxxxxxxxxxxxxxxxxxxxx > 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@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel