-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[POWERPC] Cleanup SMT thread handling
This cleans up the SMT thread handling, removing some hard coded assumptions and providing a set of helpers to convert between linux cpu numbers, thread numbers and cores. This implementation requires the number of threads per core to be a power of 2 and identical on all cores in the system, but it's an implementation detail, not an API requirement and so this limitation can be lifted in the future if anybody ever needs it. Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> Signed-off-by: Paul Mackerras <paulus@samba.org>
- Loading branch information
Benjamin Herrenschmidt
authored and
Paul Mackerras
committed
Dec 3, 2007
1 parent
b80fa3c
commit 8d08908
Showing
4 changed files
with
140 additions
and
15 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,71 @@ | ||
#ifndef _ASM_POWERPC_CPUTHREADS_H | ||
#define _ASM_POWERPC_CPUTHREADS_H | ||
|
||
#include <linux/cpumask.h> | ||
|
||
/* | ||
* Mapping of threads to cores | ||
*/ | ||
|
||
#ifdef CONFIG_SMP | ||
extern int threads_per_core; | ||
extern int threads_shift; | ||
extern cpumask_t threads_core_mask; | ||
#else | ||
#define threads_per_core 1 | ||
#define threads_shift 0 | ||
#define threads_core_mask (CPU_MASK_CPU0) | ||
#endif | ||
|
||
/* cpu_thread_mask_to_cores - Return a cpumask of one per cores | ||
* hit by the argument | ||
* | ||
* @threads: a cpumask of threads | ||
* | ||
* This function returns a cpumask which will have one "cpu" (or thread) | ||
* 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 | ||
* since those need to be done only once per core/TLB | ||
*/ | ||
static inline cpumask_t cpu_thread_mask_to_cores(cpumask_t threads) | ||
{ | ||
cpumask_t tmp, res; | ||
int i; | ||
|
||
res = CPU_MASK_NONE; | ||
for (i = 0; i < NR_CPUS; i += threads_per_core) { | ||
cpus_shift_right(tmp, threads_core_mask, i); | ||
if (cpus_intersects(threads, tmp)) | ||
cpu_set(i, res); | ||
} | ||
return res; | ||
} | ||
|
||
static inline int cpu_nr_cores(void) | ||
{ | ||
return NR_CPUS >> threads_shift; | ||
} | ||
|
||
static inline cpumask_t cpu_online_cores_map(void) | ||
{ | ||
return cpu_thread_mask_to_cores(cpu_online_map); | ||
} | ||
|
||
static inline int cpu_thread_to_core(int cpu) | ||
{ | ||
return cpu >> threads_shift; | ||
} | ||
|
||
static inline int cpu_thread_in_core(int cpu) | ||
{ | ||
return cpu & (threads_per_core - 1); | ||
} | ||
|
||
static inline int cpu_first_thread_in_core(int cpu) | ||
{ | ||
return cpu & ~(threads_per_core - 1); | ||
} | ||
|
||
#endif /* _ASM_POWERPC_CPUTHREADS_H */ | ||
|