Re: cmd64x: irq 14: nobody cared - system is dreadfully slow

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Frans Pop <elendil@xxxxxxxxx>
Date: Sun, 21 Jun 2009 14:46:37 +0200

> I tried the following additional patch, but unfortunately that did not help:
> --- a/drivers/ide/cmd64x.c
> +++ b/drivers/ide/cmd64x.c
> @@ -426,6 +426,7 @@ static const struct ide_port_info cmd64x_chipsets[]
>  		.port_ops	= &cmd64x_port_ops,
>  		.dma_ops	= &cmd648_dma_ops,
>  		.host_flags	= IDE_HFLAG_ABUSE_PREFETCH,
> +		.irq_flags	= IRQF_SHARED,
>  		.pio_mask	= ATA_PIO5,
>  		.mwdma_mask	= ATA_MWDMA2,
>  		.udma_mask	= ATA_UDMA2,
> 
> I got the idea for that from 255115fb and had hoped it would compensate
> for this change from Bart's commit:

That won't help.  All PCI IDE interfaces unconditionally set the
irq_flags to IRQF_SHARED.  This occurs in drivers/ide/setup-pci.c
via ide_pci_init_one(), which calls ide_pci_init_two(), which goes:

	host->irq_flags = IRQF_SHARED;

The key to this bug seems to be the setting of host->cur_port when the
interrupts arrive.  That's really the only major case where the IDE
driver interrupt handler elides at least reading the status register
to clear the interrupt.

That's why clearing the IDE_HFLAG_SERIALIZE flag makes the initial
bulk of unclearable interrupts go away.

I suspect that whatever is causing trouble due to IDE_HFLAG_SERIALIZE
is also, down the road, causing the hdd problem you still see.

Can you apply this debugging patch and print out the output?

Thanks!

diff --git a/drivers/ide/ide-io.c b/drivers/ide/ide-io.c
index 1059f80..8992fda 100644
--- a/drivers/ide/ide-io.c
+++ b/drivers/ide/ide-io.c
@@ -797,6 +797,25 @@ irqreturn_t ide_intr (int irq, void *dev_id)
 	int plug_device = 0;
 	struct request *uninitialized_var(rq_in_flight);
 
+#if 1
+	{
+		static int times = 0;
+		
+		if (++times <= 32)
+			goto no_log;
+
+		printk(KERN_INFO "IDE-DEBUG: host->host_flags[0x%lx] "
+		       "hwif(%p) host->cur_port(%p) "
+		       "hwif->port_ops(%pS) hwif->handler(%pS) "
+		       "hwif->polling(%d)\n",
+		       host->host_flags, hwif, host->cur_port,
+		       hwif->port_ops, hwif->handler, (int) hwif->polling);
+
+	no_log:
+		;
+	}
+#endif
+
 	if (host->host_flags & IDE_HFLAG_SERIALIZE) {
 		if (hwif != host->cur_port)
 			goto out_early;
--
To unsubscribe from this list: send the line "unsubscribe sparclinux" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Kernel Development]     [DCCP]     [Linux ARM Development]     [Linux]     [Photo]     [Yosemite Help]     [Linux ARM Kernel]     [Linux SCSI]     [Linux x86_64]     [Linux Hams]

  Powered by Linux