mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-15 15:15:47 +00:00
powerpc: remove cpu_online_cores_map function
This function builds the cores online map with on-stack cpumasks which can cause high stack usage with large NR_CPUS. It is not used in any performance sensitive paths, so instead just check for first thread sibling. Signed-off-by: Nicholas Piggin <npiggin@gmail.com> Tested-by: Sachin Sant <sachinp@linux.vnet.ibm.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/20211105035042.1398309-1-npiggin@gmail.com
This commit is contained in:
parent
af3fdce4ab
commit
b350111bf7
3 changed files with 8 additions and 41 deletions
|
@ -32,44 +32,11 @@ extern cpumask_t threads_core_mask;
|
||||||
#define threads_core_mask (*get_cpu_mask(0))
|
#define threads_core_mask (*get_cpu_mask(0))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* cpu_thread_mask_to_cores - Return a cpumask of one per cores
|
|
||||||
* hit by the argument
|
|
||||||
*
|
|
||||||
* @threads: a cpumask of online threads
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* 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(const struct cpumask *threads)
|
|
||||||
{
|
|
||||||
cpumask_t tmp, res;
|
|
||||||
int i, cpu;
|
|
||||||
|
|
||||||
cpumask_clear(&res);
|
|
||||||
for (i = 0; i < NR_CPUS; i += threads_per_core) {
|
|
||||||
cpumask_shift_left(&tmp, &threads_core_mask, i);
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int cpu_nr_cores(void)
|
static inline int cpu_nr_cores(void)
|
||||||
{
|
{
|
||||||
return nr_cpu_ids >> threads_shift;
|
return nr_cpu_ids >> threads_shift;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline cpumask_t cpu_online_cores_map(void)
|
|
||||||
{
|
|
||||||
return cpu_thread_mask_to_cores(cpu_online_mask);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
int cpu_core_index_of_thread(int cpu);
|
int cpu_core_index_of_thread(int cpu);
|
||||||
int cpu_first_thread_of_core(int core);
|
int cpu_first_thread_of_core(int core);
|
||||||
|
|
|
@ -146,9 +146,13 @@ EXPORT_SYMBOL_GPL(pnv_get_supported_cpuidle_states);
|
||||||
static void pnv_fastsleep_workaround_apply(void *info)
|
static void pnv_fastsleep_workaround_apply(void *info)
|
||||||
|
|
||||||
{
|
{
|
||||||
|
int cpu = smp_processor_id();
|
||||||
int rc;
|
int rc;
|
||||||
int *err = info;
|
int *err = info;
|
||||||
|
|
||||||
|
if (cpu_first_thread_sibling(cpu) != cpu)
|
||||||
|
return;
|
||||||
|
|
||||||
rc = opal_config_cpu_idle_state(OPAL_CONFIG_IDLE_FASTSLEEP,
|
rc = opal_config_cpu_idle_state(OPAL_CONFIG_IDLE_FASTSLEEP,
|
||||||
OPAL_CONFIG_IDLE_APPLY);
|
OPAL_CONFIG_IDLE_APPLY);
|
||||||
if (rc)
|
if (rc)
|
||||||
|
@ -175,7 +179,6 @@ static ssize_t store_fastsleep_workaround_applyonce(struct device *dev,
|
||||||
struct device_attribute *attr, const char *buf,
|
struct device_attribute *attr, const char *buf,
|
||||||
size_t count)
|
size_t count)
|
||||||
{
|
{
|
||||||
cpumask_t primary_thread_mask;
|
|
||||||
int err;
|
int err;
|
||||||
u8 val;
|
u8 val;
|
||||||
|
|
||||||
|
@ -200,10 +203,7 @@ static ssize_t store_fastsleep_workaround_applyonce(struct device *dev,
|
||||||
power7_fastsleep_workaround_exit = false;
|
power7_fastsleep_workaround_exit = false;
|
||||||
|
|
||||||
cpus_read_lock();
|
cpus_read_lock();
|
||||||
primary_thread_mask = cpu_online_cores_map();
|
on_each_cpu(pnv_fastsleep_workaround_apply, &err, 1);
|
||||||
on_each_cpu_mask(&primary_thread_mask,
|
|
||||||
pnv_fastsleep_workaround_apply,
|
|
||||||
&err, 1);
|
|
||||||
cpus_read_unlock();
|
cpus_read_unlock();
|
||||||
if (err) {
|
if (err) {
|
||||||
pr_err("fastsleep_workaround_applyonce change failed while running pnv_fastsleep_workaround_apply");
|
pr_err("fastsleep_workaround_applyonce change failed while running pnv_fastsleep_workaround_apply");
|
||||||
|
|
|
@ -200,13 +200,13 @@ static void disable_nest_pmu_counters(void)
|
||||||
|
|
||||||
static void disable_core_pmu_counters(void)
|
static void disable_core_pmu_counters(void)
|
||||||
{
|
{
|
||||||
cpumask_t cores_map;
|
|
||||||
int cpu, rc;
|
int cpu, rc;
|
||||||
|
|
||||||
cpus_read_lock();
|
cpus_read_lock();
|
||||||
/* Disable the IMC Core functions */
|
/* Disable the IMC Core functions */
|
||||||
cores_map = cpu_online_cores_map();
|
for_each_online_cpu(cpu) {
|
||||||
for_each_cpu(cpu, &cores_map) {
|
if (cpu_first_thread_sibling(cpu) != cpu)
|
||||||
|
continue;
|
||||||
rc = opal_imc_counters_stop(OPAL_IMC_COUNTERS_CORE,
|
rc = opal_imc_counters_stop(OPAL_IMC_COUNTERS_CORE,
|
||||||
get_hard_smp_processor_id(cpu));
|
get_hard_smp_processor_id(cpu));
|
||||||
if (rc)
|
if (rc)
|
||||||
|
|
Loading…
Reference in a new issue