From owner-freebsd-bugs Sun Oct 28 20: 0:15 2001 Delivered-To: freebsd-bugs@hub.freebsd.org Received: from freefall.freebsd.org (freefall.FreeBSD.org [216.136.204.21]) by hub.freebsd.org (Postfix) with ESMTP id A9B5937B403 for ; Sun, 28 Oct 2001 20:00:02 -0800 (PST) Received: (from gnats@localhost) by freefall.freebsd.org (8.11.4/8.11.4) id f9T402Z61541; Sun, 28 Oct 2001 20:00:02 -0800 (PST) (envelope-from gnats) Date: Sun, 28 Oct 2001 20:00:02 -0800 (PST) Message-Id: <200110290400.f9T402Z61541@freefall.freebsd.org> To: freebsd-bugs@FreeBSD.org Cc: From: Tor.Egge@fast.no Subject: Re: i386/31535: Can't reboot system: Tyan Thunder K7+ Dual AMD Athlon 1.2 MP / FreeBSD 4.4 STABLE or 4.3 RELEASE Reply-To: Tor.Egge@fast.no Sender: owner-freebsd-bugs@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.org 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: 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 04:51:11 +0100 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. 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 03:41:00 -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(); while (cpu_reset_proxy_active == 3) ; /* Wait for other cpu to enable interrupts */ stop_cpus((1<