summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYiPeng Chai <YiPeng.Chai@amd.com>2026-05-12 05:04:07 +0300
committerAlex Deucher <alexander.deucher@amd.com>2026-05-19 18:52:56 +0300
commitd334319060cce7d897f573ef7186c77aedacba8a (patch)
tree4b56be38a1b83974ed6743755a119ea507b76558
parent4073cdf6713b7c170e35bf055354580cc52085d6 (diff)
downloadlinux-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.c19
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,