Date: Mon, 29 Oct 2001 08:10:02 -0800 (PST) From: Tor.Egge@fast.no To: freebsd-bugs@FreeBSD.org Subject: Re: Re[2]: i386/31535: Can't reboot system: Tyan Thunder K7+ Dual AMD Athlon 1.2 MP / FreeBSD 4.4 STABLE or 4.3 RELEASE Message-ID: <200110291610.f9TGA2w15878@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR i386/31535; it has been noted by GNATS. From: Tor.Egge@fast.no To: ilin@rinet.ru Cc: freebsd-gnats-submit@FreeBSD.org Subject: Re: Re[2]: i386/31535: Can't reboot system: Tyan Thunder K7+ Dual AMD Athlon 1.2 MP / FreeBSD 4.4 STABLE or 4.3 RELEASE Date: Mon, 29 Oct 2001 17:04:38 +0100 > Hello Tor, > > Monday, October 29, 2001, 6:51:11 AM, you wrote: > > > The shutdown routine uses memory based syncronization to let the BSP > > perform the real reset. Your problem looks like a livelock, which can > > be avoided by flushing the cache after setting the variable used for > > syncronization. > > Hmm... Problem not fixed. The AP probably managed to count to 10000000 before the BSP had completed printing the message about having grabbed the MP lock. Thus cpu_reset_proxy_active was not updated before the timeout had expired. The fix for that is to move the printf call to after the wbinvd() statement in cpu_reset_proxy(). Index: sys/i386/i386/vm_machdep.c =================================================================== RCS file: /home/ncvs/src/sys/i386/i386/vm_machdep.c,v retrieving revision 1.132.2.5 diff -u -r1.132.2.5 vm_machdep.c --- sys/i386/i386/vm_machdep.c 22 Sep 2001 09:21:48 -0000 1.132.2.5 +++ sys/i386/i386/vm_machdep.c 29 Oct 2001 15:55:23 -0000 @@ -406,12 +415,14 @@ u_int saved_mp_lock; cpu_reset_proxy_active = 1; + wbinvd(); while (cpu_reset_proxy_active == 1) ; /* Wait for other cpu to disable interupts */ saved_mp_lock = mp_lock; mp_lock = 1; - printf("cpu_reset_proxy: Grabbed mp lock for BSP\n"); cpu_reset_proxy_active = 3; + wbinvd(); + printf("cpu_reset_proxy: Grabbed mp lock for BSP\n"); while (cpu_reset_proxy_active == 3) ; /* Wait for other cpu to enable interrupts */ stop_cpus((1<<cpu_reset_proxyid)); @@ -454,6 +465,7 @@ started_cpus = (1<<0); /* Restart CPU #0 */ cnt = 0; + wbinvd(); while (cpu_reset_proxy_active == 0 && cnt < 10000000) cnt++; /* Wait for BSP to announce restart */ if (cpu_reset_proxy_active == 0) @@ -461,6 +473,7 @@ __asm __volatile("cli" : : : "memory"); cpu_reset_proxy_active = 2; cnt = 0; + wbinvd(); while (cpu_reset_proxy_active == 2 && cnt < 10000000) cnt++; /* Do nothing */ if (cpu_reset_proxy_active == 2) { @@ -468,6 +481,7 @@ cpu_reset_real(); /* XXX: Bogus ? */ } cpu_reset_proxy_active = 4; + wbinvd(); __asm __volatile("sti" : : : "memory"); while (1); /* NOTREACHED */ To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200110291610.f9TGA2w15878>