Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/riscv/kernel/cpu-hotplug.c
49452 views
1
// SPDX-License-Identifier: GPL-2.0
2
/*
3
* Copyright (C) 2020 Western Digital Corporation or its affiliates.
4
*/
5
6
#include <linux/kernel.h>
7
#include <linux/mm.h>
8
#include <linux/sched.h>
9
#include <linux/err.h>
10
#include <linux/irq.h>
11
#include <linux/cpuhotplug.h>
12
#include <linux/cpu.h>
13
#include <linux/sched/hotplug.h>
14
#include <asm/irq.h>
15
#include <asm/cpu_ops.h>
16
#include <asm/numa.h>
17
#include <asm/smp.h>
18
19
bool cpu_has_hotplug(unsigned int cpu)
20
{
21
if (cpu_ops->cpu_stop)
22
return true;
23
24
return false;
25
}
26
27
/*
28
* __cpu_disable runs on the processor to be shutdown.
29
*/
30
int __cpu_disable(void)
31
{
32
unsigned int cpu = smp_processor_id();
33
34
if (!cpu_ops->cpu_stop)
35
return -EOPNOTSUPP;
36
37
remove_cpu_topology(cpu);
38
numa_remove_cpu(cpu);
39
set_cpu_online(cpu, false);
40
riscv_ipi_disable();
41
irq_migrate_all_off_this_cpu();
42
43
return 0;
44
}
45
46
#ifdef CONFIG_HOTPLUG_CPU
47
/*
48
* Called on the thread which is asking for a CPU to be shutdown, if the
49
* CPU reported dead to the hotplug core.
50
*/
51
void arch_cpuhp_cleanup_dead_cpu(unsigned int cpu)
52
{
53
int ret = 0;
54
55
pr_notice("CPU%u: off\n", cpu);
56
57
clear_tasks_mm_cpumask(cpu);
58
/* Verify from the firmware if the cpu is really stopped*/
59
if (cpu_ops->cpu_is_stopped)
60
ret = cpu_ops->cpu_is_stopped(cpu);
61
if (ret)
62
pr_warn("CPU%u may not have stopped: %d\n", cpu, ret);
63
}
64
65
/*
66
* Called from the idle thread for the CPU which has been shutdown.
67
*/
68
void __noreturn arch_cpu_idle_dead(void)
69
{
70
idle_task_exit();
71
72
cpuhp_ap_report_dead();
73
74
cpu_ops->cpu_stop();
75
/* It should never reach here */
76
BUG();
77
}
78
#endif
79
80