On Fri, Nov 29, 2013 at 21:17, Stuart Henderson wrote: > On 2013/11/29 14:34, Ted Unangst wrote: >> On Fri, Nov 29, 2013 at 13:31, RD Thrush wrote: >> > I've tried -current (Nov 28) on two real machines (soekris and amd64 >> > homebrew) which panic with apparently the same problem. FWIW, I have not >> > been able to panic a virtualbox i386 machine. The panic occurs >> > immediately after connecting to the darkstat port, ie. telnet localhost >> > 667. I've appended full sendbug details for the amd64 homebrew but can >> > provide the soekris info if the original report was insufficient. >> >> I've reverted bpf.c back to its original condition for now. >> > > It won't be enough I think (at least it wasn't enough for my similar > panics with ladvd).
I wanted one less variable in the equation. :) if (d->bd_rtout != -1 && d->bd_rdStart == 0) d->bd_rdStart = ticks; else d->bd_rdStart = 0; ... if ((d->bd_rtout != -1) || (d->bd_rdStart + d->bd_rtout) < ticks) { error = tsleep((caddr_t)d, PRINET|PCATCH, "bpf", d->bd_rtout); What does this code do with bd_rtout == -1? First conditional fails, so we always set rdStart = 0. Second if: rtout == -1, so first part fails and we go to the || expression. rdStart = 0 from above, so 0 + -1 < ticks will always be true, right? Then we pass -1 to tsleep. I think the || should be &&. You should *never* call tsleep with rtout == -1. I don't know how or why this suddently decided to break, but it seems it's always been that way. Fix here: Index: bpf.c =================================================================== RCS file: /cvs/src/sys/net/bpf.c,v retrieving revision 1.89 diff -u -p -r1.89 bpf.c --- bpf.c 29 Nov 2013 19:28:55 -0000 1.89 +++ bpf.c 29 Nov 2013 21:58:06 -0000 @@ -434,7 +434,7 @@ bpfread(dev_t dev, struct uio *uio, int ROTATE_BUFFERS(d); break; } - if ((d->bd_rtout != -1) || + if ((d->bd_rtout != -1) && (d->bd_rdStart + d->bd_rtout) < ticks) { error = tsleep((caddr_t)d, PRINET|PCATCH, "bpf", d->bd_rtout);