This is particularly relevant as the number of CPUs to be supported increases (as recently happened for the default thereof). Signed-off-by: Jan Beulich --- a/xen/arch/ia64/linux-xen/iosapic.c +++ b/xen/arch/ia64/linux-xen/iosapic.c @@ -352,7 +352,7 @@ unmask_irq (unsigned int irq) static void -iosapic_set_affinity (unsigned int irq, cpumask_t mask) +iosapic_set_affinity (unsigned int irq, const cpumask_t *mask) { #ifdef CONFIG_SMP unsigned long flags; @@ -366,10 +366,10 @@ iosapic_set_affinity (unsigned int irq, irq &= (~IA64_IRQ_REDIRECTED); vec = irq_to_vector(irq); - if (cpus_empty(mask)) + if (cpumask_empty(mask)) return; - dest = cpu_physical_id(first_cpu(mask)); + dest = cpu_physical_id(cpumask_first(mask)); if (list_empty(&iosapic_intr_info[vec].rtes)) return; /* not an IOSAPIC interrupt */ --- a/xen/arch/ia64/linux-xen/mca.c +++ b/xen/arch/ia64/linux-xen/mca.c @@ -1312,7 +1312,7 @@ ia64_mca_cmc_int_handler(int cmc_irq, vo #ifndef XEN /* XXX FIXME */ schedule_work(&cmc_disable_work); #else - cpumask_raise_softirq(cpu_online_map, + cpumask_raise_softirq(&cpu_online_map, CMC_DISABLE_SOFTIRQ); #endif @@ -1383,7 +1383,7 @@ ia64_mca_cmc_int_caller(int cmc_irq, voi #ifndef XEN /* XXX FIXME */ schedule_work(&cmc_enable_work); #else - cpumask_raise_softirq(cpu_online_map, + cpumask_raise_softirq(&cpu_online_map, CMC_ENABLE_SOFTIRQ); #endif cmc_polling_enabled = 0; @@ -1904,7 +1904,7 @@ ia64_mca_late_init(void) #ifndef XEN /* XXX FIXME */ schedule_work(&cmc_enable_work); #else - cpumask_raise_softirq(cpu_online_map, CMC_ENABLE_SOFTIRQ); + cpumask_raise_softirq(&cpu_online_map, CMC_ENABLE_SOFTIRQ); #endif IA64_MCA_DEBUG("%s: CMCI/P setup and enabled.\n", __FUNCTION__); --- a/xen/arch/x86/hpet.c +++ b/xen/arch/x86/hpet.c @@ -154,16 +154,16 @@ static int reprogram_hpet_evt_channel( return ret; } -static void evt_do_broadcast(cpumask_t mask) +static void evt_do_broadcast(cpumask_t *mask) { unsigned int cpu = smp_processor_id(); - if ( cpu_test_and_clear(cpu, mask) ) + if ( cpumask_test_and_clear_cpu(cpu, mask) ) raise_softirq(TIMER_SOFTIRQ); - cpuidle_wakeup_mwait(&mask); + cpuidle_wakeup_mwait(mask); - if ( !cpus_empty(mask) ) + if ( !cpumask_empty(mask) ) cpumask_raise_softirq(mask, TIMER_SOFTIRQ); } @@ -202,7 +202,7 @@ again: } /* wakeup the cpus which have an expired event. */ - evt_do_broadcast(mask); + evt_do_broadcast(&mask); if ( next_event != STIME_MAX ) { @@ -305,14 +305,14 @@ static void hpet_msi_end(unsigned int ir { } -static void hpet_msi_set_affinity(unsigned int irq, cpumask_t mask) +static void hpet_msi_set_affinity(unsigned int irq, const cpumask_t *mask) { struct msi_msg msg; unsigned int dest; struct irq_desc * desc = irq_to_desc(irq); struct irq_cfg *cfg= desc->chip_data; - dest = set_desc_affinity(desc, &mask); + dest = set_desc_affinity(desc, mask); if (dest == BAD_APICID) return; @@ -471,9 +471,7 @@ static void hpet_attach_channel(unsigned if ( ch->cpu != cpu ) return; - /* set irq affinity */ - irq_desc[ch->irq].handler-> - set_affinity(ch->irq, cpumask_of_cpu(ch->cpu)); + hpet_msi_set_affinity(ch->irq, cpumask_of(ch->cpu)); } static void hpet_detach_channel(unsigned int cpu, @@ -495,9 +493,7 @@ static void hpet_detach_channel(unsigned } ch->cpu = first_cpu(ch->cpumask); - /* set irq affinity */ - irq_desc[ch->irq].handler-> - set_affinity(ch->irq, cpumask_of_cpu(ch->cpu)); + hpet_msi_set_affinity(ch->irq, cpumask_of(ch->cpu)); } #include --- a/xen/arch/x86/io_apic.c +++ b/xen/arch/x86/io_apic.c @@ -697,13 +697,13 @@ set_ioapic_affinity_irq_desc(struct irq_ } static void -set_ioapic_affinity_irq(unsigned int irq, const struct cpumask mask) +set_ioapic_affinity_irq(unsigned int irq, const struct cpumask *mask) { struct irq_desc *desc; desc = irq_to_desc(irq); - set_ioapic_affinity_irq_desc(desc, &mask); + set_ioapic_affinity_irq_desc(desc, mask); } #endif /* CONFIG_SMP */ @@ -802,7 +802,7 @@ void /*__init*/ setup_ioapic_dest(void) irq = pin_2_irq(irq_entry, ioapic, pin); cfg = irq_cfg(irq); BUG_ON(cpus_empty(cfg->cpu_mask)); - set_ioapic_affinity_irq(irq, cfg->cpu_mask); + set_ioapic_affinity_irq(irq, &cfg->cpu_mask); } } @@ -2063,7 +2063,7 @@ static void __init check_timer(void) vector = FIRST_HIPRIORITY_VECTOR; clear_irq_vector(0); - if ((ret = bind_irq_vector(0, vector, mask_all))) + if ((ret = bind_irq_vector(0, vector, &mask_all))) printk(KERN_ERR"..IRQ0 is not set correctly with ioapic!!!, err:%d\n", ret); irq_desc[0].status &= ~IRQ_DISABLED; --- a/xen/arch/x86/irq.c +++ b/xen/arch/x86/irq.c @@ -108,7 +108,7 @@ static void trace_irq_mask(u32 event, in trace_var(event, 1, sizeof(d), &d); } -static int __init __bind_irq_vector(int irq, int vector, cpumask_t cpu_mask) +static int __init __bind_irq_vector(int irq, int vector, const cpumask_t *cpu_mask) { cpumask_t online_mask; int cpu; @@ -117,7 +117,7 @@ static int __init __bind_irq_vector(int BUG_ON((unsigned)irq >= nr_irqs); BUG_ON((unsigned)vector >= NR_VECTORS); - cpus_and(online_mask, cpu_mask, cpu_online_map); + 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)) @@ -140,7 +140,7 @@ static int __init __bind_irq_vector(int return 0; } -int __init bind_irq_vector(int irq, int vector, cpumask_t cpu_mask) +int __init bind_irq_vector(int irq, int vector, const cpumask_t *cpu_mask) { unsigned long flags; int ret; @@ -582,7 +582,7 @@ void move_masked_irq(int irq) * For correct operation this depends on the caller masking the irqs. */ if (likely(cpus_intersects(desc->pending_mask, cpu_online_map))) - desc->handler->set_affinity(irq, desc->pending_mask); + desc->handler->set_affinity(irq, &desc->pending_mask); cpus_clear(desc->pending_mask); } @@ -1409,7 +1409,7 @@ int pirq_guest_bind(struct vcpu *v, stru /* Attempt to bind the interrupt target to the correct CPU. */ cpu_set(v->processor, cpumask); if ( !opt_noirqbalance && (desc->handler->set_affinity != NULL) ) - desc->handler->set_affinity(irq, cpumask); + desc->handler->set_affinity(irq, &cpumask); } else if ( !will_share || !action->shareable ) { @@ -1963,7 +1963,7 @@ void fixup_irqs(void) desc->handler->disable(irq); if ( desc->handler->set_affinity ) - desc->handler->set_affinity(irq, affinity); + desc->handler->set_affinity(irq, &affinity); else if ( !(warned++) ) set_affinity = 0; --- a/xen/arch/x86/msi.c +++ b/xen/arch/x86/msi.c @@ -266,7 +266,7 @@ static void write_msi_msg(struct msi_des } } -void set_msi_affinity(unsigned int irq, cpumask_t mask) +void set_msi_affinity(unsigned int irq, const cpumask_t *mask) { struct msi_msg msg; unsigned int dest; @@ -274,7 +274,7 @@ void set_msi_affinity(unsigned int irq, struct msi_desc *msi_desc = desc->msi_desc; struct irq_cfg *cfg = desc->chip_data; - dest = set_desc_affinity(desc, &mask); + dest = set_desc_affinity(desc, mask); if (dest == BAD_APICID || !msi_desc) return; --- a/xen/arch/x86/time.c +++ b/xen/arch/x86/time.c @@ -195,7 +195,7 @@ static void smp_send_timer_broadcast_ipi if ( !cpus_empty(mask) ) { - cpumask_raise_softirq(mask, TIMER_SOFTIRQ); + cpumask_raise_softirq(&mask, TIMER_SOFTIRQ); } } --- a/xen/common/keyhandler.c +++ b/xen/common/keyhandler.c @@ -207,10 +207,10 @@ static struct keyhandler reboot_machine_ .desc = "reboot machine" }; -static void cpuset_print(char *set, int size, cpumask_t mask) +static void cpuset_print(char *set, int size, const cpumask_t *mask) { *set++ = '{'; - set += cpulist_scnprintf(set, size-2, mask); + set += cpulist_scnprintf(set, size-2, *mask); *set++ = '}'; *set++ = '\0'; } @@ -244,7 +244,7 @@ static void dump_domains(unsigned char k { unsigned int i; printk("General information for domain %u:\n", d->domain_id); - cpuset_print(tmpstr, sizeof(tmpstr), *d->domain_dirty_cpumask); + cpuset_print(tmpstr, sizeof(tmpstr), d->domain_dirty_cpumask); printk(" refcnt=%d dying=%d nr_pages=%d xenheap_pages=%d " "dirty_cpus=%s max_pages=%u\n", atomic_read(&d->refcnt), d->is_dying, @@ -278,9 +278,9 @@ static void dump_domains(unsigned char k v->pause_flags, v->poll_evtchn, vcpu_info(v, evtchn_upcall_pending), vcpu_info(v, evtchn_upcall_mask)); - cpuset_print(tmpstr, sizeof(tmpstr), *v->vcpu_dirty_cpumask); + cpuset_print(tmpstr, sizeof(tmpstr), v->vcpu_dirty_cpumask); printk("dirty_cpus=%s ", tmpstr); - cpuset_print(tmpstr, sizeof(tmpstr), *v->cpu_affinity); + cpuset_print(tmpstr, sizeof(tmpstr), v->cpu_affinity); printk("cpu_affinity=%s\n", tmpstr); arch_dump_vcpu_info(v); periodic_timer_print(tmpstr, sizeof(tmpstr), v->periodic_period); --- a/xen/common/rcupdate.c +++ b/xen/common/rcupdate.c @@ -117,7 +117,7 @@ static void force_quiescent_state(struct */ cpumask = rcp->cpumask; cpu_clear(rdp->cpu, cpumask); - cpumask_raise_softirq(cpumask, SCHEDULE_SOFTIRQ); + cpumask_raise_softirq(&cpumask, SCHEDULE_SOFTIRQ); } } --- a/xen/common/sched_credit.c +++ b/xen/common/sched_credit.c @@ -310,7 +310,7 @@ __runq_tickle(unsigned int cpu, struct c /* Send scheduler interrupts to designated CPUs */ if ( !cpus_empty(mask) ) - cpumask_raise_softirq(mask, SCHEDULE_SOFTIRQ); + cpumask_raise_softirq(&mask, SCHEDULE_SOFTIRQ); } static void --- a/xen/common/softirq.c +++ b/xen/common/softirq.c @@ -68,15 +68,16 @@ void open_softirq(int nr, softirq_handle softirq_handlers[nr] = handler; } -void cpumask_raise_softirq(cpumask_t mask, unsigned int nr) +void cpumask_raise_softirq(const cpumask_t *mask, unsigned int nr) { int cpu; + cpumask_t send_mask = CPU_MASK_NONE; - for_each_cpu_mask(cpu, mask) - if ( test_and_set_bit(nr, &softirq_pending(cpu)) ) - cpu_clear(cpu, mask); + for_each_cpu_mask(cpu, *mask) + if ( !test_and_set_bit(nr, &softirq_pending(cpu)) ) + cpu_set(cpu, send_mask); - smp_send_event_check_mask(&mask); + smp_send_event_check_mask(&send_mask); } void cpu_raise_softirq(unsigned int cpu, unsigned int nr) --- a/xen/drivers/passthrough/amd/iommu_init.c +++ b/xen/drivers/passthrough/amd/iommu_init.c @@ -344,7 +344,7 @@ static void amd_iommu_reset_event_log(st set_iommu_event_log_control(iommu, IOMMU_CONTROL_ENABLED); } -static void iommu_msi_set_affinity(unsigned int irq, cpumask_t mask) +static void iommu_msi_set_affinity(unsigned int irq, const cpumask_t *mask) { struct msi_msg msg; unsigned int dest; @@ -355,7 +355,7 @@ static void iommu_msi_set_affinity(unsig u8 dev = PCI_SLOT(iommu->bdf & 0xff); u8 func = PCI_FUNC(iommu->bdf & 0xff); - dest = set_desc_affinity(desc, &mask); + dest = set_desc_affinity(desc, mask); if ( dest == BAD_APICID ) { @@ -591,7 +591,7 @@ static void enable_iommu(struct amd_iomm register_iommu_event_log_in_mmio_space(iommu); register_iommu_exclusion_range(iommu); - iommu_msi_set_affinity(iommu->irq, cpu_online_map); + iommu_msi_set_affinity(iommu->irq, &cpu_online_map); amd_iommu_msi_enable(iommu, IOMMU_CONTROL_ENABLED); set_iommu_command_buffer_control(iommu, IOMMU_CONTROL_ENABLED); --- a/xen/drivers/passthrough/vtd/iommu.c +++ b/xen/drivers/passthrough/vtd/iommu.c @@ -998,7 +998,7 @@ static void dma_msi_end(unsigned int irq ack_APIC_irq(); } -static void dma_msi_set_affinity(unsigned int irq, cpumask_t mask) +static void dma_msi_set_affinity(unsigned int irq, const cpumask_t *mask) { struct msi_msg msg; unsigned int dest; @@ -1009,7 +1009,7 @@ static void dma_msi_set_affinity(unsigne struct irq_cfg *cfg = desc->chip_data; #ifdef CONFIG_X86 - dest = set_desc_affinity(desc, &mask); + dest = set_desc_affinity(desc, mask); if (dest == BAD_APICID){ dprintk(XENLOG_ERR VTDPREFIX, "Set iommu interrupt affinity error!\n"); return; @@ -1984,7 +1984,7 @@ static int init_vtd_hw(void) iommu = drhd->iommu; cfg = irq_cfg(iommu->irq); - dma_msi_set_affinity(iommu->irq, cfg->cpu_mask); + dma_msi_set_affinity(iommu->irq, &cfg->cpu_mask); clear_fault_bits(iommu); --- a/xen/include/asm-x86/irq.h +++ b/xen/include/asm-x86/irq.h @@ -176,7 +176,7 @@ void move_masked_irq(int irq); int __assign_irq_vector(int irq, struct irq_cfg *, const cpumask_t *); -int bind_irq_vector(int irq, int vector, cpumask_t domain); +int bind_irq_vector(int irq, int vector, const cpumask_t *); void irq_set_affinity(struct irq_desc *, const cpumask_t *mask); --- a/xen/include/asm-x86/msi.h +++ b/xen/include/asm-x86/msi.h @@ -77,7 +77,7 @@ struct msi_desc; /* Helper functions */ extern void mask_msi_irq(unsigned int irq); extern void unmask_msi_irq(unsigned int irq); -extern void set_msi_affinity(unsigned int vector, cpumask_t mask); +extern void set_msi_affinity(unsigned int vector, const cpumask_t *); extern int pci_enable_msi(struct msi_info *msi, struct msi_desc **desc); extern void pci_disable_msi(struct msi_desc *desc); extern void pci_cleanup_msi(struct pci_dev *pdev); --- a/xen/include/xen/irq.h +++ b/xen/include/xen/irq.h @@ -45,7 +45,7 @@ struct hw_interrupt_type { void (*disable)(unsigned int irq); void (*ack)(unsigned int irq); void (*end)(unsigned int irq, u8 vector); - void (*set_affinity)(unsigned int irq, cpumask_t mask); + void (*set_affinity)(unsigned int irq, const cpumask_t *); }; typedef const struct hw_interrupt_type hw_irq_controller; @@ -176,11 +176,6 @@ static inline void set_native_irq_info(u irq_desc[irq].affinity = *mask; } -static inline void set_irq_info(int irq, cpumask_t mask) -{ - set_native_irq_info(irq, &mask); -} - unsigned int set_desc_affinity(struct irq_desc *, const cpumask_t *); #endif /* __XEN_IRQ_H__ */ --- a/xen/include/xen/softirq.h +++ b/xen/include/xen/softirq.h @@ -27,7 +27,7 @@ asmlinkage void do_softirq(void); void open_softirq(int nr, softirq_handler handler); void softirq_init(void); -void cpumask_raise_softirq(cpumask_t mask, unsigned int nr); +void cpumask_raise_softirq(const cpumask_t *, unsigned int nr); void cpu_raise_softirq(unsigned int cpu, unsigned int nr); void raise_softirq(unsigned int nr);