RE: [PATCH] drm/amdgpu: Fix computation for remain size of CPER ring

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



[AMD Official Use Only - AMD Internal Distribution Only]

Reviewed-by: Hawking Zhang <Hawking.Zhang@xxxxxxx>

Regards,
Hawking
-----Original Message-----
From: Liu, Xiang(Dean) <Xiang.Liu@xxxxxxx>
Sent: Thursday, March 13, 2025 11:28
To: amd-gfx@xxxxxxxxxxxxxxxxxxxxx
Cc: Zhang, Hawking <Hawking.Zhang@xxxxxxx>; Zhou1, Tao <Tao.Zhou1@xxxxxxx>; Liu, Xiang(Dean) <Xiang.Liu@xxxxxxx>
Subject: [PATCH] drm/amdgpu: Fix computation for remain size of CPER ring

The mistake of computation for remain size of CPER ring will cause unbreakable while cycle when CPER ring overflow.

Signed-off-by: Xiang Liu <xiang.liu@xxxxxxx>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_cper.c | 15 ++++++++-------
 1 file changed, 8 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cper.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cper.c
index 47fe8a04e26a..d4e90785ee33 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cper.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cper.c
@@ -452,10 +452,10 @@ static u32 amdgpu_cper_ring_get_ent_sz(struct amdgpu_ring *ring, u64 pos)
                return umin(rec_len, chunk);
 }

-void amdgpu_cper_ring_write(struct amdgpu_ring *ring,
-                                             void *src, int count)
+void amdgpu_cper_ring_write(struct amdgpu_ring *ring, void *src, int
+count)
 {
        u64 pos, wptr_old, rptr = *ring->rptr_cpu_addr & ring->ptr_mask;
+       int rec_cnt_dw = count >> 2;
        u32 chunk, ent_sz;
        u8 *s = (u8 *)src;

@@ -482,6 +482,9 @@ void amdgpu_cper_ring_write(struct amdgpu_ring *ring,
                s += chunk;
        }

+       if (ring->count_dw < rec_cnt_dw)
+               ring->count_dw = 0;
+
        /* the buffer is overflow, adjust rptr */
        if (((wptr_old < rptr) && (rptr <= ring->wptr)) ||
            ((ring->wptr < wptr_old) && (wptr_old < rptr)) || @@ -498,12 +501,10 @@ void amdgpu_cper_ring_write(struct amdgpu_ring *ring,
                        pos = rptr;
                } while (!amdgpu_cper_is_hdr(ring, rptr));
        }
-       mutex_unlock(&ring->adev->cper.ring_lock);

-       if (ring->count_dw >= (count >> 2))
-               ring->count_dw -= (count >> 2);
-       else
-               ring->count_dw = 0;
+       if (ring->count_dw >= rec_cnt_dw)
+               ring->count_dw -= rec_cnt_dw;
+       mutex_unlock(&ring->adev->cper.ring_lock);
 }

 static u64 amdgpu_cper_ring_get_rptr(struct amdgpu_ring *ring)
--
2.34.1





[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux