2019-03-29 14:12:17 +08:00
|
|
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
2018-10-11 02:06:46 +08:00
|
|
|
From: Jason Chen CJ <jason.cj.chen@intel.com>
|
|
|
|
Date: Fri, 31 Aug 2018 10:59:01 +0800
|
2019-03-29 14:12:17 +08:00
|
|
|
Subject: [PATCH] vhm: add sos offline cpu support
|
2018-10-11 02:06:46 +08:00
|
|
|
|
|
|
|
add sysfs with attr "offline_cpu", use
|
|
|
|
echo cpu_id > /sys/class/vhm/acrn_vhm/offline_cpu
|
|
|
|
to do the hypercall offline/destroy according vcpu.
|
|
|
|
before doing it, please make sure you already did cpu offline with
|
|
|
|
standard flow like below:
|
|
|
|
echo 0 > /sys/devices/system/cpu/cpuX/online
|
|
|
|
|
|
|
|
Signed-off-by: Jason Chen CJ <jason.cj.chen@intel.com>
|
|
|
|
Reviewed-by: Zhao Yakui <yakui.zhao@intel.com>
|
|
|
|
Acked-by: Eddie Dong <eddie.dong@intel.com>
|
|
|
|
---
|
|
|
|
drivers/char/vhm/vhm_dev.c | 41 +++++++++++++++++++++++++++++++
|
|
|
|
drivers/vhm/vhm_hypercall.c | 5 ++++
|
|
|
|
include/linux/vhm/acrn_hv_defs.h | 1 +
|
|
|
|
include/linux/vhm/vhm_hypercall.h | 1 +
|
|
|
|
4 files changed, 48 insertions(+)
|
|
|
|
|
|
|
|
diff --git a/drivers/char/vhm/vhm_dev.c b/drivers/char/vhm/vhm_dev.c
|
2020-10-27 02:14:06 +08:00
|
|
|
index 92075def6218..75cdbb730fa9 100644
|
2018-10-11 02:06:46 +08:00
|
|
|
--- a/drivers/char/vhm/vhm_dev.c
|
|
|
|
+++ b/drivers/char/vhm/vhm_dev.c
|
|
|
|
@@ -664,6 +664,41 @@ static const struct file_operations fops = {
|
|
|
|
.poll = vhm_dev_poll,
|
|
|
|
};
|
|
|
|
|
|
|
|
+static ssize_t
|
|
|
|
+store_offline_cpu(struct device *dev,
|
|
|
|
+ struct device_attribute *attr,
|
|
|
|
+ const char *buf, size_t count)
|
|
|
|
+{
|
|
|
|
+#ifdef CONFIG_X86
|
|
|
|
+ u64 cpu, lapicid;
|
|
|
|
+
|
|
|
|
+ if (kstrtoull(buf, 0, &cpu) < 0)
|
|
|
|
+ return -EINVAL;
|
|
|
|
+
|
|
|
|
+ if (cpu_possible(cpu)) {
|
|
|
|
+ lapicid = cpu_data(cpu).apicid;
|
|
|
|
+ pr_info("vhm: try to offline cpu %lld with lapicid %lld\n",
|
|
|
|
+ cpu, lapicid);
|
|
|
|
+ if (hcall_sos_offline_cpu(lapicid) < 0) {
|
|
|
|
+ pr_err("vhm: failed to offline cpu from Hypervisor!\n");
|
|
|
|
+ return -EINVAL;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+#endif
|
|
|
|
+ return count;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static DEVICE_ATTR(offline_cpu, S_IWUSR, NULL, store_offline_cpu);
|
|
|
|
+
|
|
|
|
+static struct attribute *vhm_attrs[] = {
|
|
|
|
+ &dev_attr_offline_cpu.attr,
|
|
|
|
+ NULL
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static struct attribute_group vhm_attr_group = {
|
|
|
|
+ .attrs = vhm_attrs,
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
#define SUPPORT_HV_API_VERSION_MAJOR 1
|
|
|
|
#define SUPPORT_HV_API_VERSION_MINOR 0
|
|
|
|
static int __init vhm_init(void)
|
|
|
|
@@ -727,6 +762,11 @@ static int __init vhm_init(void)
|
|
|
|
x86_platform_ipi_callback = vhm_intr_handler;
|
|
|
|
local_irq_restore(flag);
|
|
|
|
|
|
|
|
+ if (sysfs_create_group(&vhm_device->kobj, &vhm_attr_group)) {
|
|
|
|
+ pr_warn("vhm: sysfs create failed\n");
|
|
|
|
+ return -EINVAL;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
pr_info("vhm: Virtio & Hypervisor service module initialized\n");
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
@@ -737,6 +777,7 @@ static void __exit vhm_exit(void)
|
|
|
|
class_unregister(vhm_class);
|
|
|
|
class_destroy(vhm_class);
|
|
|
|
unregister_chrdev(major, DEVICE_NAME);
|
|
|
|
+ sysfs_remove_group(&vhm_device->kobj, &vhm_attr_group);
|
|
|
|
pr_info("vhm: exit\n");
|
|
|
|
}
|
|
|
|
|
|
|
|
diff --git a/drivers/vhm/vhm_hypercall.c b/drivers/vhm/vhm_hypercall.c
|
2020-10-27 02:14:06 +08:00
|
|
|
index 93dfb661d133..4c94d8f962ad 100644
|
2018-10-11 02:06:46 +08:00
|
|
|
--- a/drivers/vhm/vhm_hypercall.c
|
|
|
|
+++ b/drivers/vhm/vhm_hypercall.c
|
|
|
|
@@ -52,6 +52,11 @@
|
|
|
|
#include <linux/vhm/acrn_hv_defs.h>
|
|
|
|
#include <linux/vhm/vhm_hypercall.h>
|
|
|
|
|
|
|
|
+inline long hcall_sos_offline_cpu(unsigned long cpu)
|
|
|
|
+{
|
|
|
|
+ return acrn_hypercall1(HC_SOS_OFFLINE_CPU, cpu);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
inline long hcall_get_api_version(unsigned long api_version)
|
|
|
|
{
|
|
|
|
return acrn_hypercall1(HC_GET_API_VERSION, api_version);
|
|
|
|
diff --git a/include/linux/vhm/acrn_hv_defs.h b/include/linux/vhm/acrn_hv_defs.h
|
2020-10-27 02:14:06 +08:00
|
|
|
index 7cfcf7a30813..b9465a87fe46 100644
|
2018-10-11 02:06:46 +08:00
|
|
|
--- a/include/linux/vhm/acrn_hv_defs.h
|
|
|
|
+++ b/include/linux/vhm/acrn_hv_defs.h
|
|
|
|
@@ -68,6 +68,7 @@
|
|
|
|
/* general */
|
|
|
|
#define HC_ID_GEN_BASE 0x0UL
|
|
|
|
#define HC_GET_API_VERSION _HC_ID(HC_ID, HC_ID_GEN_BASE + 0x00)
|
|
|
|
+#define HC_SOS_OFFLINE_CPU _HC_ID(HC_ID, HC_ID_GEN_BASE + 0x01)
|
|
|
|
|
|
|
|
/* VM management */
|
|
|
|
#define HC_ID_VM_BASE 0x10UL
|
|
|
|
diff --git a/include/linux/vhm/vhm_hypercall.h b/include/linux/vhm/vhm_hypercall.h
|
2020-10-27 02:14:06 +08:00
|
|
|
index 49e94ecc37b9..7d4b15af39a0 100644
|
2018-10-11 02:06:46 +08:00
|
|
|
--- a/include/linux/vhm/vhm_hypercall.h
|
|
|
|
+++ b/include/linux/vhm/vhm_hypercall.h
|
|
|
|
@@ -137,6 +137,7 @@ static inline long acrn_hypercall4(unsigned long hcall_id, unsigned long param1,
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
+inline long hcall_sos_offline_cpu(unsigned long cpu);
|
|
|
|
inline long hcall_get_api_version(unsigned long api_version);
|
|
|
|
inline long hcall_create_vm(unsigned long vminfo);
|
|
|
|
inline long hcall_start_vm(unsigned long vmid);
|
|
|
|
--
|
2019-04-08 18:08:36 +08:00
|
|
|
https://clearlinux.org
|
2018-10-11 02:06:46 +08:00
|
|
|
|