Skip to content

Commit

Permalink
Merge tag 'smp-core-2020-03-30' of git://git.kernel.org/pub/scm/linux…
Browse files Browse the repository at this point in the history
…/kernel/git/tip/tip

Pull core SMP updates from Thomas Gleixner:
 "CPU (hotplug) updates:

   - Support for locked CSD objects in smp_call_function_single_async()
     which allows to simplify callsites in the scheduler core and MIPS

   - Treewide consolidation of CPU hotplug functions which ensures the
     consistency between the sysfs interface and kernel state. The low
     level functions cpu_up/down() are now confined to the core code and
     not longer accessible from random code"

* tag 'smp-core-2020-03-30' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (22 commits)
  cpu/hotplug: Ignore pm_wakeup_pending() for disable_nonboot_cpus()
  cpu/hotplug: Hide cpu_up/down()
  cpu/hotplug: Move bringup of secondary CPUs out of smp_init()
  torture: Replace cpu_up/down() with add/remove_cpu()
  firmware: psci: Replace cpu_up/down() with add/remove_cpu()
  xen/cpuhotplug: Replace cpu_up/down() with device_online/offline()
  parisc: Replace cpu_up/down() with add/remove_cpu()
  sparc: Replace cpu_up/down() with add/remove_cpu()
  powerpc: Replace cpu_up/down() with add/remove_cpu()
  x86/smp: Replace cpu_up/down() with add/remove_cpu()
  arm64: hibernate: Use bringup_hibernate_cpu()
  cpu/hotplug: Provide bringup_hibernate_cpu()
  arm64: Use reboot_cpu instead of hardconding it to 0
  arm64: Don't use disable_nonboot_cpus()
  ARM: Use reboot_cpu instead of hardcoding it to 0
  ARM: Don't use disable_nonboot_cpus()
  ia64: Replace cpu_down() with smp_shutdown_nonboot_cpus()
  cpu/hotplug: Create a new function to shutdown nonboot cpus
  cpu/hotplug: Add new {add,remove}_cpu() functions
  sched/core: Remove rq.hrtick_csd_pending
  ...
  • Loading branch information
Linus Torvalds committed Mar 31, 2020
2 parents 2d38533 + e98eac6 commit 992a1a3
Show file tree
Hide file tree
Showing 20 changed files with 194 additions and 97 deletions.
4 changes: 2 additions & 2 deletions arch/arm/kernel/reboot.c
Original file line number Diff line number Diff line change
Expand Up @@ -88,11 +88,11 @@ void soft_restart(unsigned long addr)
* to execute e.g. a RAM-based pin loop is not sufficient. This allows the
* kexec'd kernel to use any and all RAM as it sees fit, without having to
* avoid any code or data used by any SW CPU pin loop. The CPU hotplug
* functionality embodied in disable_nonboot_cpus() to achieve this.
* functionality embodied in smp_shutdown_nonboot_cpus() to achieve this.
*/
void machine_shutdown(void)
{
disable_nonboot_cpus();
smp_shutdown_nonboot_cpus(reboot_cpu);
}

/*
Expand Down
13 changes: 5 additions & 8 deletions arch/arm64/kernel/hibernate.c
Original file line number Diff line number Diff line change
Expand Up @@ -166,14 +166,11 @@ int arch_hibernation_header_restore(void *addr)
sleep_cpu = -EINVAL;
return -EINVAL;
}
if (!cpu_online(sleep_cpu)) {
pr_info("Hibernated on a CPU that is offline! Bringing CPU up.\n");
ret = cpu_up(sleep_cpu);
if (ret) {
pr_err("Failed to bring hibernate-CPU up!\n");
sleep_cpu = -EINVAL;
return ret;
}

ret = bringup_hibernate_cpu(sleep_cpu);
if (ret) {
sleep_cpu = -EINVAL;
return ret;
}

resume_hdr = *hdr;
Expand Down
4 changes: 2 additions & 2 deletions arch/arm64/kernel/process.c
Original file line number Diff line number Diff line change
Expand Up @@ -141,11 +141,11 @@ void arch_cpu_idle_dead(void)
* to execute e.g. a RAM-based pin loop is not sufficient. This allows the
* kexec'd kernel to use any and all RAM as it sees fit, without having to
* avoid any code or data used by any SW CPU pin loop. The CPU hotplug
* functionality embodied in disable_nonboot_cpus() to achieve this.
* functionality embodied in smpt_shutdown_nonboot_cpus() to achieve this.
*/
void machine_shutdown(void)
{
disable_nonboot_cpus();
smp_shutdown_nonboot_cpus(reboot_cpu);
}

