This series is against the latest tip tree. Currently multiple MSI mode is limited to a single vector per device (at least on x86 and PPC). This series breathes life into pci_enable_msi_block() and makes it possible to set interrupt affinity for multiple IRQs, similarly to MSI-X. Yet, only for x86 and only when IOMMUs are present. Although IRQ and PCI subsystems are modified, the current behaviour left intact. The drivers could just start using multiple MSIs just by following the existing documentation. The AHCI device driver makes use of the new mode and a new function - pci_enable_msi_block_auto() - patches 4,5. Changes since v1: 4/5: based on Bjorn's review pci_enable_msi_block_auto() returns the number of interrupts allocated or error code 5/5: based on Jeff's comments: - AHCI specific code moved from libata-core.c to libahci.c; - the host-wide lock concern addressed - ahci_interrupt() handler split in two parts: ahci_hw_interrupt() hardware context handler and ahci_thread_fn() threaded handler; - host->lock statistics attached; Host-wide lock statistics summary: Taken using command 'if=/dev/sd{a,b,c} of=/dev/null' running in parallel on three SATA HDDs: ata1: SATA link up 1.5 Gbps (SStatus 113 SControl 300) ata2: SATA link up 1.5 Gbps (SStatus 113 SControl 300) ata3: SATA link up 3.0 Gbps (SStatus 123 SControl 300) ahci_interrupt() Capabilities: [80] MSI: Enable+ Count=1/16 Maskable- 64bit- Test holdtime-total waittime-total acquis. holdtime-avg waittime-avg # 01. 22565801.27 93056.41 6377094 3.538571216 0.014592291 02. 20358324.12 60825.47 6411012 3.175524257 0.009487655 03. 21190730.38 63610.38 6384508 3.319085884 0.009963239 04. 22491064.54 80624.96 6398390 3.515113105 0.012600820 05. 21986193.10 78034.38 6379092 3.446602291 0.012232835 06. 20556437.70 62314.64 6287673 3.269323596 0.009910604 07. 20477137.55 66190.92 6388507 3.205308776 0.010360937 08. 21442240.03 69306.80 6402109 3.349246323 0.010825620 ----------- ----------- avg 3.352346931 0.011246750 ahci_hw_interrupt() Capabilities: [80] MSI: Enable+ Count=16/16 Maskable- 64bit- Test holdtime-total waittime-total acquis. holdtime-avg waittime-avg # 09. 8936643.32 54559.79 6505606 1.373683454 0.008386581 10. 8579972.36 51496.56 6496233 1.320761180 0.007927142 11. 8138708.47 54061.46 6494647 1.253141005 0.008324003 12. 8322068.81 60427.51 6509975 1.278356493 0.009282295 13. 8527745.18 65978.83 6515589 1.308821839 0.010126303 14. 8662461.99 57291.39 6510702 1.330495850 0.008799572 15. 8054911.26 69186.41 6514262 1.236504037 0.010620759 16. 9618631.17 39726.37 6517385 1.475842101 0.006095446 ----------- ----------- avg 1.322200745 0.008695263 Attached patches: 1/5: x86, MSI: Support multiple MSIs in presense of IRQ remapping 2/5: x86, MSI: Allocate as many multiple IRQs as requested 3/5: x86, MSI: Minor readability fixes 4/5: PCI, MSI: Enable multiple MSIs with pci_enable_msi_block_auto() 5/5: AHCI: Support multiple MSIs Documentation/PCI/MSI-HOWTO.txt | 37 ++++++- arch/x86/kernel/apic/io_apic.c | 170 +++++++++++++++++++++++++++++-- drivers/ata/ahci.c | 14 ++- drivers/ata/ahci.h | 5 + drivers/ata/libahci.c | 211 +++++++++++++++++++++++++++++++++++++- drivers/pci/msi.c | 36 ++++++- include/linux/irq.h | 6 + include/linux/msi.h | 1 + include/linux/pci.h | 7 ++ kernel/irq/chip.c | 30 ++++-- kernel/irq/irqdesc.c | 31 ++++++ 11 files changed, 509 insertions(+), 39 deletions(-) -- 1.7.7.6 -- Regards, Alexander Gordeev agordeev@redhat.com