controlling ACPI IRQ routing

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

 



Hello.

I frequently work with certain Asterisk-compatible PCI telephony interfaces that use the "zaptel" module/driver. This module generates 1000 interrupts per second (yes, I know...) and any noticeable latency in handling that interrupt can cause significant problems for modulated data audio (such as fax) passing through those telephony interfaces.

It's become apparent that IRQ priorities seem to have to a lot to do with the performance of the zaptel driver. For example, if the zaptel device sits on interrupt 16, and the network interfaces and hard drive interfaces are on higher-numbered interrupts then things tend to go well. But if the zaptel device sits on interrupt 19, and the network interfaces and hard drive interfaces are on lesser-numbered interrupts (such as 16, 17, and 18) then things tend to go poorly.

The zaptel driver comes with a utility called "zttest" which basically indicates the reliability for the application to retrieve audio samples from the device driver before too much time passes... or in other words, the latency (or lack thereof) in handling device interrupts. A good zttest score on a well-configured system is 100%, although scores as low as 99.98% seem to be tolerable for modulated data audio. However, anything less... 99.97%, 99.96, I've even seen 99.91% and worse... these constitute poor scores and inevitably indicate that audio samples will be lost during usage. (You can see that the difference between "good" and "poor" is rather a narrow margin.) Lost audio samples is tolerable for voice applications, but it is detrimental to data/fax applications.

Usually the trick, then, has been to simply start rearranging the PCI cards in the system and disabling unused devices (such as serial, parallel, and USB ports with the respective drivers) until some combination was reached where zttest scores were good - inevitably meaning that the device had a high-priority (low-numbered) interrupt.

Recently this trick is seemingly more and more difficult to perform... and it's especially difficult in cases where (like on a 1U rack-mount server) there is but one PCI slot and the motherboard BIOS offers no helpful IRQ configuration mechanism. For example, a recent installation of Fedora 8 on such a server put the zaptel device at a low-priority interrupt. After hours of futile BIOS option changes and tests and even after testing a kernel (2.6.23.11) patched with Ingo Molnar's "rt" Real-Time patches (and using chrt for the associated IRQ to increase priority) nothing seemed to help. Then I simply reverted to an old 2.6.20 kernel from Fedora Core 5 that we had used successfully on previous deployments on similar hardware... and all was fine. And, of course, the apparent difference was that the 2.6.23.11 kernel put the device interrupt high-numbered while the 2.6.20 kernel put the device interrupt low-numbered.

Sometimes, however, it's just not ideal ... or even possible ... to downgrade to a "known good" kernel. It's certainly not desirable. So my question is, "How can we deliberately control the IRQ routing assignments made by ACPI so that certain PCI devices get the highest-priority interrupts?"

I've looked into the pirq kernel option ... only to find that it's insanely difficult to understand *how* to use... and simply trying it out with various values doesn't seem to accomplish much as far as I can tell. (Yes, I have read Documentation/i386/IO-APIC.txt many times... not that it reading it makes the pirq usage any easier to understand.)

I've looked into the setpci utility... but besides the man page for it being mostly unhelpful, it's difficult to know whether or not using setpci will actually do anything for us in this respect, as there seems to be a lot of conflicting information in various posts and mail archives on whether or not an IRQ assignment can actually be changed by using setpci. And then there's the fear that by using setpci incorrectly I may actually break the hardware.

I'm fairly certain that this is simply a matter of ACPI tuning... because with one kernel the interrupt assignments are one way while with another kernel the interrupt assignments are a different way... and both kernels use IO-APIC and IRQ routing by ACPI.

I would appreciate any feedback or assistance in this matter. How can we deliberately control the IRQ routing assignments made by ACPI so that certain PCI devices get the highest-priority interrupts?

Thanks,

Lee.
-
To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux IBM ACPI]     [Linux Power Management]     [Linux Kernel]     [Linux Laptop]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]     [Linux Resources]

  Powered by Linux