* [PATCH] fix kirq for clustered apic mode
@ 2003-02-16 1:22 Dave Hansen
0 siblings, 0 replies; only message in thread
From: Dave Hansen @ 2003-02-16 1:22 UTC (permalink / raw)
To: Linus Torvalds; +Cc: Martin J. Bligh, Linux Kernel Mailing List
[-- Attachment #1: Type: text/plain, Size: 457 bytes --]
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
[-- Attachment #2: kirq-apicid-fix-2.5.61-1.patch --]
[-- Type: text/plain, Size: 1946 bytes --]
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;
}
}
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2003-02-16 1:13 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2003-02-16 1:22 [PATCH] fix kirq for clustered apic mode Dave Hansen
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.