Re: [RFC patch] Use IPI_shortcut for lapic timer broadcast

From: Luming Yu
Date: Tue Jun 30 2009 - 03:01:22 EST


Thanks for review. How about the following patch?

/**The patch is enclosed in text attachment**
**Using web client to send the patch**
**below is for review, please apply attached patch*/


Signed-off-by: Yu Luming <luming.yu@xxxxxxxxx>

apic.c | 5 ++++-
apic_flat_64.c | 7 ++++++-
2 files changed, 10 insertions(+), 2 deletions(-)


--- linux-2.6.30-rc6/arch/x86/kernel/apic/apic.c.0 2009-06-29
23:45:05.000000000 -0600
+++ linux-2.6.30-rc6/arch/x86/kernel/apic/apic.c 2009-06-30
00:37:56.000000000 -0600
@@ -419,7 +419,10 @@
static void lapic_timer_broadcast(const struct cpumask *mask)
{
#ifdef CONFIG_SMP
- apic->send_IPI_mask(mask, LOCAL_TIMER_VECTOR);
+ if (unlikely(cpumask_weight(mask) == num_online_cpus() -1))
+ apic->send_IPI_all(LOCAL_TIMER_VECTOR);
+ else
+ apic->send_IPI_mask(mask, LOCAL_TIMER_VECTOR);
#endif
}

--- linux-2.6.30-rc6/arch/x86/kernel/apic/apic_flat_64.c.0 2009-06-29
00:13:26.000000000 -0600
+++ linux-2.6.30-rc6/arch/x86/kernel/apic/apic_flat_64.c 2009-06-29
00:11:23.000000000 -0600
@@ -274,7 +274,12 @@

static void physflat_send_IPI_all(int vector)
{
- physflat_send_IPI_mask(cpu_online_mask, vector);
+ if (vector == NMI_VECTOR) {
+ physflat_send_IPI_mask(cpu_online_mask, vector);
+ } else {
+ __default_send_IPI_shortcut(APIC_DEST_ALLINC,
+ vector, apic->dest_logical);
+ }
}

static unsigned int physflat_cpu_mask_to_apicid(const struct cpumask *cpumask)

Attachment: 1.patch
Description: Binary data