Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/amd/powerplay: added mutex protection on msg issuing

This could avoid the possible race condition.

Signed-off-by: Evan Quan <evan.quan@amd.com>
Reviewed-by: Kenneth Feng <kenneth.feng@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Evan Quan and committed by
Alex Deucher
6b6706cd a0ec2256

+18 -2
+3
drivers/gpu/drm/amd/powerplay/amd_powerplay.c
··· 50 50 hwmgr->not_vf = !amdgpu_sriov_vf(adev); 51 51 hwmgr->device = amdgpu_cgs_create_device(adev); 52 52 mutex_init(&hwmgr->smu_lock); 53 + mutex_init(&hwmgr->msg_lock); 53 54 hwmgr->chip_family = adev->family; 54 55 hwmgr->chip_id = adev->asic_type; 55 56 hwmgr->feature_mask = adev->pm.pp_feature; ··· 64 63 static void amd_powerplay_destroy(struct amdgpu_device *adev) 65 64 { 66 65 struct pp_hwmgr *hwmgr = adev->powerplay.pp_handle; 66 + 67 + mutex_destroy(&hwmgr->msg_lock); 67 68 68 69 kfree(hwmgr->hardcode_pp_table); 69 70 hwmgr->hardcode_pp_table = NULL;
+1
drivers/gpu/drm/amd/powerplay/inc/hwmgr.h
··· 743 743 bool pm_en; 744 744 bool pp_one_vf; 745 745 struct mutex smu_lock; 746 + struct mutex msg_lock; 746 747 747 748 uint32_t pp_table_version; 748 749 void *device;
+14 -2
drivers/gpu/drm/amd/powerplay/smumgr/smumgr.c
··· 136 136 (resp && !hwmgr->smumgr_funcs->get_argument)) 137 137 return -EINVAL; 138 138 139 + mutex_lock(&hwmgr->msg_lock); 140 + 139 141 ret = hwmgr->smumgr_funcs->send_msg_to_smc(hwmgr, msg); 140 - if (ret) 142 + if (ret) { 143 + mutex_unlock(&hwmgr->msg_lock); 141 144 return ret; 145 + } 142 146 143 147 if (resp) 144 148 *resp = hwmgr->smumgr_funcs->get_argument(hwmgr); 149 + 150 + mutex_unlock(&hwmgr->msg_lock); 145 151 146 152 return ret; 147 153 } ··· 164 158 (resp && !hwmgr->smumgr_funcs->get_argument)) 165 159 return -EINVAL; 166 160 161 + mutex_lock(&hwmgr->msg_lock); 162 + 167 163 ret = hwmgr->smumgr_funcs->send_msg_to_smc_with_parameter( 168 164 hwmgr, msg, parameter); 169 - if (ret) 165 + if (ret) { 166 + mutex_unlock(&hwmgr->msg_lock); 170 167 return ret; 168 + } 171 169 172 170 if (resp) 173 171 *resp = hwmgr->smumgr_funcs->get_argument(hwmgr); 172 + 173 + mutex_unlock(&hwmgr->msg_lock); 174 174 175 175 return ret; 176 176 }