diff options
| author | YiPeng Chai <YiPeng.Chai@amd.com> | 2026-05-12 05:04:07 +0300 |
|---|---|---|
| committer | Alex Deucher <alexander.deucher@amd.com> | 2026-05-19 18:52:56 +0300 |
| commit | d334319060cce7d897f573ef7186c77aedacba8a (patch) | |
| tree | 4b56be38a1b83974ed6743755a119ea507b76558 | |
| parent | 4073cdf6713b7c170e35bf055354580cc52085d6 (diff) | |
| download | linux-d334319060cce7d897f573ef7186c77aedacba8a.tar.xz | |
drm/amd/ras: use mutex to prevent concurrent access conflicts
Use mutex to prevent concurrent access conflicts.
Signed-off-by: YiPeng Chai <YiPeng.Chai@amd.com>
Reviewed-by: Tao Zhou <tao.zhou1@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
| -rw-r--r-- | drivers/gpu/drm/amd/ras/rascore/ras_cmd.c | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/drivers/gpu/drm/amd/ras/rascore/ras_cmd.c b/drivers/gpu/drm/amd/ras/rascore/ras_cmd.c index 8303aecf91ba..c22c48dec7bb 100644 --- a/drivers/gpu/drm/amd/ras/rascore/ras_cmd.c +++ b/drivers/gpu/drm/amd/ras/rascore/ras_cmd.c @@ -87,25 +87,31 @@ static int ras_cmd_get_group_bad_pages(struct ras_core_context *ras_core, struct eeprom_umc_record record; struct ras_cmd_bad_page_record *ras_cmd_record; uint32_t i = 0, bp_cnt = 0, group_cnt = 0; + int ret = RAS_CMD__SUCCESS; output_data->bp_in_group = 0; output_data->group_index = 0; + mutex_lock(&ras_core->ras_umc.umc_lock); bp_cnt = ras_umc_get_badpage_count(ras_core); if (bp_cnt) { output_data->group_index = group_index; group_cnt = bp_cnt / RAS_CMD_MAX_BAD_PAGES_PER_GROUP + ((bp_cnt % RAS_CMD_MAX_BAD_PAGES_PER_GROUP) ? 1 : 0); - if (group_index >= group_cnt) - return RAS_CMD__ERROR_INVALID_INPUT_DATA; + if (group_index >= group_cnt) { + ret = RAS_CMD__ERROR_INVALID_INPUT_DATA; + goto out; + } i = group_index * RAS_CMD_MAX_BAD_PAGES_PER_GROUP; for (; i < bp_cnt && output_data->bp_in_group < RAS_CMD_MAX_BAD_PAGES_PER_GROUP; i++) { - if (ras_umc_get_badpage_record(ras_core, i, &record)) - return RAS_CMD__ERROR_GENERIC; + if (ras_umc_get_badpage_record(ras_core, i, &record)) { + ret = RAS_CMD__ERROR_GENERIC; + goto out; + } ras_cmd_record = &output_data->records[i % RAS_CMD_MAX_BAD_PAGES_PER_GROUP]; @@ -115,7 +121,10 @@ static int ras_cmd_get_group_bad_pages(struct ras_core_context *ras_core, } } output_data->bp_total_cnt = bp_cnt; - return RAS_CMD__SUCCESS; + +out: + mutex_unlock(&ras_core->ras_umc.umc_lock); + return ret; } static int ras_cmd_get_bad_pages(struct ras_core_context *ras_core, |