/*
Expand Down
8 changes: 1 addition & 7 deletions arch/ia64/kernel/process.c
Original file line number Diff line number Diff line change
Expand Up @@ -646,14 +646,8 @@ cpu_halt (void)

void machine_shutdown(void)
{
#ifdef CONFIG_HOTPLUG_CPU
int cpu;
smp_shutdown_nonboot_cpus(reboot_cpu);

for_each_online_cpu(cpu) {
if (cpu != smp_processor_id())
cpu_down(cpu);
}
#endif
#ifdef CONFIG_KEXEC
kexec_disable_iosapic();
#endif
Expand Down
9 changes: 1 addition & 8 deletions arch/mips/kernel/smp.c
Original file line number Diff line number Diff line change
Expand Up @@ -696,29 +696,22 @@ EXPORT_SYMBOL(flush_tlb_one);

#ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST

static DEFINE_PER_CPU(atomic_t, tick_broadcast_count);
static DEFINE_PER_CPU(call_single_data_t, tick_broadcast_csd);

void tick_broadcast(const struct cpumask *mask)
{
atomic_t *count;
call_single_data_t *csd;
int cpu;

for_each_cpu(cpu, mask) {
count = &per_cpu(tick_broadcast_count, cpu);
csd = &per_cpu(tick_broadcast_csd, cpu);

if (atomic_inc_return(count) == 1)
smp_call_function_single_async(cpu, csd);
smp_call_function_single_async(cpu, csd);
}
}

static void tick_broadcast_callee(void *info)
{
int cpu = smp_processor_id();
tick_receive_broadcast();
atomic_set(&per_cpu(tick_broadcast_count, cpu), 0);
}

static int __init tick_broadcast_init(void)
Expand Down
2 changes: 1 addition & 1 deletion arch/parisc/kernel/processor.c
Original file line number Diff line number Diff line change
Expand Up @@ -212,7 +212,7 @@ static int __init processor_probe(struct parisc_device *dev)
#ifdef CONFIG_SMP
if (cpuid) {
set_cpu_present(cpuid, true);
cpu_up(cpuid);
add_cpu(cpuid);
}
#endif

Expand Down
2 changes: 1 addition & 1 deletion arch/powerpc/kexec/core_64.c
Original file line number Diff line number Diff line change
Expand Up @@ -212,7 +212,7 @@ static void wake_offline_cpus(void)
if (!cpu_online(cpu)) {
printk(KERN_INFO "kexec: Waking offline cpu %d.\n",
cpu);
WARN_ON(cpu_up(cpu));
WARN_ON(add_cpu(cpu));
}
}
}
Expand Down
4 changes: 2 additions & 2 deletions arch/sparc/kernel/ds.c
Original file line number Diff line number Diff line change
Expand Up @@ -555,7 +555,7 @@ static int dr_cpu_configure(struct ds_info *dp, struct ds_cap_state *cp,

printk(KERN_INFO "ds-%llu: Starting cpu %d...\n",
dp->id, cpu);
err = cpu_up(cpu);
err = add_cpu(cpu);
if (err) {
__u32 res = DR_CPU_RES_FAILURE;
__u32 stat = DR_CPU_STAT_UNCONFIGURED;
Expand Down Expand Up @@ -611,7 +611,7 @@ static int dr_cpu_unconfigure(struct ds_info *dp,

printk(KERN_INFO "ds-%llu: Shutting down cpu %d...\n",
dp->id, cpu);
err = cpu_down(cpu);
err = remove_cpu(cpu);
if (err)
dr_cpu_mark(resp, cpu, ncpus,
DR_CPU_RES_FAILURE,
Expand Down
22 changes: 6 additions & 16 deletions arch/x86/kernel/topology.c
Original file line number Diff line number Diff line change
Expand Up @@ -59,39 +59,29 @@ __setup("cpu0_hotplug", enable_cpu0_hotplug);
*/
int _debug_hotplug_cpu(int cpu, int action)
{
struct device *dev = get_cpu_device(cpu);
int ret;

if (!cpu_is_hotpluggable(cpu))
return -EINVAL;

lock_device_hotplug();

switch (action) {
case 0:
ret = cpu_down(cpu);
if (!ret) {
ret = remove_cpu(cpu);
if (!ret)
pr_info("DEBUG_HOTPLUG_CPU0: CPU %u is now offline\n", cpu);
dev->offline = true;
kobject_uevent(&dev->kobj, KOBJ_OFFLINE);
} else
else
pr_debug("Can't offline CPU%d.\n", cpu);
break;
case 1:
ret = cpu_up(cpu);
if (!ret) {
dev->offline = false;
kobject_uevent(&dev->kobj, KOBJ_ONLINE);
} else {
ret = add_cpu(cpu);
if (ret)
pr_debug("Can't online CPU%d.\n", cpu);
}

break;
default:
ret = -EINVAL;
}

unlock_device_hotplug();

return ret;
}

Expand Down
4 changes: 2 additions & 2 deletions arch/x86/mm/mmio-mod.c
Original file line number Diff line number Diff line change
Expand Up @@ -386,7 +386,7 @@ static void enter_uniprocessor(void)
put_online_cpus();

