<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<div dir="auto">
<div><br>
<div><br>
<div class="elided-text">Am 25.01.2020 19:47 schrieb Andreas Messer <andi@bastelmap.de>:<br type="attribution">
<blockquote style="margin:0 0 0 0.8ex;border-left:1px #ccc solid;padding-left:1ex">
<div><font size="2"><span style="font-size:11pt">
<div>When backing up a ring, validate pointer to avoid page fault.<br>
<br>
When the drivers attempts to handle a gpu lockup, a page fault might occur<br>
during call of radeon_ring_backup() since (*ring->next_rptr_cpu_addr) could<br>
have invalid content:<br>
<br>
  [ 3790.348267] radeon 0000:01:00.0: ring 0 stalled for more than 10150msec<br>
  [ 3790.348276] radeon 0000:01:00.0: GPU lockup (current fence id 0x00000000000699e4 last fence id 0x00000000000699f9 on ring 0)<br>
  [ 3791.504484] BUG: unable to handle page fault for address: ffffba5602800ffc<br>
  [ 3791.504485] #PF: supervisor read access in kernel mode<br>
  [ 3791.504486] #PF: error_code(0x0000) - not-present page<br>
  [ 3791.504487] PGD 851d3b067 P4D 851d3b067 PUD 0 <br>
  [ 3791.504488] Oops: 0000 [#1] SMP PTI<br>
  [ 3791.504490] CPU: 5 PID: 268 Comm: kworker/5:1H Tainted: G            E     5.4.8-amesser #3<br>
  [ 3791.504491] Hardware name: Gigabyte Technology Co., Ltd. X170-WS ECC/X170-WS ECC-CF, BIOS F2 06/20/2016<br>
  [ 3791.504507] Workqueue: radeon-crtc radeon_flip_work_func [radeon]<br>
  [ 3791.504520] RIP: 0010:radeon_ring_backup+0xb9/0x130 [radeon]<br>
<br>
It seems that my HD7750 enters such a state during thermal shutdown. Here<br>
the kernel message with added debug print and fix:<br>
<br>
  [ 2930.783094] radeon 0000:01:00.0: ring 3 stalled for more than 10280msec<br>
  [ 2930.783104] radeon 0000:01:00.0: GPU lockup (current fence id 0x000000000011194b last fence id 0x000000000011196a on ring 3)<br>
  [ 2931.936653] radeon 0000:01:00.0: Bad ptr 0xffffffff [   -1] for backup<br>
  [ 2931.937704] radeon 0000:01:00.0: GPU softreset: 0x00000BFD<br>
  [ 2931.937705] radeon 0000:01:00.0:   GRBM_STATUS               = 0xFFFFFFFF<br>
  [ 2931.937707] radeon 0000:01:00.0:   GRBM_STATUS_SE0           = 0xFFFFFFFF<br>
</div>
</span></font></div>
</blockquote>
</div>
</div>
</div>
<div dir="auto"><br>
</div>
<div dir="auto">NAK, that was suggested multiple times now and is essentially the wrong approach.</div>
<div dir="auto"><br>
</div>
<div dir="auto">The problem is that the value is invalid because the hardware is not functional any more. Returning here without backing up the ring just papers over the real problem.</div>
<div dir="auto"><br>
</div>
<div dir="auto">This is just the first occurance of this and you would need to fix a couple of hundred register accesses (both inside and outside of the driver) to make that really work reliable.</div>
<div dir="auto"><br>
</div>
<div dir="auto">The only advice I can give you is to replace the hardware. From experience those symptoms mean that your GPU will die rather soon.</div>
<div dir="auto"><br>
</div>
<div dir="auto">Regards,</div>
<div dir="auto">Christian.</div>
<div dir="auto"><br>
</div>
<div dir="auto"><br>
</div>
<div dir="auto">
<div>
<div class="elided-text">
<blockquote style="margin:0 0 0 0.8ex;border-left:1px #ccc solid;padding-left:1ex">
<div><font size="2"><span style="font-size:11pt">
<div><br>
Signed-off-by: Andreas Messer <andi@bastelmap.de><br>
---<br>
diff --git a/drivers/gpu/drm/radeon/radeon_ring.c b/drivers/gpu/drm/radeon/radeon_ring.c<br>
index 37093cea24c5..bf55a682442a 100644<br>
--- a/drivers/gpu/drm/radeon/radeon_ring.c<br>
+++ b/drivers/gpu/drm/radeon/radeon_ring.c<br>
@@ -309,6 +309,12 @@ unsigned radeon_ring_backup(struct radeon_device *rdev, struct radeon_ring *ring<br>
                 return 0;<br>
         }<br>
 <br>
+       /* ptr could be invalid after thermal shutdown */<br>
+       if (ptr >= (ring->ring_size / 4)) {<!-- --><br>
+               mutex_unlock(&rdev->ring_lock);<br>
+               return 0;<br>
+       }<br>
+<br>
         size = ring->wptr + (ring->ring_size / 4);<br>
         size -= ptr;<br>
         size &= ring->ptr_mask;<br>
</div>
</span></font></div>
</blockquote>
</div>
<br>
</div>
</div>
</div>
</body>
</html>