aboutsummaryrefslogtreecommitdiffstats
path: root/xen/arch/x86/apic.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/apic.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/apic.c')
-rw-r--r--xen/arch/x86/apic.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/xen/arch/x86/apic.c b/xen/arch/x86/apic.c
index cb3cc115b3..b0d6392cda 100644
--- a/xen/arch/x86/apic.c
+++ b/xen/arch/x86/apic.c
@@ -70,7 +70,7 @@ int modern_apic(void)
*/
void ack_bad_irq(unsigned int irq)
{
- printk("unexpected IRQ trap at vector %02x\n", irq);
+ printk("unexpected IRQ trap at irq %02x\n", irq);
/*
* Currently unexpected vectors happen only on SMP and APIC.
* We _must_ ack these because every local APIC has only N
@@ -1197,9 +1197,11 @@ int reprogram_timer(s_time_t timeout)
fastcall void smp_apic_timer_interrupt(struct cpu_user_regs * regs)
{
+ struct cpu_user_regs *old_regs = set_irq_regs(regs);
ack_APIC_irq();
perfc_incr(apic_timer);
raise_softirq(TIMER_SOFTIRQ);
+ set_irq_regs(old_regs);
}
/*
@@ -1208,6 +1210,7 @@ fastcall void smp_apic_timer_interrupt(struct cpu_user_regs * regs)
fastcall void smp_spurious_interrupt(struct cpu_user_regs *regs)
{
unsigned long v;
+ struct cpu_user_regs *old_regs = set_irq_regs(regs);
irq_enter();
/*
@@ -1223,6 +1226,7 @@ fastcall void smp_spurious_interrupt(struct cpu_user_regs *regs)
printk(KERN_INFO "spurious APIC interrupt on CPU#%d, should never happen.\n",
smp_processor_id());
irq_exit();
+ set_irq_regs(old_regs);
}
/*
@@ -1232,6 +1236,7 @@ fastcall void smp_spurious_interrupt(struct cpu_user_regs *regs)
fastcall void smp_error_interrupt(struct cpu_user_regs *regs)
{
unsigned long v, v1;
+ struct cpu_user_regs *old_regs = set_irq_regs(regs);
irq_enter();
/* First tickle the hardware, only then report what went on. -- REW */
@@ -1254,6 +1259,7 @@ fastcall void smp_error_interrupt(struct cpu_user_regs *regs)
printk (KERN_DEBUG "APIC error on CPU%d: %02lx(%02lx)\n",
smp_processor_id(), v , v1);
irq_exit();
+ set_irq_regs(old_regs);
}
/*
@@ -1262,8 +1268,10 @@ fastcall void smp_error_interrupt(struct cpu_user_regs *regs)
fastcall void smp_pmu_apic_interrupt(struct cpu_user_regs *regs)
{
+ struct cpu_user_regs *old_regs = set_irq_regs(regs);
ack_APIC_irq();
hvm_do_pmu_interrupt(regs);
+ set_irq_regs(old_regs);
}
/*