aboutsummaryrefslogtreecommitdiffstats
path: root/xen/arch/x86/i8259.c
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2009-08-19 12:53:46 +0100
committerKeir Fraser <keir.fraser@citrix.com>2009-08-19 12:53:46 +0100
commit487a1cffd71a34d729c05c9a379ff05ea39b9fe2 (patch)
treef049fe8aaeee2f2abdf21e49e176a6f993bf84ce /xen/arch/x86/i8259.c
parentb07b22f961709fc4639b550450caa4681881977d (diff)
downloadxen-487a1cffd71a34d729c05c9a379ff05ea39b9fe2.tar.gz
xen-487a1cffd71a34d729c05c9a379ff05ea39b9fe2.tar.bz2
xen-487a1cffd71a34d729c05c9a379ff05ea39b9fe2.zip
x86: Implement per-cpu vector for xen hypervisor
Since Xen and Linux has big differece in code base, it is very hard to port Linux's patch and apply it to Xen directly, so this patch only adopts core logic of Linux, and make it work for Xen. Key changes: 1. vector allocation algorithm 2. all IRQ chips' set_affinity logic 3. IRQ migration when cpu hot remove. 4. Break assumptions which depend on global vector policy. Signed-off-by: Xiantao Zhang <xiantao.zhang@intel.com>
Diffstat (limited to 'xen/arch/x86/i8259.c')
-rw-r--r--xen/arch/x86/i8259.c21
1 files changed, 12 insertions, 9 deletions
diff --git a/xen/arch/x86/i8259.c b/xen/arch/x86/i8259.c
index 0ae627f762..7981120413 100644
--- a/xen/arch/x86/i8259.c
+++ b/xen/arch/x86/i8259.c
@@ -58,6 +58,7 @@ BUILD_16_IRQS(0xc) BUILD_16_IRQS(0xd) BUILD_16_IRQS(0xe) BUILD_16_IRQS(0xf)
* is no hardware IRQ pin equivalent for them, they are triggered
* through the ICC by us (IPIs)
*/
+BUILD_SMP_INTERRUPT(irq_move_cleanup_interrupt,IRQ_MOVE_CLEANUP_VECTOR)
BUILD_SMP_INTERRUPT(event_check_interrupt,EVENT_CHECK_VECTOR)
BUILD_SMP_INTERRUPT(invalidate_interrupt,INVALIDATE_TLB_VECTOR)
BUILD_SMP_INTERRUPT(call_function_interrupt,CALL_FUNCTION_VECTOR)
@@ -374,7 +375,7 @@ static struct irqaction cascade = { no_action, "cascade", NULL};
void __init init_IRQ(void)
{
- int i, vector;
+ int vector, irq, cpu = smp_processor_id();
init_bsp_APIC();
@@ -389,15 +390,17 @@ void __init init_IRQ(void)
set_intr_gate(vector, interrupt[vector]);
}
- for ( i = 0; i < 16; i++ )
- {
- vector_irq[LEGACY_VECTOR(i)] = i;
- irq_desc[i].handler = &i8259A_irq_type;
+ for (irq = 0; irq < 16; irq++) {
+ struct irq_desc *desc = irq_to_desc(irq);
+ struct irq_cfg *cfg = desc->chip_data;
+
+ desc->handler = &i8259A_irq_type;
+ per_cpu(vector_irq, cpu)[FIRST_LEGACY_VECTOR + irq] = irq;
+ cfg->domain = cpumask_of_cpu(cpu);
+ cfg->vector = FIRST_LEGACY_VECTOR + irq;
}
-
- /* Never allocate the hypercall vector or Linux/BSD fast-trap vector. */
- vector_irq[HYPERCALL_VECTOR] = NEVER_ASSIGN_IRQ;
- vector_irq[0x80] = NEVER_ASSIGN_IRQ;
+
+ per_cpu(vector_irq, cpu)[FIRST_HIPRIORITY_VECTOR] = 0;
apic_intr_init();