summaryrefslogtreecommitdiff
path: root/drivers/gpu/drm/amd/ras/ras_mgr
diff options
context:
space:
mode:
authorYiPeng Chai <YiPeng.Chai@amd.com>2026-05-19 13:47:34 +0800
committerAlex Deucher <alexander.deucher@amd.com>2026-05-19 11:54:17 -0400
commit90b0cbcba1bd6852f0af11246ff4e59fe3a4a244 (patch)
tree5362f3277e58d826747468ac51b426cc7c392120 /drivers/gpu/drm/amd/ras/ras_mgr
parentd1f9f5839bd785a3a06335a01d53282e80f8e5fa (diff)
drm/amd/ras: copy ras log data instead of referencing pointers
When generating ras cper file, the original data nodes in the ras log ring buffer may be deleted, leading to invalid pointer access. Copy the data from the ras log ring instead of directly referencing the pointers to avoid this issue. 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>
Diffstat (limited to 'drivers/gpu/drm/amd/ras/ras_mgr')
-rw-r--r--drivers/gpu/drm/amd/ras/ras_mgr/amdgpu_virt_ras_cmd.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/drivers/gpu/drm/amd/ras/ras_mgr/amdgpu_virt_ras_cmd.c b/drivers/gpu/drm/amd/ras/ras_mgr/amdgpu_virt_ras_cmd.c
index 6ef9ec7ed597..c2761f3d06a0 100644
--- a/drivers/gpu/drm/amd/ras/ras_mgr/amdgpu_virt_ras_cmd.c
+++ b/drivers/gpu/drm/amd/ras/ras_mgr/amdgpu_virt_ras_cmd.c
@@ -202,7 +202,7 @@ static bool amdgpu_virt_ras_check_batch_cached(struct ras_cmd_batch_trace_record
}
static int amdgpu_virt_ras_get_batch_records(struct ras_core_context *ras_core, uint64_t batch_id,
- struct ras_log_info **trace_arr, uint32_t arr_num,
+ struct ras_log_info *trace_arr, uint32_t arr_num,
struct ras_cmd_batch_trace_record_rsp *rsp_cache)
{
struct ras_cmd_batch_trace_record_req req = {
@@ -238,7 +238,8 @@ static int amdgpu_virt_ras_get_batch_records(struct ras_core_context *ras_core,
}
for (i = 0; i < batch->trace_num && i < arr_num; i++)
- trace_arr[i] = &rsp->records[batch->offset + i];
+ memcpy(&trace_arr[i],
+ &rsp->records[batch->offset + i], sizeof(*trace_arr));
return i;
}
@@ -255,7 +256,8 @@ static int amdgpu_virt_ras_get_cper_records(struct ras_core_context *ras_core,
(struct ras_cmd_cper_record_rsp *)cmd->output_buff_raw;
struct ras_log_batch_overview *overview = &virt_ras->batch_mgr.batch_overview;
struct ras_cmd_batch_trace_record_rsp *rsp_cache = &virt_ras->batch_mgr.batch_trace;
- struct ras_log_info **trace;
+ struct ras_log_info *trace;
+ uint32_t trace_count = MAX_RECORD_PER_BATCH;
uint32_t offset = 0, real_data_len = 0;
uint64_t batch_id;
uint8_t *out_buf;
@@ -269,7 +271,7 @@ static int amdgpu_virt_ras_get_cper_records(struct ras_core_context *ras_core,
req->buf_size > RAS_CMD_MAX_CPER_BUF_SZ)
return RAS_CMD__ERROR_INVALID_INPUT_DATA;
- trace = kzalloc_objs(*trace, MAX_RECORD_PER_BATCH);
+ trace = kzalloc_objs(*trace, trace_count);
if (!trace)
return RAS_CMD__ERROR_GENERIC;
@@ -286,7 +288,7 @@ static int amdgpu_virt_ras_get_cper_records(struct ras_core_context *ras_core,
if (batch_id >= overview->last_batch_id)
break;
count = amdgpu_virt_ras_get_batch_records(ras_core, batch_id,
- trace, MAX_RECORD_PER_BATCH,
+ trace, trace_count,
rsp_cache);
if (count > 0) {
ret = ras_cper_generate_cper(ras_core, trace, count,