[PATCH] fix kirq for clustered apic mode

Dave Hansen (haveblue@us.ibm.com)
Sat, 15 Feb 2003 17:22:22 -0800


This is a MIME-formatted message. If you see this text it means that your
E-mail software does not support MIME-formatted messages.

--=_courier-11891-1045359519-0001-2
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

The new kirq patch assumes flat addressing APIC mode where apicid = (1
<< cpu). This isn't true for clustered mode.

- Change name/type of irq_balance_mask. The type of apicid seems to
be int.
- Change instance of (1<<cpu) to cpu_to_logical_apicid()
- Don't use target_cpu_mask, use min_loaded, and convert the real way

Tested on Summit, and plain SMP. Martin Bligh and I figured this out
together, and he agrees.

-- 
Dave Hansen
haveblue@us.ibm.com

--=_courier-11891-1045359519-0001-2 Content-Type: text/plain; name="kirq-apicid-fix-2.5.61-1.patch"; charset=iso-8859-1 Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="kirq-apicid-fix-2.5.61-1.patch"

diff -ru linux-2.5.61-clean/arch/i386/kernel/io_apic.c linux-2.5.61-irqdebug/arch/i386/kernel/io_apic.c --- linux-2.5.61-clean/arch/i386/kernel/io_apic.c 2003-02-14 17:51:26.000000000 -0600 +++ linux-2.5.61-irqdebug/arch/i386/kernel/io_apic.c 2003-02-15 17:42:51.000000000 -0600 @@ -222,7 +222,7 @@ # endif extern unsigned long irq_affinity [NR_IRQS]; -unsigned long __cacheline_aligned irq_balance_mask [NR_IRQS]; +int __cacheline_aligned pending_irq_balance_apicid [NR_IRQS]; static int irqbalance_disabled __initdata = 0; static int physical_balance = 0; @@ -441,7 +441,7 @@ Dprintk("irq = %d moved to cpu = %d\n", selected_irq, min_loaded); /* mark for change destination */ spin_lock(&desc->lock); - irq_balance_mask[selected_irq] = target_cpu_mask; + pending_irq_balance_apicid[selected_irq] = cpu_to_logical_apicid(min_loaded); spin_unlock(&desc->lock); /* Since we made a change, come back sooner to * check for more variation. @@ -500,7 +500,7 @@ if (cpu != new_cpu) { irq_desc_t *desc = irq_desc + irq; spin_lock(&desc->lock); - irq_balance_mask[irq] = cpu_to_logical_apicid(new_cpu); + pending_irq_balance_apicid[irq] = cpu_to_logical_apicid(new_cpu); spin_unlock(&desc->lock); } } @@ -515,7 +515,7 @@ /* push everything to CPU 0 to give us a starting point. */ for (i = 0 ; i < NR_IRQS ; i++) - irq_balance_mask[i] = 1 << 0; + pending_irq_balance_apicid[i] = cpu_to_logical_apicid(0); for (;;) { set_current_state(TASK_INTERRUPTIBLE); time_remaining = schedule_timeout(time_remaining); @@ -580,9 +580,9 @@ static inline void move_irq(int irq) { /* note - we hold the desc->lock */ - if (unlikely(irq_balance_mask[irq])) { - set_ioapic_affinity(irq, irq_balance_mask[irq]); - irq_balance_mask[irq] = 0; + if (unlikely(pending_irq_balance_apicid[irq])) { + set_ioapic_affinity(irq, pending_irq_balance_apicid[irq]); + pending_irq_balance_apicid[irq] = 0; } }

--=_courier-11891-1045359519-0001-2--