|
@@ -695,32 +695,31 @@ get_target_cpu (unsigned int gsi, int irq)
|
|
#ifdef CONFIG_NUMA
|
|
#ifdef CONFIG_NUMA
|
|
{
|
|
{
|
|
int num_cpus, cpu_index, iosapic_index, numa_cpu, i = 0;
|
|
int num_cpus, cpu_index, iosapic_index, numa_cpu, i = 0;
|
|
- cpumask_t cpu_mask;
|
|
|
|
|
|
+ const struct cpumask *cpu_mask;
|
|
|
|
|
|
iosapic_index = find_iosapic(gsi);
|
|
iosapic_index = find_iosapic(gsi);
|
|
if (iosapic_index < 0 ||
|
|
if (iosapic_index < 0 ||
|
|
iosapic_lists[iosapic_index].node == MAX_NUMNODES)
|
|
iosapic_lists[iosapic_index].node == MAX_NUMNODES)
|
|
goto skip_numa_setup;
|
|
goto skip_numa_setup;
|
|
|
|
|
|
- cpu_mask = node_to_cpumask(iosapic_lists[iosapic_index].node);
|
|
|
|
- cpus_and(cpu_mask, cpu_mask, domain);
|
|
|
|
- for_each_cpu_mask(numa_cpu, cpu_mask) {
|
|
|
|
- if (!cpu_online(numa_cpu))
|
|
|
|
- cpu_clear(numa_cpu, cpu_mask);
|
|
|
|
|
|
+ cpu_mask = cpumask_of_node(iosapic_lists[iosapic_index].node);
|
|
|
|
+ num_cpus = 0;
|
|
|
|
+ for_each_cpu_and(numa_cpu, cpu_mask, &domain) {
|
|
|
|
+ if (cpu_online(numa_cpu))
|
|
|
|
+ num_cpus++;
|
|
}
|
|
}
|
|
|
|
|
|
- num_cpus = cpus_weight(cpu_mask);
|
|
|
|
-
|
|
|
|
if (!num_cpus)
|
|
if (!num_cpus)
|
|
goto skip_numa_setup;
|
|
goto skip_numa_setup;
|
|
|
|
|
|
/* Use irq assignment to distribute across cpus in node */
|
|
/* Use irq assignment to distribute across cpus in node */
|
|
cpu_index = irq % num_cpus;
|
|
cpu_index = irq % num_cpus;
|
|
|
|
|
|
- for (numa_cpu = first_cpu(cpu_mask) ; i < cpu_index ; i++)
|
|
|
|
- numa_cpu = next_cpu(numa_cpu, cpu_mask);
|
|
|
|
|
|
+ for_each_cpu_and(numa_cpu, cpu_mask, &domain)
|
|
|
|
+ if (cpu_online(numa_cpu) && i++ >= cpu_index)
|
|
|
|
+ break;
|
|
|
|
|
|
- if (numa_cpu != NR_CPUS)
|
|
|
|
|
|
+ if (numa_cpu < nr_cpu_ids)
|
|
return cpu_physical_id(numa_cpu);
|
|
return cpu_physical_id(numa_cpu);
|
|
}
|
|
}
|
|
skip_numa_setup:
|
|
skip_numa_setup:
|
|
@@ -731,7 +730,7 @@ skip_numa_setup:
|
|
* case of NUMA.)
|
|
* case of NUMA.)
|
|
*/
|
|
*/
|
|
do {
|
|
do {
|
|
- if (++cpu >= NR_CPUS)
|
|
|
|
|
|
+ if (++cpu >= nr_cpu_ids)
|
|
cpu = 0;
|
|
cpu = 0;
|
|
} while (!cpu_online(cpu) || !cpu_isset(cpu, domain));
|
|
} while (!cpu_online(cpu) || !cpu_isset(cpu, domain));
|
|
|
|
|