fix kirq for clustered apic mode
PATCH 1/1 fix kirq for clustered apic mode
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.
Signature · 2 lines
Dave Hansen [email protected]
arch/i386/kernel/io_apic.c +7 -7
@@ -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 ; } }