Initialize lru_mgr for each memory type or memory region. Also set ttm_resource_manager's weak reference to drm lru manager. Signed-off-by: Oak Zeng <oak.zeng@xxxxxxxxx> --- drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c | 6 ++++++ drivers/gpu/drm/amd/amdgpu/amdgpu_preempt_mgr.c | 6 ++++++ drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c | 6 ++++++ drivers/gpu/drm/i915/i915_ttm_buddy_manager.c | 10 ++++++++++ drivers/gpu/drm/nouveau/nouveau_ttm.c | 12 ++++++++++++ drivers/gpu/drm/ttm/ttm_range_manager.c | 6 ++++++ drivers/gpu/drm/ttm/ttm_sys_manager.c | 2 ++ drivers/gpu/drm/vmwgfx/vmwgfx_system_manager.c | 6 ++++++ drivers/gpu/drm/xe/xe_ttm_sys_mgr.c | 6 ++++++ drivers/gpu/drm/xe/xe_ttm_vram_mgr.c | 6 ++++++ 10 files changed, 66 insertions(+) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c index 44367f03316f..57e8b1688977 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c @@ -278,6 +278,7 @@ int amdgpu_gtt_mgr_init(struct amdgpu_device *adev, uint64_t gtt_size) { struct amdgpu_gtt_mgr *mgr = &adev->mman.gtt_mgr; struct ttm_resource_manager *man = &mgr->manager; + struct drm_device *drm = adev_to_drm(adev); uint64_t start, size; man->use_tt = true; @@ -292,6 +293,9 @@ int amdgpu_gtt_mgr_init(struct amdgpu_device *adev, uint64_t gtt_size) ttm_set_driver_manager(&adev->mman.bdev, TTM_PL_TT, &mgr->manager); ttm_resource_manager_set_used(man, true); + + drm_lru_mgr_init(&drm->lru_mgr[TTM_PL_TT], gtt_size, &drm->lru_lock); + ttm_resource_manager_set_lru_mgr(man, &drm->lru_mgr[TTM_PL_TT]); return 0; } @@ -307,6 +311,7 @@ void amdgpu_gtt_mgr_fini(struct amdgpu_device *adev) { struct amdgpu_gtt_mgr *mgr = &adev->mman.gtt_mgr; struct ttm_resource_manager *man = &mgr->manager; + struct drm_device *drm = adev_to_drm(adev); int ret; ttm_resource_manager_set_used(man, false); @@ -321,4 +326,5 @@ void amdgpu_gtt_mgr_fini(struct amdgpu_device *adev) ttm_resource_manager_cleanup(man); ttm_set_driver_manager(&adev->mman.bdev, TTM_PL_TT, NULL); + drm_lru_mgr_fini(&drm->lru_mgr[TTM_PL_TT]); } diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_preempt_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_preempt_mgr.c index e8adfd0a570a..f989aca2bfc4 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_preempt_mgr.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_preempt_mgr.c @@ -100,6 +100,7 @@ static const struct ttm_resource_manager_func amdgpu_preempt_mgr_func = { int amdgpu_preempt_mgr_init(struct amdgpu_device *adev) { struct ttm_resource_manager *man = &adev->mman.preempt_mgr; + struct drm_device *drm = adev_to_drm(adev); int ret; man->use_tt = true; @@ -115,6 +116,9 @@ int amdgpu_preempt_mgr_init(struct amdgpu_device *adev) ttm_set_driver_manager(&adev->mman.bdev, AMDGPU_PL_PREEMPT, man); ttm_resource_manager_set_used(man, true); + + drm_lru_mgr_init(&drm->lru_mgr[AMDGPU_PL_PREEMPT], (1 << 30), &drm->lru_lock); + ttm_resource_manager_set_lru_mgr(man, &drm->lru_mgr[VMW_PL_SYSTEM]); return 0; } @@ -129,6 +133,7 @@ int amdgpu_preempt_mgr_init(struct amdgpu_device *adev) void amdgpu_preempt_mgr_fini(struct amdgpu_device *adev) { struct ttm_resource_manager *man = &adev->mman.preempt_mgr; + struct drm_device *drm = adev_to_drm(adev); int ret; ttm_resource_manager_set_used(man, false); @@ -141,4 +146,5 @@ void amdgpu_preempt_mgr_fini(struct amdgpu_device *adev) ttm_resource_manager_cleanup(man); ttm_set_driver_manager(&adev->mman.bdev, AMDGPU_PL_PREEMPT, NULL); + drm_lru_mgr_fini(&drm->lru_mgr[AMDGPU_PL_PREEMPT]); } diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c index b83e1741905e..0792d22508c9 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c @@ -884,6 +884,7 @@ int amdgpu_vram_mgr_init(struct amdgpu_device *adev) { struct amdgpu_vram_mgr *mgr = &adev->mman.vram_mgr; struct ttm_resource_manager *man = &mgr->manager; + struct drm_device *drm = adev_to_drm(adev); int err; ttm_resource_manager_init(man, &adev->mman.bdev, @@ -907,6 +908,9 @@ int amdgpu_vram_mgr_init(struct amdgpu_device *adev) ttm_set_driver_manager(&adev->mman.bdev, TTM_PL_VRAM, &mgr->manager); ttm_resource_manager_set_used(man, true); + drm_lru_mgr_init(&drm->lru_mgr[TTM_PL_VRAM], adev->gmc.real_vram_size, + &drm->lru_lock); + ttm_resource_manager_set_lru_mgr(man, &drm->lru_mgr[TTM_PL_VRAM]); return 0; } @@ -922,6 +926,7 @@ void amdgpu_vram_mgr_fini(struct amdgpu_device *adev) { struct amdgpu_vram_mgr *mgr = &adev->mman.vram_mgr; struct ttm_resource_manager *man = &mgr->manager; + struct drm_device *drm = adev_to_drm(adev); int ret; struct amdgpu_vram_reservation *rsv, *temp; @@ -945,4 +950,5 @@ void amdgpu_vram_mgr_fini(struct amdgpu_device *adev) ttm_resource_manager_cleanup(man); ttm_set_driver_manager(&adev->mman.bdev, TTM_PL_VRAM, NULL); + drm_lru_mgr_fini(&drm->lru_mgr[TTM_PL_VRAM]); } diff --git a/drivers/gpu/drm/i915/i915_ttm_buddy_manager.c b/drivers/gpu/drm/i915/i915_ttm_buddy_manager.c index a1bc804cfa15..968f9c01152e 100644 --- a/drivers/gpu/drm/i915/i915_ttm_buddy_manager.c +++ b/drivers/gpu/drm/i915/i915_ttm_buddy_manager.c @@ -304,6 +304,9 @@ int i915_ttm_buddy_man_init(struct ttm_device *bdev, { struct ttm_resource_manager *man; struct i915_ttm_buddy_manager *bman; + struct drm_i915_private *i915 = container_of(bdev, + struct drm_i915_private, bdev); + struct drm_device *drm = &i915->drm; int err; bman = kzalloc(sizeof(*bman), GFP_KERNEL); @@ -329,6 +332,9 @@ int i915_ttm_buddy_man_init(struct ttm_device *bdev, ttm_resource_manager_set_used(man, true); ttm_set_driver_manager(bdev, type, man); + drm_lru_mgr_init(&drm->lru_mgr[type], bman->mm.size >> PAGE_SHIFT, &drm->lru_lock); + ttm_resource_manager_set_lru_mgr(man, &drm->lru_mgr[type]); + return 0; err_free_bman: @@ -350,6 +356,9 @@ int i915_ttm_buddy_man_fini(struct ttm_device *bdev, unsigned int type) { struct ttm_resource_manager *man = ttm_manager_type(bdev, type); struct i915_ttm_buddy_manager *bman = to_buddy_manager(man); + struct drm_i915_private *i915 = container_of(bdev, + struct drm_i915_private, bdev); + struct drm_device *drm = &i915->drm; struct drm_buddy *mm = &bman->mm; int ret; @@ -369,6 +378,7 @@ int i915_ttm_buddy_man_fini(struct ttm_device *bdev, unsigned int type) mutex_unlock(&bman->lock); ttm_resource_manager_cleanup(man); + drm_lru_mgr_fini(&drm->lru_mgr[type]); kfree(bman); return 0; diff --git a/drivers/gpu/drm/nouveau/nouveau_ttm.c b/drivers/gpu/drm/nouveau/nouveau_ttm.c index 1898f27f0510..b0936c235ff6 100644 --- a/drivers/gpu/drm/nouveau/nouveau_ttm.c +++ b/drivers/gpu/drm/nouveau/nouveau_ttm.c @@ -182,6 +182,7 @@ nouveau_ttm_init_vram(struct nouveau_drm *drm) { if (drm->client.device.info.family >= NV_DEVICE_INFO_V0_TESLA) { struct ttm_resource_manager *man = kzalloc(sizeof(*man), GFP_KERNEL); + struct drm_device *drm_dev = drm->dev; if (!man) return -ENOMEM; @@ -192,6 +193,9 @@ nouveau_ttm_init_vram(struct nouveau_drm *drm) drm->gem.vram_available >> PAGE_SHIFT); ttm_set_driver_manager(&drm->ttm.bdev, TTM_PL_VRAM, man); ttm_resource_manager_set_used(man, true); + drm_lru_mgr_init(&drm_dev->lru_mgr[TTM_PL_VRAM], + drm->gem.vram_available >> PAGE_SHIFT, &drm_dev->lru_lock); + ttm_resource_manager_set_lru_mgr(man, &drm_dev->lru_mgr[TTM_PL_VRAM]); return 0; } else { return ttm_range_man_init(drm->dev, &drm->ttm.bdev, TTM_PL_VRAM, false, @@ -205,10 +209,13 @@ nouveau_ttm_fini_vram(struct nouveau_drm *drm) struct ttm_resource_manager *man = ttm_manager_type(&drm->ttm.bdev, TTM_PL_VRAM); if (drm->client.device.info.family >= NV_DEVICE_INFO_V0_TESLA) { + struct drm_device *drm_dev = drm->dev; + ttm_resource_manager_set_used(man, false); ttm_resource_manager_evict_all(&drm->ttm.bdev, man); ttm_resource_manager_cleanup(man); ttm_set_driver_manager(&drm->ttm.bdev, TTM_PL_VRAM, NULL); + drm_lru_mgr_fini(&drm_dev->lru_mgr[TTM_PL_VRAM]); kfree(man); } else ttm_range_man_fini(drm->dev, &drm->ttm.bdev, TTM_PL_VRAM); @@ -220,6 +227,7 @@ nouveau_ttm_init_gtt(struct nouveau_drm *drm) struct ttm_resource_manager *man; unsigned long size_pages = drm->gem.gart_available >> PAGE_SHIFT; const struct ttm_resource_manager_func *func = NULL; + struct drm_device *drm_dev = drm->dev; if (drm->client.device.info.family >= NV_DEVICE_INFO_V0_TESLA) func = &nouveau_gart_manager; @@ -238,6 +246,8 @@ nouveau_ttm_init_gtt(struct nouveau_drm *drm) ttm_resource_manager_init(man, &drm->ttm.bdev, size_pages); ttm_set_driver_manager(&drm->ttm.bdev, TTM_PL_TT, man); ttm_resource_manager_set_used(man, true); + drm_lru_mgr_init(&drm_dev->lru_mgr[TTM_PL_TT], size_pages, &drm_dev->lru_lock); + ttm_resource_manager_set_lru_mgr(man, &drm_dev->lru_mgr[TTM_PL_TT]); return 0; } @@ -245,6 +255,7 @@ static void nouveau_ttm_fini_gtt(struct nouveau_drm *drm) { struct ttm_resource_manager *man = ttm_manager_type(&drm->ttm.bdev, TTM_PL_TT); + struct drm_device *drm_dev = drm->dev; if (drm->client.device.info.family < NV_DEVICE_INFO_V0_TESLA && drm->agp.bridge) @@ -254,6 +265,7 @@ nouveau_ttm_fini_gtt(struct nouveau_drm *drm) ttm_resource_manager_evict_all(&drm->ttm.bdev, man); ttm_resource_manager_cleanup(man); ttm_set_driver_manager(&drm->ttm.bdev, TTM_PL_TT, NULL); + drm_lru_mgr_fini(&drm_dev->lru_mgr[TTM_PL_TT]); kfree(man); } } diff --git a/drivers/gpu/drm/ttm/ttm_range_manager.c b/drivers/gpu/drm/ttm/ttm_range_manager.c index db1ae370580d..898ede7d25c4 100644 --- a/drivers/gpu/drm/ttm/ttm_range_manager.c +++ b/drivers/gpu/drm/ttm/ttm_range_manager.c @@ -36,6 +36,7 @@ #include <drm/drm_mm.h> #include <linux/slab.h> #include <linux/spinlock.h> +#include <drm/drm_evictable_lru.h> /* * Currently we use a spinlock for the lock, but a mutex *may* be @@ -199,6 +200,10 @@ int ttm_range_man_init_nocheck(struct drm_device *drm, struct ttm_device *bdev, ttm_set_driver_manager(bdev, type, &rman->manager); ttm_resource_manager_set_used(man, true); + + drm_lru_mgr_init(&drm->lru_mgr[type], p_size, &drm->lru_lock); + ttm_resource_manager_set_lru_mgr(man, &drm->lru_mgr[type]); + return 0; } EXPORT_SYMBOL(ttm_range_man_init_nocheck); @@ -236,6 +241,7 @@ int ttm_range_man_fini_nocheck(struct drm_device *drm, struct ttm_device *bdev, ttm_resource_manager_cleanup(man); ttm_set_driver_manager(bdev, type, NULL); + drm_lru_mgr_fini(&drm->lru_mgr[type]); kfree(rman); return 0; } diff --git a/drivers/gpu/drm/ttm/ttm_sys_manager.c b/drivers/gpu/drm/ttm/ttm_sys_manager.c index f0f026d40a69..db410c7f73fe 100644 --- a/drivers/gpu/drm/ttm/ttm_sys_manager.c +++ b/drivers/gpu/drm/ttm/ttm_sys_manager.c @@ -50,4 +50,6 @@ void ttm_sys_man_init(struct drm_device *drm, struct ttm_device *bdev) ttm_resource_manager_init(man, bdev, 0); ttm_set_driver_manager(bdev, TTM_PL_SYSTEM, man); ttm_resource_manager_set_used(man, true); + drm_lru_mgr_init(&drm->lru_mgr[TTM_PL_SYSTEM], 0, &drm->lru_lock); + ttm_resource_manager_set_lru_mgr(man, &drm->lru_mgr[TTM_PL_SYSTEM]); } diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_system_manager.c b/drivers/gpu/drm/vmwgfx/vmwgfx_system_manager.c index ee7964cbdaca..102296399e00 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_system_manager.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_system_manager.c @@ -62,6 +62,7 @@ int vmw_sys_man_init(struct vmw_private *dev_priv) struct ttm_device *bdev = &dev_priv->bdev; struct ttm_resource_manager *man = kzalloc(sizeof(*man), GFP_KERNEL); + struct drm_device *drm = &dev_priv->drm; if (!man) return -ENOMEM; @@ -72,6 +73,9 @@ int vmw_sys_man_init(struct vmw_private *dev_priv) ttm_resource_manager_init(man, bdev, 0); ttm_set_driver_manager(bdev, VMW_PL_SYSTEM, man); ttm_resource_manager_set_used(man, true); + + drm_lru_mgr_init(&drm->lru_mgr[WMW_PL_SYSTEM], 0, &drm->lru_lock); + ttm_resource_manager_set_lru_mgr(man, &drm->lru_mgr[VMW_PL_SYSTEM]); return 0; } @@ -79,6 +83,7 @@ void vmw_sys_man_fini(struct vmw_private *dev_priv) { struct ttm_resource_manager *man = ttm_manager_type(&dev_priv->bdev, VMW_PL_SYSTEM); + struct drm_device *drm = &dev_priv->drm; ttm_resource_manager_evict_all(&dev_priv->bdev, man); @@ -86,5 +91,6 @@ void vmw_sys_man_fini(struct vmw_private *dev_priv) ttm_resource_manager_cleanup(man); ttm_set_driver_manager(&dev_priv->bdev, VMW_PL_SYSTEM, NULL); + drm_lru_mgr_fini(&drm->lru_mgr[VMW_PL_SYSTEM]); kfree(man); } diff --git a/drivers/gpu/drm/xe/xe_ttm_sys_mgr.c b/drivers/gpu/drm/xe/xe_ttm_sys_mgr.c index 3e1fa0c832ca..ace42852a419 100644 --- a/drivers/gpu/drm/xe/xe_ttm_sys_mgr.c +++ b/drivers/gpu/drm/xe/xe_ttm_sys_mgr.c @@ -96,11 +96,13 @@ static void ttm_sys_mgr_fini(struct drm_device *drm, void *arg) ttm_resource_manager_cleanup(man); ttm_set_driver_manager(&xe->ttm, XE_PL_TT, NULL); + drm_lru_mgr_fini(&drm->lru_mgr[XE_PL_TT]); } int xe_ttm_sys_mgr_init(struct xe_device *xe) { struct ttm_resource_manager *man = &xe->mem.sys_mgr; + struct drm_device *drm = &xe->drm; struct sysinfo si; u64 gtt_size; @@ -114,5 +116,9 @@ int xe_ttm_sys_mgr_init(struct xe_device *xe) ttm_resource_manager_init(man, &xe->ttm, gtt_size >> PAGE_SHIFT); ttm_set_driver_manager(&xe->ttm, XE_PL_TT, man); ttm_resource_manager_set_used(man, true); + + drm_lru_mgr_init(&drm->lru_mgr[XE_PL_TT], gtt_size >> PAGE_SHIFT, &drm->lru_lock); + ttm_resource_manager_set_lru_mgr(man, &drm->lru_mgr[XE_PL_TT]); + return drmm_add_action_or_reset(&xe->drm, ttm_sys_mgr_fini, xe); } diff --git a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c index 06a54c8bd46f..a3c1bf555c06 100644 --- a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c +++ b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c @@ -328,6 +328,8 @@ static void ttm_vram_mgr_fini(struct drm_device *dev, void *arg) ttm_resource_manager_cleanup(&mgr->manager); ttm_set_driver_manager(&xe->ttm, mgr->mem_type, NULL); + + drm_lru_mgr_fini(&dev->lru_mgr[mgr->mem_type]); } int __xe_ttm_vram_mgr_init(struct xe_device *xe, struct xe_ttm_vram_mgr *mgr, @@ -335,6 +337,7 @@ int __xe_ttm_vram_mgr_init(struct xe_device *xe, struct xe_ttm_vram_mgr *mgr, u64 default_page_size) { struct ttm_resource_manager *man = &mgr->manager; + struct drm_device *drm = &xe->drm; int err; man->func = &xe_ttm_vram_mgr_func; @@ -350,6 +353,9 @@ int __xe_ttm_vram_mgr_init(struct xe_device *xe, struct xe_ttm_vram_mgr *mgr, ttm_set_driver_manager(&xe->ttm, mem_type, &mgr->manager); ttm_resource_manager_set_used(&mgr->manager, true); + drm_lru_mgr_init(&drm->lru_mgr[mem_type], size, &drm->lru_lock); + ttm_resource_manager_set_lru_mgr(man, &drm->lru_mgr[mem_type]); + return drmm_add_action_or_reset(&xe->drm, ttm_vram_mgr_fini, mgr); } -- 2.26.3