Current-Users archive

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

Re: panic in evo_wait



Hi Matt!

On Mon, Jul 18, 2022 at 01:53:49PM +1000, Matthew Green wrote:
> > [184218.xxx] warning: /usr/src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/engine/disp/nouveau_nvkm_engine_disp_headgf119.c:83: 1
> 
> can you patch this code to print the value of "data" here?
> it's probably a bad request for userland, but the BUG_ON()
> here does not give you any indication on _what_.

Ok, I'll use the attached diff for my next kernel.

> > [184218.xxx] uvm_fault(0xffffffff8191ba80, 0xffffb649e46a3000, 2) -> e
> > [184218.xxx] fatal page fault in supervisor mode
> > [184218.xxx] trap type 6 code 0x2 ...
> 
> this line's contents would have included the fault address,
> which is kinda useful for next time :-)

I've got the rip -- it's 0xffffffff8095e177.

> > [184218.xxx] curlpw 0xffffa8d4e6f36500 pid 27414.3207 lowest kstrack 0xffffb589296452c0
> > kernel: page fault trap, code=0
> > Stopped in pid 27414.3207 (mpv) at netbsd:evo_wait+0x7b: movl $0x20000
> > 000,0(%rdx,%rax,1)
> > evo_wait() at netbsd:evo_wait+0x7b
> > base507c_ntfy_set()
> > nv50_wndw_flush_set()
> > nv50_disp_atomic_commit_tail()
> > nv50_disp_atomic_commit()
> > drm_atomic_helper_set_config()
> > drm_mode_setcrtc()
> > drm_ioctl()
> 
> can you find out where evo_wait+0x7b is?  in my kernel it's
> at line 243, and the disasm seems to patch your "movl" above.
>
> 235 evo_wait(struct nv50_dmac *evoc, int nr)
> 236 {
> 237         struct nv50_dmac *dmac = evoc;
> 238         struct nvif_device *device = dmac->base.device;
> 239         u32 put = nvif_rd32(&dmac->base.user, 0x0000) / 4;
> 240
> 241         spin_lock(&dmac->lock);
> 242         if (put + nr >= (PAGE_SIZE / 4) - 8) {
> 243                 dmac->ptr[put] = 0x20000000;
> 244                 evo_flush(dmac);
> 
> Dump of assembler code for function evo_wait:
>    0xffffffff8084dfe1 <+0>:       push   %rbp
> [...]
>    0xffffffff8084e05c <+123>:     movl   $0x20000000,(%rdx,%rax,1)
> 
> (0x7b = 123)

exactly:

(gdb) 
241             spin_lock(&dmac->lock);
242             if (put + nr >= (PAGE_SIZE / 4) - 8) {
243                     dmac->ptr[put] = 0x20000000;
244                     evo_flush(dmac);
245
246                     nvif_wr32(&dmac->base.user, 0x0000, 0x00000000);
247                     if (nvif_msec(device, 2000,
248                             if (!nvif_rd32(&dmac->base.user, 0x0004))
249                                     break;
250                     ) < 0) {
(gdb) info line *(evo_wait+0x7b)
Line 243 of "/disk/6/archive/foreign/src/sys/external/bsd/drm2/dist/drm/nouveau/dispnv50/nouveau_dispnv50_disp.c" starts at address 0xffffffff8095e170 <evo_wait+116> and ends at 0xffffffff8095e17e <evo_wait+130>.

which also matches the rip:

(gdb) info line *(0xffffffff8095e177)
Line 243 of "/disk/6/archive/foreign/src/sys/external/bsd/drm2/dist/drm/nouveau/dispnv50/nouveau_dispnv50_disp.c" starts at address 0xffffffff8095e170 <evo_wait+116> and ends at 0xffffffff8095e17e <evo_wait+130>.

> probably "dmac->ptr" is invalid here.  a quick guess at the
> code indicates it's only set once in nv50_dmac_create(),
> the source from the caller(s).  at least, i can't see it
> set anywhere else right now.

 Thomas
Index: nouveau_nvkm_engine_disp_headgf119.c
===================================================================
RCS file: /cvsroot/src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/engine/disp/nouveau_nvkm_engine_disp_headgf119.c,v
retrieving revision 1.2
diff -u -r1.2 nouveau_nvkm_engine_disp_headgf119.c
--- nouveau_nvkm_engine_disp_headgf119.c	18 Dec 2021 23:45:35 -0000	1.2
+++ nouveau_nvkm_engine_disp_headgf119.c	18 Jul 2022 18:36:47 -0000
@@ -80,7 +80,7 @@
 	case 0: state->or.depth = 18; break; /*XXX: "default" */
 	default:
 		state->or.depth = 18;
-		WARN_ON(1);
+		WARN_ON(data);
 		break;
 	}
 }


Home | Main Index | Thread Index | Old Index