|
@@ -31,9 +31,9 @@ extern cpumask_t threads_core_mask;
|
|
/* cpu_thread_mask_to_cores - Return a cpumask of one per cores
|
|
/* cpu_thread_mask_to_cores - Return a cpumask of one per cores
|
|
* hit by the argument
|
|
* hit by the argument
|
|
*
|
|
*
|
|
- * @threads: a cpumask of threads
|
|
|
|
|
|
+ * @threads: a cpumask of online threads
|
|
*
|
|
*
|
|
- * This function returns a cpumask which will have one "cpu" (or thread)
|
|
|
|
|
|
+ * This function returns a cpumask which will have one online cpu's
|
|
* bit set for each core that has at least one thread set in the argument.
|
|
* bit set for each core that has at least one thread set in the argument.
|
|
*
|
|
*
|
|
* This can typically be used for things like IPI for tlb invalidations
|
|
* This can typically be used for things like IPI for tlb invalidations
|
|
@@ -42,13 +42,16 @@ extern cpumask_t threads_core_mask;
|
|
static inline cpumask_t cpu_thread_mask_to_cores(const struct cpumask *threads)
|
|
static inline cpumask_t cpu_thread_mask_to_cores(const struct cpumask *threads)
|
|
{
|
|
{
|
|
cpumask_t tmp, res;
|
|
cpumask_t tmp, res;
|
|
- int i;
|
|
|
|
|
|
+ int i, cpu;
|
|
|
|
|
|
cpumask_clear(&res);
|
|
cpumask_clear(&res);
|
|
for (i = 0; i < NR_CPUS; i += threads_per_core) {
|
|
for (i = 0; i < NR_CPUS; i += threads_per_core) {
|
|
cpumask_shift_left(&tmp, &threads_core_mask, i);
|
|
cpumask_shift_left(&tmp, &threads_core_mask, i);
|
|
- if (cpumask_intersects(threads, &tmp))
|
|
|
|
- cpumask_set_cpu(i, &res);
|
|
|
|
|
|
+ if (cpumask_intersects(threads, &tmp)) {
|
|
|
|
+ cpu = cpumask_next_and(-1, &tmp, cpu_online_mask);
|
|
|
|
+ if (cpu < nr_cpu_ids)
|
|
|
|
+ cpumask_set_cpu(cpu, &res);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
return res;
|
|
return res;
|
|
}
|
|
}
|