diff options
Diffstat (limited to 'arch/ia64/kernel/iosapic.c')
| -rw-r--r-- | arch/ia64/kernel/iosapic.c | 35 |
1 files changed, 17 insertions, 18 deletions
diff --git a/arch/ia64/kernel/iosapic.c b/arch/ia64/kernel/iosapic.c index 5c4674ae8aea..5cfd3d91001a 100644 --- a/arch/ia64/kernel/iosapic.c +++ b/arch/ia64/kernel/iosapic.c | |||
| @@ -330,25 +330,25 @@ unmask_irq (unsigned int irq) | |||
| 330 | 330 | ||
| 331 | 331 | ||
| 332 | static void | 332 | static void |
| 333 | iosapic_set_affinity (unsigned int irq, cpumask_t mask) | 333 | iosapic_set_affinity(unsigned int irq, const struct cpumask *mask) |
| 334 | { | 334 | { |
| 335 | #ifdef CONFIG_SMP | 335 | #ifdef CONFIG_SMP |
| 336 | u32 high32, low32; | 336 | u32 high32, low32; |
| 337 | int dest, rte_index; | 337 | int cpu, dest, rte_index; |
| 338 | int redir = (irq & IA64_IRQ_REDIRECTED) ? 1 : 0; | 338 | int redir = (irq & IA64_IRQ_REDIRECTED) ? 1 : 0; |
| 339 | struct iosapic_rte_info *rte; | 339 | struct iosapic_rte_info *rte; |
| 340 | struct iosapic *iosapic; | 340 | struct iosapic *iosapic; |
| 341 | 341 | ||
| 342 | irq &= (~IA64_IRQ_REDIRECTED); | 342 | irq &= (~IA64_IRQ_REDIRECTED); |
| 343 | 343 | ||
| 344 | cpus_and(mask, mask, cpu_online_map); | 344 | cpu = cpumask_first_and(cpu_online_mask, mask); |
| 345 | if (cpus_empty(mask)) | 345 | if (cpu >= nr_cpu_ids) |
| 346 | return; | 346 | return; |
| 347 | 347 | ||
| 348 | if (irq_prepare_move(irq, first_cpu(mask))) | 348 | if (irq_prepare_move(irq, cpu)) |
| 349 | return; | 349 | return; |
| 350 | 350 | ||
| 351 | dest = cpu_physical_id(first_cpu(mask)); | 351 | dest = cpu_physical_id(cpu); |
| 352 | 352 | ||
| 353 | if (!iosapic_intr_info[irq].count) | 353 | if (!iosapic_intr_info[irq].count) |
| 354 | return; /* not an IOSAPIC interrupt */ | 354 | return; /* not an IOSAPIC interrupt */ |
| @@ -695,32 +695,31 @@ get_target_cpu (unsigned int gsi, int irq) | |||
| 695 | #ifdef CONFIG_NUMA | 695 | #ifdef CONFIG_NUMA |
| 696 | { | 696 | { |
| 697 | int num_cpus, cpu_index, iosapic_index, numa_cpu, i = 0; | 697 | int num_cpus, cpu_index, iosapic_index, numa_cpu, i = 0; |
| 698 | cpumask_t cpu_mask; | 698 | const struct cpumask *cpu_mask; |
| 699 | 699 | ||
| 700 | iosapic_index = find_iosapic(gsi); | 700 | iosapic_index = find_iosapic(gsi); |
| 701 | if (iosapic_index < 0 || | 701 | if (iosapic_index < 0 || |
| 702 | iosapic_lists[iosapic_index].node == MAX_NUMNODES) | 702 | iosapic_lists[iosapic_index].node == MAX_NUMNODES) |
| 703 | goto skip_numa_setup; | 703 | goto skip_numa_setup; |
| 704 | 704 | ||
| 705 | cpu_mask = node_to_cpumask(iosapic_lists[iosapic_index].node); | 705 | cpu_mask = cpumask_of_node(iosapic_lists[iosapic_index].node); |
| 706 | cpus_and(cpu_mask, cpu_mask, domain); | 706 | num_cpus = 0; |
| 707 | for_each_cpu_mask(numa_cpu, cpu_mask) { | 707 | for_each_cpu_and(numa_cpu, cpu_mask, &domain) { |
| 708 | if (!cpu_online(numa_cpu)) | 708 | if (cpu_online(numa_cpu)) |
| 709 | cpu_clear(numa_cpu, cpu_mask); | 709 | num_cpus++; |
| 710 | } | 710 | } |
| 711 | 711 | ||
| 712 | num_cpus = cpus_weight(cpu_mask); | ||
| 713 | |||
| 714 | if (!num_cpus) | 712 | if (!num_cpus) |
| 715 | goto skip_numa_setup; | 713 | goto skip_numa_setup; |
| 716 | 714 | ||
| 717 | /* Use irq assignment to distribute across cpus in node */ | 715 | /* Use irq assignment to distribute across cpus in node */ |
| 718 | cpu_index = irq % num_cpus; | 716 | cpu_index = irq % num_cpus; |
| 719 | 717 | ||
| 720 | for (numa_cpu = first_cpu(cpu_mask) ; i < cpu_index ; i++) | 718 | for_each_cpu_and(numa_cpu, cpu_mask, &domain) |
| 721 | numa_cpu = next_cpu(numa_cpu, cpu_mask); | 719 | if (cpu_online(numa_cpu) && i++ >= cpu_index) |
| 720 | break; | ||
| 722 | 721 | ||
| 723 | if (numa_cpu != NR_CPUS) | 722 | if (numa_cpu < nr_cpu_ids) |
| 724 | return cpu_physical_id(numa_cpu); | 723 | return cpu_physical_id(numa_cpu); |
| 725 | } | 724 | } |
| 726 | skip_numa_setup: | 725 | skip_numa_setup: |
| @@ -731,7 +730,7 @@ skip_numa_setup: | |||
| 731 | * case of NUMA.) | 730 | * case of NUMA.) |
| 732 | */ | 731 | */ |
| 733 | do { | 732 | do { |
| 734 | if (++cpu >= NR_CPUS) | 733 | if (++cpu >= nr_cpu_ids) |
| 735 | cpu = 0; | 734 | cpu = 0; |
| 736 | } while (!cpu_online(cpu) || !cpu_isset(cpu, domain)); | 735 | } while (!cpu_online(cpu) || !cpu_isset(cpu, domain)); |
| 737 | 736 | ||
