clear-pkgs-linux-iot-lts2018/0523-vhm-add-sos-offline-cp...

132 lines
4.1 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Jason Chen CJ <jason.cj.chen@intel.com>
Date: Fri, 31 Aug 2018 10:59:01 +0800
Subject: [PATCH] vhm: add sos offline cpu support
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
index 92075def6218..75cdbb730fa9 100644
--- 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
index 93dfb661d133..4c94d8f962ad 100644
--- 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
index 7cfcf7a30813..b9465a87fe46 100644
--- 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
index 49e94ecc37b9..7d4b15af39a0 100644
--- 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);
--
https://clearlinux.org