mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-04 09:34:12 +08:00
parisc: Find a new timesync master if current CPU is removed
When CPU hotplugging is enabled, the user may want to remove the current CPU which is providing the timer ticks. If this happens we need to find a new timesync master. Signed-off-by: Helge Deller <deller@gmx.de>
This commit is contained in:
parent
ca45ec3cb4
commit
1afde47d08
@ -95,6 +95,7 @@ struct cpuinfo_parisc {
|
||||
|
||||
extern struct system_cpuinfo_parisc boot_cpu_data;
|
||||
DECLARE_PER_CPU(struct cpuinfo_parisc, cpu_data);
|
||||
extern int time_keeper_id; /* CPU used for timekeeping */
|
||||
|
||||
#define CPU_HVERSION ((boot_cpu_data.hversion >> 4) & 0x0FFF)
|
||||
|
||||
|
@ -465,6 +465,12 @@ int __cpu_disable(void)
|
||||
*/
|
||||
set_cpu_online(cpu, false);
|
||||
|
||||
/* Find a new timesync master */
|
||||
if (cpu == time_keeper_id) {
|
||||
time_keeper_id = cpumask_first(cpu_online_mask);
|
||||
pr_info("CPU %d is now promoted to time-keeper master\n", time_keeper_id);
|
||||
}
|
||||
|
||||
disable_percpu_irq(IPI_IRQ);
|
||||
|
||||
irq_migrate_all_off_this_cpu();
|
||||
|
@ -40,6 +40,8 @@
|
||||
|
||||
#include <linux/timex.h>
|
||||
|
||||
int time_keeper_id __read_mostly; /* CPU used for timekeeping. */
|
||||
|
||||
static unsigned long clocktick __ro_after_init; /* timer cycles per tick */
|
||||
|
||||
/*
|
||||
@ -84,7 +86,7 @@ irqreturn_t __irq_entry timer_interrupt(int irq, void *dev_id)
|
||||
cpuinfo->it_value = next_tick;
|
||||
|
||||
/* Go do system house keeping. */
|
||||
if (cpu != 0)
|
||||
if (IS_ENABLED(CONFIG_SMP) && (cpu != time_keeper_id))
|
||||
ticks_elapsed = 0;
|
||||
legacy_timer_tick(ticks_elapsed);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user