Re: Interrupt storm

From: Dan Cojocar <dan.cojocar_at_gmail.com>
Date: Tue, 5 Apr 2005 19:39:29 +0300
On Apr 5, 2005 6:10 PM, John Baldwin <jhb_at_freebsd.org> wrote:
> On Saturday 02 April 2005 04:41 pm, Antoine Brodin wrote:
> > Nate Lawson <nate_at_root.org> wrote:
> > > I'm a little confused.  I don't know of anyone that has problems with
> > > the 6-current PCI irq code that works on 5-stable (which is what your
> > > cvs command updates it to).
> > >
> > > Do either of you have a problem with irq routing on 6-current that works
> > > on 5-stable?  Please send details if so.
> >
> > Hi,
> >
> > I have this problem too, but since it's on a desktop I didn't really
> > care about acpi.
> >
> > Here are some details:
> >
> > current with pci irq code from 23-Nov-2004 dmesg:
> > http://bsd.miki.eu.org/~antoine/current+oldacpi.dmesg
> >
> > current with current pci irq code dmesg:
> > http://bsd.miki.eu.org/~antoine/current+acpi.dmesg
> > (there are timeouts and interrupt storms)
> >
> > acpi tables and asl:
> > http://bsd.miki.eu.org/~antoine/acpidump
> 
> So the differences in actual IRQ assignments look like this:
> 
> 13c13
> < pcib1: slot 4 INTA routed to irq 5 via \\_SB_.PCI0.LNK2
> ---
> > pcib1: slot 4 INTA routed to irq 9 via \\_SB_.PCI0.LNK2
> 15,16c15,16
> < pcib1: slot 7 INTA is already routed to irq 12
> < pcib1: slot 10 INTA routed to irq 11 via \\_SB_.PCI0.LNK1
> ---
> > pcib1: slot 7 INTA routed to irq 12 via \\_SB_.PCI0.LNK4
> > pcib1: slot 10 INTA routed to irq 12 via \\_SB_.PCI0.LNK1
> 
> That is, LNK2 is routed to 9 rather than 5 and LNK1 is routed to 12 rather
> than 11.
> 
> I'm not sure why it does this unless somehow the wrong device_t is getting
> associated with a handle.
> 
> > grep 'LNK[12]' current+acpi.dmesg
> pci_link10: <ACPI PCI Link LNK1> irq 11 on acpi0
> pci_link11: <ACPI PCI Link LNK2> irq 5 on acpi0
> pcib1: matched entry for 1.4.INTA (src \\_SB_.PCI0.LNK2:0)
> pcib1: slot 4 INTA routed to irq 9 via \\_SB_.PCI0.LNK2
> pcib1: matched entry for 1.10.INTA (src \\_SB_.PCI0.LNK1:0)
> pcib1: slot 10 INTA routed to irq 12 via \\_SB_.PCI0.LNK1
> 
> Can you apply this patch and provide a non-verbose dmesg?
> 
> --- //depot/vendor/freebsd/src/sys/dev/acpica/acpi_pci_link.c   2005/01/18
> 20:21:25
> +++ //depot/user/jhb/acpipci/dev/acpica/acpi_pci_link.c 2005/04/05 15:07:33
> _at__at_ -913,15 +914,20 _at__at_
>          * If we have a valid BIOS IRQ, use that.  We trust what the BIOS
>          * says it routed over what _CRS says the link thinks is routed.
>          */
> -       if (PCI_INTERRUPT_VALID(link->l_bios_irq))
> +       if (PCI_INTERRUPT_VALID(link->l_bios_irq)) {
> +               device_printf(dev, "Using BIOS IRQ %d\n", link->l_bios_irq);
>                 return (link->l_bios_irq);
> +       }
> 
>         /*
>          * If we don't have a BIOS IRQ but do have a valid IRQ from _CRS,
>          * then use that.
>          */
> -       if (PCI_INTERRUPT_VALID(link->l_initial_irq))
> +       if (PCI_INTERRUPT_VALID(link->l_initial_irq)) {
> +               device_printf(dev, "Using initial IRQ %d\n",
> +                   link->l_initial_irq);
>                 return (link->l_initial_irq);
> +       }
> 
>         /*
>          * Ok, we have no useful hints, so we have to pick from the
> _at__at_ -955,7 +961,7 _at__at_
>                 }
>         }
> 
> -       if (bootverbose) {
> +       if (bootverbose || 1) {
>                 if (PCI_INTERRUPT_VALID(best_irq))
>                         device_printf(dev, "Picked IRQ %u with weight %d\n",
>                             best_irq, best_weight);
> _at__at_ -969,6 +975,9 _at__at_
>  {
>         struct link *link;
> 
> +       device_printf(dev, "Routing index %d\n", index);
> +       device_printf(dev, "My handle maps to %s\n",
> +           acpi_name(acpi_get_handle(dev));
>         ACPI_SERIAL_BEGIN(pci_link);
>         link = acpi_pci_link_lookup(dev, index);
>         if (link == NULL)
> _at__at_ -982,6 +991,7 _at__at_
>                 KASSERT(PCI_INTERRUPT_VALID(link->l_irq),
>                     ("%s: link is routed but has an invalid IRQ", __func__));
>                 ACPI_SERIAL_END(pci_link);
> +               device_printf(dev, "Already routed to %d\n", link->l_irq);
>                 return (link->l_irq);
>         }
> 
> --- //depot/vendor/freebsd/src/sys/dev/acpica/acpi_pcib.c       2005/03/08 17:25:15
> +++ //depot/user/jhb/acpipci/dev/acpica/acpi_pcib.c     2005/04/05 15:09:09
> _at__at_ -225,7 +225,7 _at__at_
>      }
>      prt = pr.pr_entry;
> 
> -    if (bootverbose) {
> +    if (bootverbose || 1) {
>         device_printf(pcib, "matched entry for %d.%d.INT%c",
>             pci_get_bus(dev), pci_get_slot(dev), 'A' + pin);
>         if (prt->Source != NULL && prt->Source[0] != '\0')
> _at__at_ -259,7 +259,7 _at__at_
>      interrupt = acpi_pci_link_route_interrupt(acpi_get_device(lnkdev),
>         prt->SourceIndex);
> 
> -    if (bootverbose && PCI_INTERRUPT_VALID(interrupt))
> +    if (/* bootverbose &&*/ PCI_INTERRUPT_VALID(interrupt))
>         device_printf(pcib, "slot %d INT%c routed to irq %d via %s\n",
>             pci_get_slot(dev), 'A' + pin, interrupt, acpi_name(lnkdev));
> 
       Hello John,

  Here is my dmesg, using your patch:
           http://cs.ubbcluj.ro/~dan/dmesg-semiverbose.txt
  I hope that we will resolve these type of storms.
      Thanks,
                     Dan
Received on Tue Apr 05 2005 - 14:39:32 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:38:31 UTC