|
6 | 6 | #include <linux/export.h>
|
7 | 7 | #include <linux/memblock.h>
|
8 | 8 | #include <linux/numa.h>
|
| 9 | +#include <linux/sched/isolation.h> |
9 | 10 |
|
10 | 11 | /**
|
11 | 12 | * cpumask_next - get the next cpu in a cpumask
|
@@ -205,22 +206,27 @@ void __init free_bootmem_cpumask_var(cpumask_var_t mask)
|
205 | 206 | */
|
206 | 207 | unsigned int cpumask_local_spread(unsigned int i, int node)
|
207 | 208 | {
|
208 |
| - int cpu; |
| 209 | + int cpu, hk_flags; |
| 210 | + const struct cpumask *mask; |
209 | 211 |
|
| 212 | + hk_flags = HK_FLAG_DOMAIN | HK_FLAG_MANAGED_IRQ; |
| 213 | + mask = housekeeping_cpumask(hk_flags); |
210 | 214 | /* Wrap: we always want a cpu. */
|
211 |
| - i %= num_online_cpus(); |
| 215 | + i %= cpumask_weight(mask); |
212 | 216 |
|
213 | 217 | if (node == NUMA_NO_NODE) {
|
214 |
| - for_each_cpu(cpu, cpu_online_mask) |
| 218 | + for_each_cpu(cpu, mask) { |
215 | 219 | if (i-- == 0)
|
216 | 220 | return cpu;
|
| 221 | + } |
217 | 222 | } else {
|
218 | 223 | /* NUMA first. */
|
219 |
| - for_each_cpu_and(cpu, cpumask_of_node(node), cpu_online_mask) |
| 224 | + for_each_cpu_and(cpu, cpumask_of_node(node), mask) { |
220 | 225 | if (i-- == 0)
|
221 | 226 | return cpu;
|
| 227 | + } |
222 | 228 |
|
223 |
| - for_each_cpu(cpu, cpu_online_mask) { |
| 229 | + for_each_cpu(cpu, mask) { |
224 | 230 | /* Skip NUMA nodes, done above. */
|
225 | 231 | if (cpumask_test_cpu(cpu, cpumask_of_node(node)))
|
226 | 232 | continue;
|
|
0 commit comments