drm/amdgpu: add condition check for amdgpu_umc_fill_error_record
authorYiPeng Chai <YiPeng.Chai@amd.com>
Fri, 22 Mar 2024 04:06:01 +0000 (12:06 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 26 Apr 2024 21:22:41 +0000 (17:22 -0400)
Add condition check for amdgpu_umc_fill_error_record.

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>
drivers/gpu/drm/amd/amdgpu/amdgpu_ras.h
drivers/gpu/drm/amd/amdgpu/amdgpu_umc.c
drivers/gpu/drm/amd/amdgpu/amdgpu_umc.h

index cb5a0f31d201d5fce623123a1489eb060b4b3bab..c8980d5f6540a6b5b966d34c4143519ed3c3f833 100644 (file)
@@ -579,6 +579,7 @@ struct ras_err_data {
        unsigned long de_count;
        unsigned long err_addr_cnt;
        struct eeprom_table_record *err_addr;
+       unsigned long err_addr_len;
        u32 err_list_count;
        struct list_head err_node_list;
 };
index 2bd88218c20e555b8977ffb0b87e7f3423ce3722..dcda3d24bee35e4ac11775e166ec3db844dc4624 100644 (file)
@@ -66,6 +66,8 @@ int amdgpu_umc_page_retirement_mca(struct amdgpu_device *adev,
                goto out_fini_err_data;
        }
 
+       err_data.err_addr_len = adev->umc.max_ras_err_cnt_per_query;
+
        /*
         * Translate UMC channel address to Physical address
         */
@@ -121,6 +123,8 @@ void amdgpu_umc_handle_bad_pages(struct amdgpu_device *adev,
                        if(!err_data->err_addr)
                                dev_warn(adev->dev, "Failed to alloc memory for "
                                                "umc error address record!\n");
+                       else
+                               err_data->err_addr_len = adev->umc.max_ras_err_cnt_per_query;
 
                        /* umc query_ras_error_address is also responsible for clearing
                         * error status
@@ -146,6 +150,8 @@ void amdgpu_umc_handle_bad_pages(struct amdgpu_device *adev,
                        if(!err_data->err_addr)
                                dev_warn(adev->dev, "Failed to alloc memory for "
                                                "umc error address record!\n");
+                       else
+                               err_data->err_addr_len = adev->umc.max_ras_err_cnt_per_query;
 
                        /* umc query_ras_error_address is also responsible for clearing
                         * error status
@@ -389,14 +395,20 @@ int amdgpu_umc_process_ecc_irq(struct amdgpu_device *adev,
        return 0;
 }
 
-void amdgpu_umc_fill_error_record(struct ras_err_data *err_data,
+int amdgpu_umc_fill_error_record(struct ras_err_data *err_data,
                uint64_t err_addr,
                uint64_t retired_page,
                uint32_t channel_index,
                uint32_t umc_inst)
 {
-       struct eeprom_table_record *err_rec =
-               &err_data->err_addr[err_data->err_addr_cnt];
+       struct eeprom_table_record *err_rec;
+
+       if (!err_data ||
+           !err_data->err_addr ||
+           (err_data->err_addr_cnt >= err_data->err_addr_len))
+               return -EINVAL;
+
+       err_rec = &err_data->err_addr[err_data->err_addr_cnt];
 
        err_rec->address = err_addr;
        /* page frame address is saved */
@@ -408,6 +420,8 @@ void amdgpu_umc_fill_error_record(struct ras_err_data *err_data,
        err_rec->mcumc_id = umc_inst;
 
        err_data->err_addr_cnt++;
+
+       return 0;
 }
 
 int amdgpu_umc_loop_channels(struct amdgpu_device *adev,
index 2d08d076f7c9b36345b39cc05ba1c98f9a2e45e4..9e77e6d48e3b626ac2f84dede0d0a66b46a72d5f 100644 (file)
@@ -109,7 +109,7 @@ int amdgpu_umc_poison_handler(struct amdgpu_device *adev,
 int amdgpu_umc_process_ecc_irq(struct amdgpu_device *adev,
                struct amdgpu_irq_src *source,
                struct amdgpu_iv_entry *entry);
-void amdgpu_umc_fill_error_record(struct ras_err_data *err_data,
+int amdgpu_umc_fill_error_record(struct ras_err_data *err_data,
                uint64_t err_addr,
                uint64_t retired_page,
                uint32_t channel_index,