for_each_cpu(cpu, downed_cpus) {
err = cpu_down(cpu);
err = remove_cpu(cpu);
if (!err)
pr_info("CPU%d is down.\n", cpu);
else
Expand All @@ -406,7 +406,7 @@ static void leave_uniprocessor(void)
return;
pr_notice("Re-enabling CPUs...\n");
for_each_cpu(cpu, downed_cpus) {
err = cpu_up(cpu);
err = add_cpu(cpu);
if (!err)
pr_info("enabled CPU%d.\n", cpu);
else
Expand Down
2 changes: 1 addition & 1 deletion arch/x86/xen/smp.c
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ void __init xen_smp_cpus_done(unsigned int max_cpus)
if (xen_vcpu_nr(cpu) < MAX_VIRT_CPUS)
continue;

rc = cpu_down(cpu);
rc = remove_cpu(cpu);

if (rc == 0) {
/*
Expand Down
4 changes: 2 additions & 2 deletions drivers/base/cpu.c
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ static int cpu_subsys_online(struct device *dev)
if (from_nid == NUMA_NO_NODE)
return -ENODEV;

ret = cpu_up(cpuid);
ret = cpu_device_up(dev);
/*
* When hot adding memory to memoryless node and enabling a cpu
* on the node, node number of the cpu may internally change.
Expand All @@ -69,7 +69,7 @@ static int cpu_subsys_online(struct device *dev)

static int cpu_subsys_offline(struct device *dev)
{
return cpu_down(dev->id);
return cpu_device_down(dev);
}

void unregister_cpu(struct cpu *cpu)
Expand Down
4 changes: 2 additions & 2 deletions drivers/firmware/psci/psci_checker.c
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ static unsigned int down_and_up_cpus(const struct cpumask *cpus,

/* Try to power down all CPUs in the mask. */
for_each_cpu(cpu, cpus) {
int ret = cpu_down(cpu);
int ret = remove_cpu(cpu);

/*
* cpu_down() checks the number of online CPUs before the TOS
Expand Down Expand Up @@ -116,7 +116,7 @@ static unsigned int down_and_up_cpus(const struct cpumask *cpus,

/* Try to power up all the CPUs that have been offlined. */
for_each_cpu(cpu, offlined_cpus) {
int ret = cpu_up(cpu);
int ret = add_cpu(cpu);

if (ret != 0) {
pr_err("Error occurred (%d) while trying "
Expand Down
2 changes: 1 addition & 1 deletion drivers/xen/cpu_hotplug.c
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ static int setup_cpu_watcher(struct notifier_block *notifier,

for_each_possible_cpu(cpu) {
if (vcpu_online(cpu) == 0) {
(void)cpu_down(cpu);
device_offline(get_cpu_device(cpu));
set_cpu_present(cpu, false);
}
}
Expand Down
22 changes: 17 additions & 5 deletions include/linux/cpu.h
Original file line number Diff line number Diff line change
Expand Up @@ -88,10 +88,13 @@ extern ssize_t arch_cpu_release(const char *, size_t);

#ifdef CONFIG_SMP
extern bool cpuhp_tasks_frozen;
int cpu_up(unsigned int cpu);
int add_cpu(unsigned int cpu);
int cpu_device_up(struct device *dev);
void notify_cpu_starting(unsigned int cpu);
extern void cpu_maps_update_begin(void);
extern void cpu_maps_update_done(void);
int bringup_hibernate_cpu(unsigned int sleep_cpu);
void bringup_nonboot_cpus(unsigned int setup_max_cpus);

#else /* CONFIG_SMP */
#define cpuhp_tasks_frozen 0
Expand All @@ -117,7 +120,9 @@ extern void lockdep_assert_cpus_held(void);
extern void cpu_hotplug_disable(void);
extern void cpu_hotplug_enable(void);
void clear_tasks_mm_cpumask(int cpu);
int cpu_down(unsigned int cpu);
int remove_cpu(unsigned int cpu);
int cpu_device_down(struct device *dev);
extern void smp_shutdown_nonboot_cpus(unsigned int primary_cpu);

#else /* CONFIG_HOTPLUG_CPU */

Expand All @@ -129,6 +134,7 @@ static inline int cpus_read_trylock(void) { return true; }
static inline void lockdep_assert_cpus_held(void) { }
static inline void cpu_hotplug_disable(void) { }
static inline void cpu_hotplug_enable(void) { }
static inline void smp_shutdown_nonboot_cpus(unsigned int primary_cpu) { }
#endif /* !CONFIG_HOTPLUG_CPU */

/* Wrappers which go away once all code is converted */
Expand All @@ -138,12 +144,18 @@ static inline void get_online_cpus(void) { cpus_read_lock(); }
static inline void put_online_cpus(void) { cpus_read_unlock(); }

#ifdef CONFIG_PM_SLEEP_SMP
extern int freeze_secondary_cpus(int primary);
int __freeze_secondary_cpus(int primary, bool suspend);
static inline int freeze_secondary_cpus(int primary)
{
return __freeze_secondary_cpus(primary, true);
}

static inline int disable_nonboot_cpus(void)
{
return freeze_secondary_cpus(0);
return __freeze_secondary_cpus(0, false);
}
extern void enable_nonboot_cpus(void);

void enable_nonboot_cpus(void);

static inline int suspend_disable_secondary_cpus(void)
{
Expand Down
Loading

0 comments on commit 992a1a3

Please sign in to comment.