diff --git a/xen/arch/x86/genapic/delivery.c b/xen/arch/x86/genapic/delivery.c --- a/xen/arch/x86/genapic/delivery.c +++ b/xen/arch/x86/genapic/delivery.c @@ -36,9 +36,10 @@ return cpu_online_map; } +/* Cover only online cpus */ unsigned int cpu_mask_to_apicid_flat(cpumask_t cpumask) { - return cpus_addr(cpumask)[0]&0xFF; + return cpus_addr(cpumask)[0] & cpus_addr(cpu_online_map)[0] & 0xFF; } /* diff --git a/xen/arch/x86/irq.c b/xen/arch/x86/irq.c --- a/xen/arch/x86/irq.c +++ b/xen/arch/x86/irq.c @@ -86,14 +86,14 @@ cpus_and(online_mask, cpu_mask, cpu_online_map); if (cpus_empty(online_mask)) return -EINVAL; - if ((cfg->vector == vector) && cpus_equal(cfg->cpu_mask, online_mask)) + if ((cfg->vector == vector) && cpus_equal(cfg->cpu_mask, cpu_mask)) return 0; if (cfg->vector != IRQ_VECTOR_UNASSIGNED) return -EBUSY; for_each_cpu_mask(cpu, online_mask) per_cpu(vector_irq, cpu)[vector] = irq; cfg->vector = vector; - cfg->cpu_mask = online_mask; + cfg->cpu_mask = cpu_mask; irq_status[irq] = IRQ_USED; if (IO_APIC_IRQ(irq)) irq_vector[irq] = vector;