On 08/30/13 11:35, Lundberg, Johannes wrote:
Hi Hans
I tried the patch and the result is the same. However, I found the command
that causes the freeze. Also, it is not always it freezes but maybe 9/10
reboots or more frequently.
At the end of the function xhci_start_controller(..) there is a for loop:
487 for (i = 0; i != 100; i++) {
488 usb_pause_mtx(NULL, hz / 100);
489 temp = XREAD4(sc, oper, XHCI_USBSTS) & XHCI_STS_HCH;
490 if (!temp)
491 break;
492 }
and it freezes at usb_pause_mtx(...)
value of i is 0
value of hz is 1000
Hi,
Can you try the attached patch?
I think this is a problem inside DELAY(). Maybe you have to select
another timing source for DELAY(), mav @ CC'ed?
--HPS
=== sys/kern/kern_synch.c
==================================================================
--- sys/kern/kern_synch.c (revision 254832)
+++ sys/kern/kern_synch.c (local)
@@ -356,11 +356,8 @@
int
pause_sbt(const char *wmesg, sbintime_t sbt, sbintime_t pr, int flags)
{
- int sbt_sec;
+ KASSERT(sbt >= 0, ("pause: timeout must be >= 0"));
- sbt_sec = sbintime_getsec(sbt);
- KASSERT(sbt_sec >= 0, ("pause: timo must be >= 0"));
-
/* silently convert invalid timeouts */
if (sbt == 0)
sbt = tick_sbt;
@@ -370,11 +367,14 @@
* We delay one second at a time to avoid overflowing the
* system specific DELAY() function(s):
*/
- while (sbt_sec > 0) {
+ while (sbt >= SBT_1S) {
DELAY(1000000);
- sbt_sec--;
+ sbt -= SBT_1S;
}
- DELAY((sbt & 0xffffffff) / SBT_1US);
+ /* Do the delay remainder */
+ sbt /= SBT_1US;
+ if (sbt != 0)
+ DELAY(sbt);
return (0);
}
return (_sleep(&pause_wchan[curcpu], NULL, 0, wmesg, sbt, pr, flags));
_______________________________________________
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to "freebsd-current-unsubscr...@freebsd.org"