aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorAlexander Gordeev <agordeev@redhat.com>2012-11-19 10:01:29 -0500
committerIngo Molnar <mingo@kernel.org>2013-01-24 11:25:12 -0500
commit51906e779f2b13b38f8153774c4c7163d412ffd9 (patch)
tree970633752f6a5cea156226cd31457289ba16f1c5 /include
parent4cca6ea04d31c22a7d0436949c072b27bde41f86 (diff)
x86/MSI: Support multiple MSIs in presense of IRQ remapping
The MSI specification has several constraints in comparison with MSI-X, most notable of them is the inability to configure MSIs independently. As a result, it is impossible to dispatch interrupts from different queues to different CPUs. This is largely devalues the support of multiple MSIs in SMP systems. Also, a necessity to allocate a contiguous block of vector numbers for devices capable of multiple MSIs might cause a considerable pressure on x86 interrupt vector allocator and could lead to fragmentation of the interrupt vectors space. This patch overcomes both drawbacks in presense of IRQ remapping and lets devices take advantage of multiple queues and per-IRQ affinity assignments. Signed-off-by: Alexander Gordeev <agordeev@redhat.com> Cc: Bjorn Helgaas <bhelgaas@google.com> Cc: Suresh Siddha <suresh.b.siddha@intel.com> Cc: Yinghai Lu <yinghai@kernel.org> Cc: Matthew Wilcox <willy@linux.intel.com> Cc: Jeff Garzik <jgarzik@pobox.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Thomas Gleixner <tglx@linutronix.de> Link: http://lkml.kernel.org/r/c8bd86ff56b5fc118257436768aaa04489ac0a4c.1353324359.git.agordeev@redhat.com Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'include')
-rw-r--r--include/linux/irq.h5
1 files changed, 5 insertions, 0 deletions
diff --git a/include/linux/irq.h b/include/linux/irq.h
index fdf2c4a238cc..1eab99111e94 100644
--- a/include/linux/irq.h
+++ b/include/linux/irq.h
@@ -528,6 +528,8 @@ extern int irq_set_handler_data(unsigned int irq, void *data);
528extern int irq_set_chip_data(unsigned int irq, void *data); 528extern int irq_set_chip_data(unsigned int irq, void *data);
529extern int irq_set_irq_type(unsigned int irq, unsigned int type); 529extern int irq_set_irq_type(unsigned int irq, unsigned int type);
530extern int irq_set_msi_desc(unsigned int irq, struct msi_desc *entry); 530extern int irq_set_msi_desc(unsigned int irq, struct msi_desc *entry);
531extern int irq_set_msi_desc_off(unsigned int irq_base, unsigned int irq_offset,
532 struct msi_desc *entry);
531extern struct irq_data *irq_get_irq_data(unsigned int irq); 533extern struct irq_data *irq_get_irq_data(unsigned int irq);
532 534
533static inline struct irq_chip *irq_get_chip(unsigned int irq) 535static inline struct irq_chip *irq_get_chip(unsigned int irq)
@@ -590,6 +592,9 @@ int __irq_alloc_descs(int irq, unsigned int from, unsigned int cnt, int node,
590#define irq_alloc_desc_from(from, node) \ 592#define irq_alloc_desc_from(from, node) \
591 irq_alloc_descs(-1, from, 1, node) 593 irq_alloc_descs(-1, from, 1, node)
592 594
595#define irq_alloc_descs_from(from, cnt, node) \
596 irq_alloc_descs(-1, from, cnt, node)
597
593void irq_free_descs(unsigned int irq, unsigned int cnt); 598void irq_free_descs(unsigned int irq, unsigned int cnt);
594int irq_reserve_irqs(unsigned int from, unsigned int cnt); 599int irq_reserve_irqs(unsigned int from, unsigned int cnt);
595 600