From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Nadolski, Ed" Subject: RE: Using xen-unstable, dom0 hangs during boot Date: Sun, 28 Feb 2010 16:47:21 -0700 Message-ID: <8115AF16522A3D4383C1FF753036713F9B21E600@cosmail01.lsi.com> References: <8115AF16522A3D4383C1FF753036713F9B1B522B@cosmail01.lsi.com> <4B8703B9.9000207@goop.org> <8115AF16522A3D4383C1FF753036713F9B1B52D8@cosmail01.lsi.com> <20100226144622.GP2761@reaktio.net> <8115AF16522A3D4383C1FF753036713F9B1B54B0@cosmail01.lsi.com> Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Return-path: In-Reply-To: <8115AF16522A3D4383C1FF753036713F9B1B54B0@cosmail01.lsi.com> Content-Language: en-US List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: =?iso-8859-1?Q?Pasi_K=E4rkk=E4inen?= , Jeremy Fitzhardinge , "Xen-devel@lists.xensource.com" Cc: "Nadolski, Ed" List-Id: xen-devel@lists.xenproject.org > -----Original Message----- On 02/25/2010 02:18 PM, Nadolski, Ed wrote: > I'm running Fedora 12 (kernel 2.6.31.5-127.fc12.x86_64) on a Dell T7500 X= eon with VT-x and VT-d. After building xen-unstable and rebooting, the dom0= Linux hangs a few seconds after it gets control from Xen, and I have to po= wer-cycle to recover. Here are the last messages before it hangs: > > [ 2.766882] loop: module loaded > [ 2.767736] input: Macintosh mouse button emulation as /devices/virtua= l/input/input2 > [ 2.769396] xen_set_ioapic_routing: irq 20 gsi 20 vector 20 ioapic 0 p= in 20 triggering 1 polarity 1 > [ 2.770342] achi 0000:00:1f.2: PCI INT C -> GSI 20 (level, low) -> I= RQ 20 > [ 2.771158] ahci 0000:00:1f.2: AHCI 0001.0200 32 slots 6 ports 3 Gbps = 0x27 impl SATA mode > [ 2.772078] ahci 0000:00:1f.2: flags: 64bit ncq sntf led clo pio ems > <> I've added a bunch of trace prints. With serial ports enabled for trace cap= ture, the hang actually occurs earlier than the ahci code above. It now occ= urs during the serial8250_config_port() function in the 8250/16650 serial d= river initialization. There is a call to probe_irq_on(), which calls msleep= (20), but the msleep() never returns. (see below) If I hit the power button on the front panel, it generates an interrupt tha= t forces the msleep() to return. Also, if I replace the msleep(20) with md= elay(20), the code does not hang at that point. (In either case, the code = does hang again a short while later.) I'm not too familiar with kernel internals - what could cause the msleep() = not to return? Possibly an interrupt gets missed, or is not getting unmask= ed? Thanks again, Ed /root/xen/xen-unstable.hg/linux-2.6-pvops.git/kernel/irq/autoprobe.c: /** * probe_irq_on - begin an interrupt autodetect * * Commence probing for an interrupt. The interrupts are scanned * and a mask of potential interrupt lines is returned. * */ unsigned long probe_irq_on(void) { struct irq_desc *desc; unsigned long mask =3D 0; unsigned int status; int i; /* * quiesce the kernel, or at least the asynchronous portion */ async_synchronize_full(); mutex_lock(&probing_active); /* * something may have generated an irq long ago and we want to * flush such a longstanding irq before considering it as spurious. */ for_each_irq_desc_reverse(i, desc) { spin_lock_irq(&desc->lock); if (!desc->action && !(desc->status & IRQ_NOPROBE)) { /* * An old-style architecture might still have * the handle_bad_irq handler there: */ compat_irq_chip_set_default_handler(desc); /* * Some chips need to know about probing in * progress: */ if (desc->chip->set_type) desc->chip->set_type(i, IRQ_TYPE_PROBE); desc->chip->startup(i); } spin_unlock_irq(&desc->lock); } /* Wait for longstanding interrupts to trigger. */ msleep(20); <=3D=3D NEVER RETURNS (until power button is hit) /* * enable any unassigned irqs * (we must startup again here because if a longstanding irq * happened in the previous stage, it may have masked itself) */ for_each_irq_desc_reverse(i, desc) { spin_lock_irq(&desc->lock); if (!desc->action && !(desc->status & IRQ_NOPROBE)) { desc->status |=3D IRQ_AUTODETECT | IRQ_WAITING; if (desc->chip->startup(i)) desc->status |=3D IRQ_PENDING; } spin_unlock_irq(&desc->lock); } /* * Wait for spurious interrupts to trigger */ msleep(100); <=3D=3D ALSO HANGS HERE AND NEVER RETURNS until power= button is hit. /* * Now filter out any obviously spurious interrupts */ for_each_irq_desc(i, desc) { spin_lock_irq(&desc->lock); status =3D desc->status; if (status & IRQ_AUTODETECT) { /* It triggered already - consider it spurious. */ if (!(status & IRQ_WAITING)) { desc->status =3D status & ~IRQ_AUTODETECT; desc->chip->shutdown(i); } else if (i < 32) mask |=3D 1 << i; } spin_unlock_irq(&desc->lock); } return mask; } EXPORT_SYMBOL(probe_irq_on);