[PATCH] drm/amd/powerplay: Protect backend resource when unload driver

Alex Deucher alexdeucher at gmail.com
Fri Sep 27 12:48:35 UTC 2019


On Fri, Sep 27, 2019 at 6:08 AM Jesse Zhang <zhexi.zhang at amd.com> wrote:
>
> From: root <root at debian.debian>

Please fix your git setup to use your proper email.

Alex

>
> Guest driver can be unloaded while engines still using some
> backend resources. That would lead to use after free and then
> cause guest driver failed.
>
> Need to add mutex lock before backend resources free to make
> sure nobody is using it.
>
> Need to check backend data availablility before VCE/UVD enter
> powergating mode, if backend resources have been free, then
> skip entering powergating.
>
> Change-Id: If7f93221ddecc578884dc9e99a52f22a43e16b07
> Signed-off-by: Jesse Zhang <zhexi.zhang at amd.com>
> ---
>  drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c | 14 ++++++++++----
>  1 file changed, 10 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c
> index d08493b..a9320a5 100644
> --- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c
> +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c
> @@ -810,8 +810,10 @@ static int vega10_hwmgr_backend_fini(struct pp_hwmgr *hwmgr)
>         kfree(hwmgr->dyn_state.vddc_dep_on_dal_pwrl);
>         hwmgr->dyn_state.vddc_dep_on_dal_pwrl = NULL;
>
> +       mutex_lock(&hwmgr->smu_lock);
>         kfree(hwmgr->backend);
>         hwmgr->backend = NULL;
> +       mutex_unlock(&hwmgr->smu_lock);
>
>         return 0;
>  }
> @@ -4619,16 +4621,20 @@ static void vega10_power_gate_vce(struct pp_hwmgr *hwmgr, bool bgate)
>  {
>         struct vega10_hwmgr *data = hwmgr->backend;
>
> -       data->vce_power_gated = bgate;
> -       vega10_enable_disable_vce_dpm(hwmgr, !bgate);
> +       if(data){
> +               data->vce_power_gated = bgate;
> +               vega10_enable_disable_vce_dpm(hwmgr, !bgate);
> +       }
>  }
>
>  static void vega10_power_gate_uvd(struct pp_hwmgr *hwmgr, bool bgate)
>  {
>         struct vega10_hwmgr *data = hwmgr->backend;
>
> -       data->uvd_power_gated = bgate;
> -       vega10_enable_disable_uvd_dpm(hwmgr, !bgate);
> +       if(data){
> +               data->uvd_power_gated = bgate;
> +               vega10_enable_disable_uvd_dpm(hwmgr, !bgate);
> +       }
>  }
>
>  static inline bool vega10_are_power_levels_equal(
> --
> 2.7.4
>
> _______________________________________________
> amd-gfx mailing list
> amd-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx


More information about the amd-gfx mailing list