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; } /* @@ -71,6 +72,11 @@ unsigned int cpu_mask_to_apicid_phys(cpumask_t cpumask) { + int cpu; /* As we are using single CPU as destination, pick only one CPU here */ - return cpu_physical_id(first_cpu(cpumask)); + for_each_cpu_mask(cpu, cpumask) { + if (cpu_online(cpu)) + break; + } + return cpu_physical_id(cpu); } diff --git a/xen/arch/x86/genapic/x2apic.c b/xen/arch/x86/genapic/x2apic.c --- a/xen/arch/x86/genapic/x2apic.c +++ b/xen/arch/x86/genapic/x2apic.c @@ -101,12 +101,26 @@ unsigned int cpu_mask_to_apicid_x2apic_phys(cpumask_t cpumask) { - return cpu_physical_id(first_cpu(cpumask)); + int cpu; + + for_each_cpu_mask( cpu, cpumask ) + { + if ( cpu_online(cpu) ) + break; + } + return cpu_physical_id(cpu); } unsigned int cpu_mask_to_apicid_x2apic_cluster(cpumask_t cpumask) { - return cpu_2_logical_apicid[first_cpu(cpumask)]; + int cpu; + + for_each_cpu_mask( cpu, cpumask ) + { + if ( cpu_online(cpu) ) + break; + } + return cpu_2_logical_apicid[cpu]; } static void __send_IPI_mask_x2apic( 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;