[PATCH 5/5] drm/amdgpu: fix calltrace during kmd unload

Yuan, Xiaojie Xiaojie.Yuan at amd.com
Tue Nov 26 13:09:51 UTC 2019


Hi Monk,

hw_fini() is called in suspend code path as well. I'm wondering how csb can be evicted if it's not unpined before suspend.

BR,
Xiaojie

> On Nov 26, 2019, at 7:50 PM, Monk Liu <Monk.Liu at amd.com> wrote:
> 
> kernel would report a warning on double unpin
> on the csb BO because we unpin it during hw_fini
> but actually we don't need to pin/unpin it during
> hw_init/fini since it is created with kernel pinned
> 
> remove all those useless code for gfx9/10
> 
> Signed-off-by: Monk Liu <Monk.Liu at amd.com>
> ---
> drivers/gpu/drm/amd/amdgpu/amdgpu_rlc.c |  1 -
> drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c  | 38 --------------------------------
> drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c   | 39 ---------------------------------
> 3 files changed, 78 deletions(-)
> 
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_rlc.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_rlc.c
> index c8793e6..289fada 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_rlc.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_rlc.c
> @@ -145,7 +145,6 @@ int amdgpu_gfx_rlc_init_csb(struct amdgpu_device *adev)
>    dst_ptr = adev->gfx.rlc.cs_ptr;
>    adev->gfx.rlc.funcs->get_csb_buffer(adev, dst_ptr);
>    amdgpu_bo_kunmap(adev->gfx.rlc.clear_state_obj);
> -    amdgpu_bo_unpin(adev->gfx.rlc.clear_state_obj);
>    amdgpu_bo_unreserve(adev->gfx.rlc.clear_state_obj);
> 
>    return 0;
> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c
> index a56cba9..5ee7467 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c
> @@ -996,39 +996,6 @@ static int gfx_v10_0_rlc_init(struct amdgpu_device *adev)
>    return 0;
> }
> 
> -static int gfx_v10_0_csb_vram_pin(struct amdgpu_device *adev)
> -{
> -    int r;
> -
> -    r = amdgpu_bo_reserve(adev->gfx.rlc.clear_state_obj, false);
> -    if (unlikely(r != 0))
> -        return r;
> -
> -    r = amdgpu_bo_pin(adev->gfx.rlc.clear_state_obj,
> -            AMDGPU_GEM_DOMAIN_VRAM);
> -    if (!r)
> -        adev->gfx.rlc.clear_state_gpu_addr =
> -            amdgpu_bo_gpu_offset(adev->gfx.rlc.clear_state_obj);
> -
> -    amdgpu_bo_unreserve(adev->gfx.rlc.clear_state_obj);
> -
> -    return r;
> -}
> -
> -static void gfx_v10_0_csb_vram_unpin(struct amdgpu_device *adev)
> -{
> -    int r;
> -
> -    if (!adev->gfx.rlc.clear_state_obj)
> -        return;
> -
> -    r = amdgpu_bo_reserve(adev->gfx.rlc.clear_state_obj, true);
> -    if (likely(r == 0)) {
> -        amdgpu_bo_unpin(adev->gfx.rlc.clear_state_obj);
> -        amdgpu_bo_unreserve(adev->gfx.rlc.clear_state_obj);
> -    }
> -}
> -
> static void gfx_v10_0_mec_fini(struct amdgpu_device *adev)
> {
>    amdgpu_bo_free_kernel(&adev->gfx.mec.hpd_eop_obj, NULL, NULL);
> @@ -3780,10 +3747,6 @@ static int gfx_v10_0_hw_init(void *handle)
>    int r;
>    struct amdgpu_device *adev = (struct amdgpu_device *)handle;
> 
> -    r = gfx_v10_0_csb_vram_pin(adev);
> -    if (r)
> -        return r;
> -
>    if (!amdgpu_emu_mode)
>        gfx_v10_0_init_golden_registers(adev);
> 
> @@ -3871,7 +3834,6 @@ static int gfx_v10_0_hw_fini(void *handle)
>    }
>    gfx_v10_0_cp_enable(adev, false);
>    gfx_v10_0_enable_gui_idle_interrupt(adev, false);
> -    gfx_v10_0_csb_vram_unpin(adev);
> 
>    return 0;
> }
> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
> index 4cc2e50..524a7ba 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
> @@ -1683,39 +1683,6 @@ static int gfx_v9_0_rlc_init(struct amdgpu_device *adev)
>    return 0;
> }
> 
> -static int gfx_v9_0_csb_vram_pin(struct amdgpu_device *adev)
> -{
> -    int r;
> -
> -    r = amdgpu_bo_reserve(adev->gfx.rlc.clear_state_obj, false);
> -    if (unlikely(r != 0))
> -        return r;
> -
> -    r = amdgpu_bo_pin(adev->gfx.rlc.clear_state_obj,
> -            AMDGPU_GEM_DOMAIN_VRAM);
> -    if (!r)
> -        adev->gfx.rlc.clear_state_gpu_addr =
> -            amdgpu_bo_gpu_offset(adev->gfx.rlc.clear_state_obj);
> -
> -    amdgpu_bo_unreserve(adev->gfx.rlc.clear_state_obj);
> -
> -    return r;
> -}
> -
> -static void gfx_v9_0_csb_vram_unpin(struct amdgpu_device *adev)
> -{
> -    int r;
> -
> -    if (!adev->gfx.rlc.clear_state_obj)
> -        return;
> -
> -    r = amdgpu_bo_reserve(adev->gfx.rlc.clear_state_obj, true);
> -    if (likely(r == 0)) {
> -        amdgpu_bo_unpin(adev->gfx.rlc.clear_state_obj);
> -        amdgpu_bo_unreserve(adev->gfx.rlc.clear_state_obj);
> -    }
> -}
> -
> static void gfx_v9_0_mec_fini(struct amdgpu_device *adev)
> {
>    amdgpu_bo_free_kernel(&adev->gfx.mec.hpd_eop_obj, NULL, NULL);
> @@ -3694,10 +3661,6 @@ static int gfx_v9_0_hw_init(void *handle)
> 
>    gfx_v9_0_constants_init(adev);
> 
> -    r = gfx_v9_0_csb_vram_pin(adev);
> -    if (r)
> -        return r;
> -
>    r = adev->gfx.rlc.funcs->resume(adev);
>    if (r)
>        return r;
> @@ -3779,8 +3742,6 @@ static int gfx_v9_0_hw_fini(void *handle)
>    gfx_v9_0_cp_enable(adev, false);
>    adev->gfx.rlc.funcs->stop(adev);
> 
> -    gfx_v9_0_csb_vram_unpin(adev);
> -
>    return 0;
> }
> 
> -- 
> 2.7.4
> 
> _______________________________________________
> amd-gfx mailing list
> amd-gfx at lists.freedesktop.org
> https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Flists.freedesktop.org%2Fmailman%2Flistinfo%2Famd-gfx&data=02%7C01%7CXiaojie.Yuan%40amd.com%7C65e162e509ea4a90f79308d77266de65%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637103658464512751&sdata=r5fpid5IsP8anzg%2FZIYHn0N8xceBvG7rtRG80%2B7868o%3D&reserved=0


More information about the amd-gfx mailing list