Loading arch/powerpc/include/asm/smp.h +1 −1 Original line number Diff line number Diff line Loading @@ -40,7 +40,7 @@ extern void smp_message_recv(int); DECLARE_PER_CPU(unsigned int, cpu_pvr); #ifdef CONFIG_HOTPLUG_CPU extern void fixup_irqs(cpumask_t map); extern void fixup_irqs(const struct cpumask *map); int generic_cpu_disable(void); int generic_cpu_enable(unsigned int cpu); void generic_cpu_die(unsigned int cpu); Loading arch/powerpc/kernel/irq.c +10 −7 Original line number Diff line number Diff line Loading @@ -290,30 +290,33 @@ u64 arch_irq_stat_cpu(unsigned int cpu) } #ifdef CONFIG_HOTPLUG_CPU void fixup_irqs(cpumask_t map) void fixup_irqs(const struct cpumask *map) { struct irq_desc *desc; unsigned int irq; static int warned; cpumask_var_t mask; for_each_irq(irq) { cpumask_t mask; alloc_cpumask_var(&mask, GFP_KERNEL); for_each_irq(irq) { desc = irq_to_desc(irq); if (desc && desc->status & IRQ_PER_CPU) continue; cpumask_and(&mask, desc->affinity, &map); if (any_online_cpu(mask) == NR_CPUS) { cpumask_and(mask, desc->affinity, map); if (cpumask_any(mask) >= nr_cpu_ids) { printk("Breaking affinity for irq %i\n", irq); mask = map; cpumask_copy(mask, map); } if (desc->chip->set_affinity) desc->chip->set_affinity(irq, &mask); desc->chip->set_affinity(irq, mask); else if (desc->action && !(warned++)) printk("Cannot set affinity for irq %i\n", irq); } free_cpumask_var(mask); local_irq_enable(); mdelay(1); local_irq_disable(); Loading arch/powerpc/kernel/smp.c +2 −2 Original line number Diff line number Diff line Loading @@ -313,7 +313,7 @@ int generic_cpu_disable(void) set_cpu_online(cpu, false); #ifdef CONFIG_PPC64 vdso_data->processorCount--; fixup_irqs(cpu_online_map); fixup_irqs(cpu_online_mask); #endif return 0; } Loading @@ -333,7 +333,7 @@ int generic_cpu_enable(unsigned int cpu) cpu_relax(); #ifdef CONFIG_PPC64 fixup_irqs(cpu_online_map); fixup_irqs(cpu_online_mask); /* counter the irq disable in fixup_irqs */ local_irq_enable(); #endif Loading Loading
arch/powerpc/include/asm/smp.h +1 −1 Original line number Diff line number Diff line Loading @@ -40,7 +40,7 @@ extern void smp_message_recv(int); DECLARE_PER_CPU(unsigned int, cpu_pvr); #ifdef CONFIG_HOTPLUG_CPU extern void fixup_irqs(cpumask_t map); extern void fixup_irqs(const struct cpumask *map); int generic_cpu_disable(void); int generic_cpu_enable(unsigned int cpu); void generic_cpu_die(unsigned int cpu); Loading
arch/powerpc/kernel/irq.c +10 −7 Original line number Diff line number Diff line Loading @@ -290,30 +290,33 @@ u64 arch_irq_stat_cpu(unsigned int cpu) } #ifdef CONFIG_HOTPLUG_CPU void fixup_irqs(cpumask_t map) void fixup_irqs(const struct cpumask *map) { struct irq_desc *desc; unsigned int irq; static int warned; cpumask_var_t mask; for_each_irq(irq) { cpumask_t mask; alloc_cpumask_var(&mask, GFP_KERNEL); for_each_irq(irq) { desc = irq_to_desc(irq); if (desc && desc->status & IRQ_PER_CPU) continue; cpumask_and(&mask, desc->affinity, &map); if (any_online_cpu(mask) == NR_CPUS) { cpumask_and(mask, desc->affinity, map); if (cpumask_any(mask) >= nr_cpu_ids) { printk("Breaking affinity for irq %i\n", irq); mask = map; cpumask_copy(mask, map); } if (desc->chip->set_affinity) desc->chip->set_affinity(irq, &mask); desc->chip->set_affinity(irq, mask); else if (desc->action && !(warned++)) printk("Cannot set affinity for irq %i\n", irq); } free_cpumask_var(mask); local_irq_enable(); mdelay(1); local_irq_disable(); Loading
arch/powerpc/kernel/smp.c +2 −2 Original line number Diff line number Diff line Loading @@ -313,7 +313,7 @@ int generic_cpu_disable(void) set_cpu_online(cpu, false); #ifdef CONFIG_PPC64 vdso_data->processorCount--; fixup_irqs(cpu_online_map); fixup_irqs(cpu_online_mask); #endif return 0; } Loading @@ -333,7 +333,7 @@ int generic_cpu_enable(unsigned int cpu) cpu_relax(); #ifdef CONFIG_PPC64 fixup_irqs(cpu_online_map); fixup_irqs(cpu_online_mask); /* counter the irq disable in fixup_irqs */ local_irq_enable(); #endif Loading