Merge tag 'smp-core-2020-06-01' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull SMP updates from Ingo Molnar: "Misc cleanups in the SMP hotplug and cross-call code" * tag 'smp-core-2020-06-01' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: cpu/hotplug: Remove __freeze_secondary_cpus() cpu/hotplug: Remove disable_nonboot_cpus() cpu/hotplug: Fix a typo in comment "broadacasted"->"broadcasted" smp: Use smp_call_func_t in on_each_cpu()
This commit is contained in:
@@ -48,7 +48,7 @@ More details follow::
|
|||||||
|
|
|
|
||||||
|
|
|
|
||||||
v
|
v
|
||||||
disable_nonboot_cpus()
|
freeze_secondary_cpus()
|
||||||
/* start */
|
/* start */
|
||||||
|
|
|
|
||||||
v
|
v
|
||||||
@@ -83,7 +83,7 @@ More details follow::
|
|||||||
Release cpu_add_remove_lock
|
Release cpu_add_remove_lock
|
||||||
|
|
|
|
||||||
v
|
v
|
||||||
/* disable_nonboot_cpus() complete */
|
/* freeze_secondary_cpus() complete */
|
||||||
|
|
|
|
||||||
v
|
v
|
||||||
Do suspend
|
Do suspend
|
||||||
@@ -93,7 +93,7 @@ More details follow::
|
|||||||
Resuming back is likewise, with the counterparts being (in the order of
|
Resuming back is likewise, with the counterparts being (in the order of
|
||||||
execution during resume):
|
execution during resume):
|
||||||
|
|
||||||
* enable_nonboot_cpus() which involves::
|
* thaw_secondary_cpus() which involves::
|
||||||
|
|
||||||
| Acquire cpu_add_remove_lock
|
| Acquire cpu_add_remove_lock
|
||||||
| Decrease cpu_hotplug_disabled, thereby enabling regular cpu hotplug
|
| Decrease cpu_hotplug_disabled, thereby enabling regular cpu hotplug
|
||||||
|
|||||||
@@ -1384,12 +1384,12 @@ void __init native_smp_prepare_cpus(unsigned int max_cpus)
|
|||||||
speculative_store_bypass_ht_init();
|
speculative_store_bypass_ht_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
void arch_enable_nonboot_cpus_begin(void)
|
void arch_thaw_secondary_cpus_begin(void)
|
||||||
{
|
{
|
||||||
set_mtrr_aps_delayed_init();
|
set_mtrr_aps_delayed_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
void arch_enable_nonboot_cpus_end(void)
|
void arch_thaw_secondary_cpus_end(void)
|
||||||
{
|
{
|
||||||
mtrr_aps_init();
|
mtrr_aps_init();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -307,7 +307,7 @@ int hibernate_resume_nonboot_cpu_disable(void)
|
|||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
smp_ops.play_dead = resume_play_dead;
|
smp_ops.play_dead = resume_play_dead;
|
||||||
ret = disable_nonboot_cpus();
|
ret = freeze_secondary_cpus(0);
|
||||||
smp_ops.play_dead = play_dead;
|
smp_ops.play_dead = play_dead;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -144,18 +144,8 @@ static inline void get_online_cpus(void) { cpus_read_lock(); }
|
|||||||
static inline void put_online_cpus(void) { cpus_read_unlock(); }
|
static inline void put_online_cpus(void) { cpus_read_unlock(); }
|
||||||
|
|
||||||
#ifdef CONFIG_PM_SLEEP_SMP
|
#ifdef CONFIG_PM_SLEEP_SMP
|
||||||
int __freeze_secondary_cpus(int primary, bool suspend);
|
extern int freeze_secondary_cpus(int primary);
|
||||||
static inline int freeze_secondary_cpus(int primary)
|
extern void thaw_secondary_cpus(void);
|
||||||
{
|
|
||||||
return __freeze_secondary_cpus(primary, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int disable_nonboot_cpus(void)
|
|
||||||
{
|
|
||||||
return __freeze_secondary_cpus(0, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
void enable_nonboot_cpus(void);
|
|
||||||
|
|
||||||
static inline int suspend_disable_secondary_cpus(void)
|
static inline int suspend_disable_secondary_cpus(void)
|
||||||
{
|
{
|
||||||
@@ -168,12 +158,11 @@ static inline int suspend_disable_secondary_cpus(void)
|
|||||||
}
|
}
|
||||||
static inline void suspend_enable_secondary_cpus(void)
|
static inline void suspend_enable_secondary_cpus(void)
|
||||||
{
|
{
|
||||||
return enable_nonboot_cpus();
|
return thaw_secondary_cpus();
|
||||||
}
|
}
|
||||||
|
|
||||||
#else /* !CONFIG_PM_SLEEP_SMP */
|
#else /* !CONFIG_PM_SLEEP_SMP */
|
||||||
static inline int disable_nonboot_cpus(void) { return 0; }
|
static inline void thaw_secondary_cpus(void) {}
|
||||||
static inline void enable_nonboot_cpus(void) {}
|
|
||||||
static inline int suspend_disable_secondary_cpus(void) { return 0; }
|
static inline int suspend_disable_secondary_cpus(void) { return 0; }
|
||||||
static inline void suspend_enable_secondary_cpus(void) { }
|
static inline void suspend_enable_secondary_cpus(void) { }
|
||||||
#endif /* !CONFIG_PM_SLEEP_SMP */
|
#endif /* !CONFIG_PM_SLEEP_SMP */
|
||||||
|
|||||||
@@ -227,8 +227,8 @@ static inline int get_boot_cpu_id(void)
|
|||||||
*/
|
*/
|
||||||
extern void arch_disable_smp_support(void);
|
extern void arch_disable_smp_support(void);
|
||||||
|
|
||||||
extern void arch_enable_nonboot_cpus_begin(void);
|
extern void arch_thaw_secondary_cpus_begin(void);
|
||||||
extern void arch_enable_nonboot_cpus_end(void);
|
extern void arch_thaw_secondary_cpus_end(void);
|
||||||
|
|
||||||
void smp_setup_processor_id(void);
|
void smp_setup_processor_id(void);
|
||||||
|
|
||||||
|
|||||||
20
kernel/cpu.c
20
kernel/cpu.c
@@ -432,7 +432,7 @@ static inline bool cpu_smt_allowed(unsigned int cpu)
|
|||||||
/*
|
/*
|
||||||
* On x86 it's required to boot all logical CPUs at least once so
|
* On x86 it's required to boot all logical CPUs at least once so
|
||||||
* that the init code can get a chance to set CR4.MCE on each
|
* that the init code can get a chance to set CR4.MCE on each
|
||||||
* CPU. Otherwise, a broadacasted MCE observing CR4.MCE=0b on any
|
* CPU. Otherwise, a broadcasted MCE observing CR4.MCE=0b on any
|
||||||
* core will shutdown the machine.
|
* core will shutdown the machine.
|
||||||
*/
|
*/
|
||||||
return !cpumask_test_cpu(cpu, &cpus_booted_once_mask);
|
return !cpumask_test_cpu(cpu, &cpus_booted_once_mask);
|
||||||
@@ -1327,7 +1327,7 @@ void bringup_nonboot_cpus(unsigned int setup_max_cpus)
|
|||||||
#ifdef CONFIG_PM_SLEEP_SMP
|
#ifdef CONFIG_PM_SLEEP_SMP
|
||||||
static cpumask_var_t frozen_cpus;
|
static cpumask_var_t frozen_cpus;
|
||||||
|
|
||||||
int __freeze_secondary_cpus(int primary, bool suspend)
|
int freeze_secondary_cpus(int primary)
|
||||||
{
|
{
|
||||||
int cpu, error = 0;
|
int cpu, error = 0;
|
||||||
|
|
||||||
@@ -1352,7 +1352,7 @@ int __freeze_secondary_cpus(int primary, bool suspend)
|
|||||||
if (cpu == primary)
|
if (cpu == primary)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (suspend && pm_wakeup_pending()) {
|
if (pm_wakeup_pending()) {
|
||||||
pr_info("Wakeup pending. Abort CPU freeze\n");
|
pr_info("Wakeup pending. Abort CPU freeze\n");
|
||||||
error = -EBUSY;
|
error = -EBUSY;
|
||||||
break;
|
break;
|
||||||
@@ -1376,8 +1376,8 @@ int __freeze_secondary_cpus(int primary, bool suspend)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Make sure the CPUs won't be enabled by someone else. We need to do
|
* Make sure the CPUs won't be enabled by someone else. We need to do
|
||||||
* this even in case of failure as all disable_nonboot_cpus() users are
|
* this even in case of failure as all freeze_secondary_cpus() users are
|
||||||
* supposed to do enable_nonboot_cpus() on the failure path.
|
* supposed to do thaw_secondary_cpus() on the failure path.
|
||||||
*/
|
*/
|
||||||
cpu_hotplug_disabled++;
|
cpu_hotplug_disabled++;
|
||||||
|
|
||||||
@@ -1385,15 +1385,15 @@ int __freeze_secondary_cpus(int primary, bool suspend)
|
|||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
void __weak arch_enable_nonboot_cpus_begin(void)
|
void __weak arch_thaw_secondary_cpus_begin(void)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void __weak arch_enable_nonboot_cpus_end(void)
|
void __weak arch_thaw_secondary_cpus_end(void)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void enable_nonboot_cpus(void)
|
void thaw_secondary_cpus(void)
|
||||||
{
|
{
|
||||||
int cpu, error;
|
int cpu, error;
|
||||||
|
|
||||||
@@ -1405,7 +1405,7 @@ void enable_nonboot_cpus(void)
|
|||||||
|
|
||||||
pr_info("Enabling non-boot CPUs ...\n");
|
pr_info("Enabling non-boot CPUs ...\n");
|
||||||
|
|
||||||
arch_enable_nonboot_cpus_begin();
|
arch_thaw_secondary_cpus_begin();
|
||||||
|
|
||||||
for_each_cpu(cpu, frozen_cpus) {
|
for_each_cpu(cpu, frozen_cpus) {
|
||||||
trace_suspend_resume(TPS("CPU_ON"), cpu, true);
|
trace_suspend_resume(TPS("CPU_ON"), cpu, true);
|
||||||
@@ -1418,7 +1418,7 @@ void enable_nonboot_cpus(void)
|
|||||||
pr_warn("Error taking CPU%d up: %d\n", cpu, error);
|
pr_warn("Error taking CPU%d up: %d\n", cpu, error);
|
||||||
}
|
}
|
||||||
|
|
||||||
arch_enable_nonboot_cpus_end();
|
arch_thaw_secondary_cpus_end();
|
||||||
|
|
||||||
cpumask_clear(frozen_cpus);
|
cpumask_clear(frozen_cpus);
|
||||||
out:
|
out:
|
||||||
|
|||||||
@@ -620,7 +620,7 @@ void __init smp_init(void)
|
|||||||
* early_boot_irqs_disabled is set. Use local_irq_save/restore() instead
|
* early_boot_irqs_disabled is set. Use local_irq_save/restore() instead
|
||||||
* of local_irq_disable/enable().
|
* of local_irq_disable/enable().
|
||||||
*/
|
*/
|
||||||
void on_each_cpu(void (*func) (void *info), void *info, int wait)
|
void on_each_cpu(smp_call_func_t func, void *info, int wait)
|
||||||
{
|
{
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
|
|||||||
@@ -125,7 +125,7 @@ acpi_suspend_begin:
|
|||||||
suspend_console:
|
suspend_console:
|
||||||
acpi_pm_prepare:
|
acpi_pm_prepare:
|
||||||
syscore_suspend:
|
syscore_suspend:
|
||||||
arch_enable_nonboot_cpus_end:
|
arch_thaw_secondary_cpus_end:
|
||||||
syscore_resume:
|
syscore_resume:
|
||||||
acpi_pm_finish:
|
acpi_pm_finish:
|
||||||
resume_console:
|
resume_console:
|
||||||
|
|||||||
@@ -198,7 +198,7 @@ class SystemValues:
|
|||||||
'suspend_console': {},
|
'suspend_console': {},
|
||||||
'acpi_pm_prepare': {},
|
'acpi_pm_prepare': {},
|
||||||
'syscore_suspend': {},
|
'syscore_suspend': {},
|
||||||
'arch_enable_nonboot_cpus_end': {},
|
'arch_thaw_secondary_cpus_end': {},
|
||||||
'syscore_resume': {},
|
'syscore_resume': {},
|
||||||
'acpi_pm_finish': {},
|
'acpi_pm_finish': {},
|
||||||
'resume_console': {},
|
'resume_console': {},
|
||||||
|
|||||||
Reference in New Issue
Block a user