# HG changeset patch # User Kevin Tian # Date 1314800303 -3600 # Node ID 42d76c68b2bfbedee3e5f79d32344e14bce48b0f # Parent 51983821efa4db4040ae1c5063a4404791597699 x86: add irq count for IPIs such count is useful to assist decision make in cpuidle governor, while w/o this patch only device interrupts through do_IRQ is currently counted. Signed-off-by: Kevin Tian --- a/xen/arch/x86/apic.c +++ b/xen/arch/x86/apic.c @@ -1372,6 +1372,7 @@ fastcall void smp_apic_timer_interrupt(s struct cpu_user_regs *old_regs = set_irq_regs(regs); ack_APIC_irq(); perfc_incr(apic_timer); + this_cpu(irq_count)++; raise_softirq(TIMER_SOFTIRQ); set_irq_regs(old_regs); } @@ -1393,6 +1394,7 @@ fastcall void smp_spurious_interrupt(str unsigned long v; struct cpu_user_regs *old_regs = set_irq_regs(regs); + this_cpu(irq_count)++; irq_enter(); /* @@ -1428,6 +1430,7 @@ fastcall void smp_error_interrupt(struct unsigned long v, v1; struct cpu_user_regs *old_regs = set_irq_regs(regs); + this_cpu(irq_count)++; irq_enter(); /* First tickle the hardware, only then report what went on. -- REW */ v = apic_read(APIC_ESR); @@ -1459,6 +1462,7 @@ fastcall void smp_pmu_apic_interrupt(str { struct cpu_user_regs *old_regs = set_irq_regs(regs); ack_APIC_irq(); + this_cpu(irq_count)++; hvm_do_pmu_interrupt(regs); set_irq_regs(old_regs); } --- a/xen/arch/x86/cpu/mcheck/mce_intel.c +++ b/xen/arch/x86/cpu/mcheck/mce_intel.c @@ -66,6 +66,7 @@ static void (*vendor_thermal_interrupt)( fastcall void smp_thermal_interrupt(struct cpu_user_regs *regs) { struct cpu_user_regs *old_regs = set_irq_regs(regs); + this_cpu(irq_count)++; irq_enter(); vendor_thermal_interrupt(regs); irq_exit(); @@ -1094,6 +1095,7 @@ fastcall void smp_cmci_interrupt(struct struct cpu_user_regs *old_regs = set_irq_regs(regs); ack_APIC_irq(); + this_cpu(irq_count)++; irq_enter(); mctc = mcheck_mca_logout( --- a/xen/arch/x86/io_apic.c +++ b/xen/arch/x86/io_apic.c @@ -529,6 +529,7 @@ fastcall void smp_irq_move_cleanup_inter struct cpu_user_regs *old_regs = set_irq_regs(regs); ack_APIC_irq(); + this_cpu(irq_count)++; irq_enter(); me = smp_processor_id(); --- a/xen/arch/x86/smp.c +++ b/xen/arch/x86/smp.c @@ -221,6 +221,7 @@ fastcall void smp_invalidate_interrupt(v { ack_APIC_irq(); perfc_incr(ipis); + this_cpu(irq_count)++; irq_enter(); if ( !__sync_local_execstate() || (flush_flags & (FLUSH_TLB_GLOBAL | FLUSH_CACHE)) ) @@ -385,6 +386,7 @@ fastcall void smp_event_check_interrupt( struct cpu_user_regs *old_regs = set_irq_regs(regs); ack_APIC_irq(); perfc_incr(ipis); + this_cpu(irq_count)++; set_irq_regs(old_regs); } @@ -421,6 +423,7 @@ fastcall void smp_call_function_interrup ack_APIC_irq(); perfc_incr(ipis); + this_cpu(irq_count)++; __smp_call_function_interrupt(); set_irq_regs(old_regs); }