From owner-svn-src-head@FreeBSD.ORG Thu Jul 11 17:41:18 2013 Return-Path: Delivered-To: svn-src-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by hub.freebsd.org (Postfix) with ESMTP id 711F4786; Thu, 11 Jul 2013 17:41:18 +0000 (UTC) (envelope-from jhb@freebsd.org) Received: from bigwig.baldwin.cx (bigwig.baldwin.cx [IPv6:2001:470:1f11:75::1]) by mx1.freebsd.org (Postfix) with ESMTP id 4D4A81C28; Thu, 11 Jul 2013 17:41:18 +0000 (UTC) Received: from jhbbsd.localnet (unknown [209.249.190.124]) by bigwig.baldwin.cx (Postfix) with ESMTPSA id 6268BB953; Thu, 11 Jul 2013 13:41:17 -0400 (EDT) From: John Baldwin To: Marcel Moolenaar Subject: Re: svn commit: r253161 - head/sys/dev/uart Date: Thu, 11 Jul 2013 09:41:34 -0400 User-Agent: KMail/1.13.5 (FreeBSD/8.2-CBSD-20110714-p25; KDE/4.5.5; amd64; ; ) References: <201307101742.r6AHgKOm024113@svn.freebsd.org> <201307101409.42228.jhb@freebsd.org> In-Reply-To: MIME-Version: 1.0 Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Message-Id: <201307110941.34400.jhb@freebsd.org> X-Greylist: Sender succeeded SMTP AUTH, not delayed by milter-greylist-4.2.7 (bigwig.baldwin.cx); Thu, 11 Jul 2013 13:41:17 -0400 (EDT) Cc: svn-src-head@freebsd.org, svn-src-all@freebsd.org, Marcel Moolenaar , src-committers@freebsd.org X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 11 Jul 2013 17:41:18 -0000 On Wednesday, July 10, 2013 3:59:40 pm Marcel Moolenaar wrote: > > On Jul 10, 2013, at 11:09 AM, John Baldwin wrote: > > > On Wednesday, July 10, 2013 2:05:43 pm John Baldwin wrote: > >> On Wednesday, July 10, 2013 1:42:20 pm Marcel Moolenaar wrote: > >>> Author: marcel > >>> Date: Wed Jul 10 17:42:20 2013 > >>> New Revision: 253161 > >>> URL: http://svnweb.freebsd.org/changeset/base/253161 > >>> > >>> Log: > >>> Protect against broken hardware. In this particular case, protect against > >>> H/W not de-asserting the interrupt at all. On x86, and because of the > >>> following conditions, this results in a hard hang with interrupts disabled: > >>> 1. The uart(4) driver uses a spin lock to protect against concurrent > >>> access to the H/W. Spin locks disable and restore interrupts. > >>> 2. Restoring the interrupt on x86 always writes the flags register. Even > >>> if we're restoring the interrupt from disabled to disabled. > >>> 3. The x86 CPU has a short window in which interrupts are enabled when the > >>> flags register is written. > >> > >> Do you have proof of this? > > No. I only have proof of a hard hang during auto configuration that > cannot be fixed in any other way than not to setup the interrupt at > all. Ok. I think what is happening is that you are just spinning in the interrupt handler forever due to the hardware being stuck in that case in the old code. I assume you tried just using the count first but it still hung? (Perhaps the interrupt was for a PCI device and level-triggered and so it kept reasserting anyway?) I think your change is correct for a uart that is stuck in this way regardless, I just think the hang isn't related to weirdness with x86 temporarily re-enabling interrupts. -- John Baldwin