{
struct irq_desc *desc = irq_to_desc(irq);
struct IO_APIC_route_entry entry;
+ cpumask_t mask;
unsigned long flags;
int vector;
entry.delivery_mode = INT_DELIVERY_MODE;
entry.dest_mode = INT_DEST_MODE;
- SET_DEST(entry, logical, cpu_mask_to_apicid(TARGET_CPUS));
entry.trigger = edge_level;
entry.polarity = active_high_low;
entry.mask = 1;
return vector;
entry.vector = vector;
+ cpumask_copy(&mask, TARGET_CPUS);
+ /* Don't chance ending up with an empty mask. */
+ if (cpumask_intersects(&mask, desc->arch.cpu_mask))
+ cpumask_and(&mask, &mask, desc->arch.cpu_mask);
+ SET_DEST(entry, logical, cpu_mask_to_apicid(&mask));
+
apic_printk(APIC_DEBUG, KERN_DEBUG "IOAPIC[%d]: Set PCI routing entry "
"(%d-%d -> %#x -> IRQ %d Mode:%i Active:%i)\n", ioapic,
mp_ioapics[ioapic].mpc_apicid, pin, entry.vector, irq,
* Initialize vector_irq on a new cpu. This function must be called
* with vector_lock held.
*/
-void __setup_vector_irq(int cpu)
+void setup_vector_irq(unsigned int cpu)
{
- int irq, vector;
+ unsigned int irq, vector;
/* Clear vector_irq */
- for (vector = 0; vector < NR_VECTORS; ++vector)
+ for ( vector = 0; vector < NR_VECTORS; ++vector )
per_cpu(vector_irq, cpu)[vector] = INT_MIN;
/* Mark the inuse vectors */
- for (irq = 0; irq < nr_irqs; ++irq) {
+ for ( irq = 0; irq < nr_irqs; ++irq )
+ {
struct irq_desc *desc = irq_to_desc(irq);
- if (!irq_desc_initialized(desc) ||
- !cpumask_test_cpu(cpu, desc->arch.cpu_mask))
+ if ( !irq_desc_initialized(desc) )
continue;
vector = irq_to_vector(irq);
+ if ( vector >= FIRST_HIPRIORITY_VECTOR &&
+ vector <= LAST_HIPRIORITY_VECTOR )
+ cpumask_set_cpu(cpu, desc->arch.cpu_mask);
+ else if ( !cpumask_test_cpu(cpu, desc->arch.cpu_mask) )
+ continue;
per_cpu(vector_irq, cpu)[vector] = irq;
}
}
for ( irq = 0; irq < nr_irqs; irq++ )
{
- int break_affinity = 0;
- int set_affinity = 1;
+ bool_t break_affinity = 0, set_affinity = 1;
+ unsigned int vector;
cpumask_t affinity;
if ( irq == 2 )
spin_lock(&desc->lock);
+ vector = irq_to_vector(irq);
+ if ( vector >= FIRST_HIPRIORITY_VECTOR &&
+ vector <= LAST_HIPRIORITY_VECTOR )
+ cpumask_and(desc->arch.cpu_mask, desc->arch.cpu_mask,
+ &cpu_online_map);
+
cpumask_copy(&affinity, desc->affinity);
if ( !desc->action || cpumask_subset(&affinity, &cpu_online_map) )
{