> Date: Tue, 18 Oct 2016 09:20:08 +1100 > From: Jonathan Gray <j...@jsg.id.au> > > On Sun, Oct 16, 2016 at 07:02:55PM +1100, Jonathan Gray wrote: > > On Sun, Oct 16, 2016 at 12:45:36AM -0700, Philip Guenther wrote: > > > On Sun, 16 Oct 2016, Matthieu Herrb wrote: > > > > my Sabre Lite board paniced during the night for the 1st time in > > > > several > > > > month. Here is the information I collected: > > > > > > > > kernel diagnostic assertion "p->p_wchan == NULL" failed: file > > > > "/usr/src/sys/ker > > > > n/kern_sched.c", line 333 > > > > > > This means a thread was somehow in the CPU's run-queue...but had a wait > > > channel as if it was waiting to be woken. > > > > > > ... > > > > ddb> ps > > > > TID PPID PGRP UID S FLAGS WAIT COMMAND > > > ... > > > > 86009 0 0 0 2 0x40014200 miiaut idle0 > > > > > > Bingo: S=2 --> SRUN! Or in this case, WTF!? idle threads must *NEVER* > > > have a wait channel. That smells like someone called tsleep() from an > > > interrupt and arm doesn't have the low-level machinery to detect and > > > panic > > > at the call. > > > > > > mii_phy_auto() is the source of the "miiaut" wait channel; are the mii > > > flags not set right that it's taking the tsleep() path instead of > > > timeout_* path? > > > > Looks like. I don't see a reason why anything using interrupts should > > set that flag. So fec/sxie seem to get this wrong. > > > > arch/armv7/imx/if_fec.c: mii->mii_flags = MIIF_AUTOTSLEEP; > > arch/armv7/sunxi/sxie.c: mii->mii_flags = MIIF_AUTOTSLEEP; > > dev/usb/if_aue.c: mii->mii_flags = MIIF_AUTOTSLEEP; > > dev/usb/if_axe.c: mii->mii_flags = MIIF_AUTOTSLEEP; > > dev/usb/if_mos.c: mii->mii_flags = MIIF_AUTOTSLEEP; > > dev/usb/if_udav.c: mii->mii_flags = MIIF_AUTOTSLEEP; > > dev/usb/if_url.c: mii->mii_flags = MIIF_AUTOTSLEEP; > > dev/usb/if_smsc.c: mii->mii_flags = MIIF_AUTOTSLEEP; > > dev/usb/if_axen.c: mii->mii_flags = MIIF_AUTOTSLEEP; > > dev/usb/if_ure.c: mii->mii_flags = MIIF_AUTOTSLEEP; > > > > I have no hardware with sxie, so here is just the fec diff.
ok kettenis@ > Index: if_fec.c > =================================================================== > RCS file: /cvs/src/sys/arch/armv7/imx/if_fec.c,v > retrieving revision 1.18 > diff -u -p -r1.18 if_fec.c > --- if_fec.c 22 Sep 2016 12:43:22 -0000 1.18 > +++ if_fec.c 17 Oct 2016 00:46:49 -0000 > @@ -413,7 +413,6 @@ fec_attach(struct device *parent, struct > mii->mii_readreg = fec_miibus_readreg; > mii->mii_writereg = fec_miibus_writereg; > mii->mii_statchg = fec_miibus_statchg; > - mii->mii_flags = MIIF_AUTOTSLEEP; > > ifmedia_init(&mii->mii_media, 0, fec_ifmedia_upd, fec_ifmedia_sts); > mii_attach(self, mii, 0xffffffff, MII_PHY_ANY, MII_OFFSET_ANY, 0); > >