Message ID | 20200731040520.3701599-18-airlied@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | ttm mem manager refactoring. | expand |
Am 31.07.20 um 06:04 schrieb Dave Airlie: > From: Dave Airlie <airlied@redhat.com> > > Signed-off-by: Dave Airlie <airlied@redhat.com> Reviewed-by: Christian König <christian.koenig@amd.com> > --- > drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c | 15 +++++++++++---- > drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 10 +++++----- > drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h | 2 ++ > drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c | 15 +++++++++++---- > 4 files changed, 29 insertions(+), 13 deletions(-) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c > index 5f58aa2eac4a..f4c870b2f348 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c > @@ -133,10 +133,18 @@ int amdgpu_gtt_mgr_init(struct amdgpu_device *adev, uint64_t gtt_size) > * Destroy and free the GTT manager, returns -EBUSY if ranges are still > * allocated inside it. > */ > -static int amdgpu_gtt_mgr_fini(struct ttm_mem_type_manager *man) > +void amdgpu_gtt_mgr_fini(struct amdgpu_device *adev) > { > - struct amdgpu_device *adev = amdgpu_ttm_adev(man->bdev); > + struct ttm_mem_type_manager *man = &adev->mman.bdev.man[TTM_PL_TT]; > struct amdgpu_gtt_mgr *mgr = man->priv; > + int ret; > + > + ttm_bo_disable_mm(man); > + > + ret = ttm_bo_force_list_clean(&adev->mman.bdev, man); > + if (ret) > + return; > + > spin_lock(&mgr->lock); > drm_mm_takedown(&mgr->mm); > spin_unlock(&mgr->lock); > @@ -146,7 +154,7 @@ static int amdgpu_gtt_mgr_fini(struct ttm_mem_type_manager *man) > device_remove_file(adev->dev, &dev_attr_mem_info_gtt_total); > device_remove_file(adev->dev, &dev_attr_mem_info_gtt_used); > > - return 0; > + ttm_bo_man_cleanup(man); > } > > /** > @@ -307,7 +315,6 @@ static void amdgpu_gtt_mgr_debug(struct ttm_mem_type_manager *man, > } > > static const struct ttm_mem_type_manager_func amdgpu_gtt_mgr_func = { > - .takedown = amdgpu_gtt_mgr_fini, > .get_node = amdgpu_gtt_mgr_new, > .put_node = amdgpu_gtt_mgr_del, > .debug = amdgpu_gtt_mgr_debug > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c > index f1bf86b8de14..b1452df8fce9 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c > @@ -2012,11 +2012,11 @@ void amdgpu_ttm_fini(struct amdgpu_device *adev) > iounmap(adev->mman.aper_base_kaddr); > adev->mman.aper_base_kaddr = NULL; > > - ttm_bo_clean_mm(&adev->mman.bdev, TTM_PL_VRAM); > - ttm_bo_clean_mm(&adev->mman.bdev, TTM_PL_TT); > - ttm_bo_clean_mm(&adev->mman.bdev, AMDGPU_PL_GDS); > - ttm_bo_clean_mm(&adev->mman.bdev, AMDGPU_PL_GWS); > - ttm_bo_clean_mm(&adev->mman.bdev, AMDGPU_PL_OA); > + amdgpu_vram_mgr_fini(adev); > + amdgpu_gtt_mgr_fini(adev); > + ttm_bo_man_takedown(&adev->mman.bdev, &adev->mman.bdev.man[AMDGPU_PL_GDS]); > + ttm_bo_man_takedown(&adev->mman.bdev, &adev->mman.bdev.man[AMDGPU_PL_GWS]); > + ttm_bo_man_takedown(&adev->mman.bdev, &adev->mman.bdev.man[AMDGPU_PL_OA]); > ttm_bo_device_release(&adev->mman.bdev); > adev->mman.initialized = false; > DRM_INFO("amdgpu: ttm finalized\n"); > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h > index fb45c0a323b0..c01fdb3f0458 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h > @@ -68,7 +68,9 @@ struct amdgpu_copy_mem { > }; > > int amdgpu_gtt_mgr_init(struct amdgpu_device *adev, uint64_t gtt_size); > +void amdgpu_gtt_mgr_fini(struct amdgpu_device *adev); > int amdgpu_vram_mgr_init(struct amdgpu_device *adev); > +void amdgpu_vram_mgr_fini(struct amdgpu_device *adev); > > bool amdgpu_gtt_mgr_has_gart_addr(struct ttm_mem_reg *mem); > uint64_t amdgpu_gtt_mgr_usage(struct ttm_mem_type_manager *man); > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c > index 1bc04835c24f..cc45be8ccb0f 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c > @@ -205,10 +205,17 @@ int amdgpu_vram_mgr_init(struct amdgpu_device *adev) > * Destroy and free the VRAM manager, returns -EBUSY if ranges are still > * allocated inside it. > */ > -static int amdgpu_vram_mgr_fini(struct ttm_mem_type_manager *man) > +void amdgpu_vram_mgr_fini(struct amdgpu_device *adev) > { > - struct amdgpu_device *adev = amdgpu_ttm_adev(man->bdev); > + struct ttm_mem_type_manager *man = &adev->mman.bdev.man[TTM_PL_VRAM]; > struct amdgpu_vram_mgr *mgr = man->priv; > + int ret; > + > + ttm_bo_disable_mm(man); > + > + ret = ttm_bo_force_list_clean(&adev->mman.bdev, man); > + if (ret) > + return; > > spin_lock(&mgr->lock); > drm_mm_takedown(&mgr->mm); > @@ -216,7 +223,8 @@ static int amdgpu_vram_mgr_fini(struct ttm_mem_type_manager *man) > kfree(mgr); > man->priv = NULL; > sysfs_remove_files(&adev->dev->kobj, amdgpu_vram_mgr_attributes); > - return 0; > + > + ttm_bo_man_cleanup(man); > } > > /** > @@ -596,7 +604,6 @@ static void amdgpu_vram_mgr_debug(struct ttm_mem_type_manager *man, > } > > static const struct ttm_mem_type_manager_func amdgpu_vram_mgr_func = { > - .takedown = amdgpu_vram_mgr_fini, > .get_node = amdgpu_vram_mgr_new, > .put_node = amdgpu_vram_mgr_del, > .debug = amdgpu_vram_mgr_debug
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c index 5f58aa2eac4a..f4c870b2f348 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c @@ -133,10 +133,18 @@ int amdgpu_gtt_mgr_init(struct amdgpu_device *adev, uint64_t gtt_size) * Destroy and free the GTT manager, returns -EBUSY if ranges are still * allocated inside it. */ -static int amdgpu_gtt_mgr_fini(struct ttm_mem_type_manager *man) +void amdgpu_gtt_mgr_fini(struct amdgpu_device *adev) { - struct amdgpu_device *adev = amdgpu_ttm_adev(man->bdev); + struct ttm_mem_type_manager *man = &adev->mman.bdev.man[TTM_PL_TT]; struct amdgpu_gtt_mgr *mgr = man->priv; + int ret; + + ttm_bo_disable_mm(man); + + ret = ttm_bo_force_list_clean(&adev->mman.bdev, man); + if (ret) + return; + spin_lock(&mgr->lock); drm_mm_takedown(&mgr->mm); spin_unlock(&mgr->lock); @@ -146,7 +154,7 @@ static int amdgpu_gtt_mgr_fini(struct ttm_mem_type_manager *man) device_remove_file(adev->dev, &dev_attr_mem_info_gtt_total); device_remove_file(adev->dev, &dev_attr_mem_info_gtt_used); - return 0; + ttm_bo_man_cleanup(man); } /** @@ -307,7 +315,6 @@ static void amdgpu_gtt_mgr_debug(struct ttm_mem_type_manager *man, } static const struct ttm_mem_type_manager_func amdgpu_gtt_mgr_func = { - .takedown = amdgpu_gtt_mgr_fini, .get_node = amdgpu_gtt_mgr_new, .put_node = amdgpu_gtt_mgr_del, .debug = amdgpu_gtt_mgr_debug diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c index f1bf86b8de14..b1452df8fce9 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c @@ -2012,11 +2012,11 @@ void amdgpu_ttm_fini(struct amdgpu_device *adev) iounmap(adev->mman.aper_base_kaddr); adev->mman.aper_base_kaddr = NULL; - ttm_bo_clean_mm(&adev->mman.bdev, TTM_PL_VRAM); - ttm_bo_clean_mm(&adev->mman.bdev, TTM_PL_TT); - ttm_bo_clean_mm(&adev->mman.bdev, AMDGPU_PL_GDS); - ttm_bo_clean_mm(&adev->mman.bdev, AMDGPU_PL_GWS); - ttm_bo_clean_mm(&adev->mman.bdev, AMDGPU_PL_OA); + amdgpu_vram_mgr_fini(adev); + amdgpu_gtt_mgr_fini(adev); + ttm_bo_man_takedown(&adev->mman.bdev, &adev->mman.bdev.man[AMDGPU_PL_GDS]); + ttm_bo_man_takedown(&adev->mman.bdev, &adev->mman.bdev.man[AMDGPU_PL_GWS]); + ttm_bo_man_takedown(&adev->mman.bdev, &adev->mman.bdev.man[AMDGPU_PL_OA]); ttm_bo_device_release(&adev->mman.bdev); adev->mman.initialized = false; DRM_INFO("amdgpu: ttm finalized\n"); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h index fb45c0a323b0..c01fdb3f0458 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h @@ -68,7 +68,9 @@ struct amdgpu_copy_mem { }; int amdgpu_gtt_mgr_init(struct amdgpu_device *adev, uint64_t gtt_size); +void amdgpu_gtt_mgr_fini(struct amdgpu_device *adev); int amdgpu_vram_mgr_init(struct amdgpu_device *adev); +void amdgpu_vram_mgr_fini(struct amdgpu_device *adev); bool amdgpu_gtt_mgr_has_gart_addr(struct ttm_mem_reg *mem); uint64_t amdgpu_gtt_mgr_usage(struct ttm_mem_type_manager *man); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c index 1bc04835c24f..cc45be8ccb0f 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c @@ -205,10 +205,17 @@ int amdgpu_vram_mgr_init(struct amdgpu_device *adev) * Destroy and free the VRAM manager, returns -EBUSY if ranges are still * allocated inside it. */ -static int amdgpu_vram_mgr_fini(struct ttm_mem_type_manager *man) +void amdgpu_vram_mgr_fini(struct amdgpu_device *adev) { - struct amdgpu_device *adev = amdgpu_ttm_adev(man->bdev); + struct ttm_mem_type_manager *man = &adev->mman.bdev.man[TTM_PL_VRAM]; struct amdgpu_vram_mgr *mgr = man->priv; + int ret; + + ttm_bo_disable_mm(man); + + ret = ttm_bo_force_list_clean(&adev->mman.bdev, man); + if (ret) + return; spin_lock(&mgr->lock); drm_mm_takedown(&mgr->mm); @@ -216,7 +223,8 @@ static int amdgpu_vram_mgr_fini(struct ttm_mem_type_manager *man) kfree(mgr); man->priv = NULL; sysfs_remove_files(&adev->dev->kobj, amdgpu_vram_mgr_attributes); - return 0; + + ttm_bo_man_cleanup(man); } /** @@ -596,7 +604,6 @@ static void amdgpu_vram_mgr_debug(struct ttm_mem_type_manager *man, } static const struct ttm_mem_type_manager_func amdgpu_vram_mgr_func = { - .takedown = amdgpu_vram_mgr_fini, .get_node = amdgpu_vram_mgr_new, .put_node = amdgpu_vram_mgr_del, .debug = amdgpu_vram_mgr_debug