clear-pkgs-linux-iot-lts2018/0573-VHM-Notify-hypervisor-...

71 lines
2.3 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Zhao Yakui <yakui.zhao@intel.com>
Date: Tue, 16 Oct 2018 13:38:25 +0800
Subject: [PATCH] VHM: Notify hypervisor to switch the up-noitifier Interrupt
vector
Currently the acrn-hypervisor is using the PLATFORM_IPI vector to notify
the sos_kernel. And then sos_kernel will handle the notification from acrn
hypervisor in PLATFORM_IPI ISR. But as the PLATFORM_IPI ISR can be registered
by the other modules, it will have the conflict when trying to register
acrn intr ISR. So the HYPERVISOR_CALLBACK_VECTOR will be used instead.
This patch tries to notify the hypervisor so that the hypervisor notifies
the kernel by using HYPERVISOR_CALLBACK_VECTOR instead of PLATFORM_IPI.
Tracked-on: https://github.com/projectacrn/acrn-hypervisor/issues/1325
Signed-off-by: Zhao Yakui <yakui.zhao@intel.com>
---
drivers/char/vhm/vhm_dev.c | 20 ++++++++++++++------
1 file changed, 14 insertions(+), 6 deletions(-)
diff --git a/drivers/char/vhm/vhm_dev.c b/drivers/char/vhm/vhm_dev.c
index c6a97e8..f730467 100644
--- a/drivers/char/vhm/vhm_dev.c
+++ b/drivers/char/vhm/vhm_dev.c
@@ -86,6 +86,7 @@
#include <linux/vhm/vhm_eventfd.h>
#include <asm/hypervisor.h>
+#include <asm/acrnhyper.h>
#define DEVICE_NAME "acrn_vhm"
#define CLASS_NAME "vhm"
@@ -835,13 +836,19 @@ static int __init vhm_init(void)
}
pr_info("register IPI handler\n");
tasklet_init(&vhm_io_req_tasklet, io_req_tasklet, 0);
- if (x86_platform_ipi_callback) {
- pr_warn("vhm: ipi callback was occupied\n");
- return -EINVAL;
+
+ if (hcall_set_callback_vector(HYPERVISOR_CALLBACK_VECTOR)) {
+ if (x86_platform_ipi_callback) {
+ pr_warn("vhm: ipi callback was occupied\n");
+ return -EINVAL;
+ }
+ local_irq_save(flag);
+ x86_platform_ipi_callback = vhm_intr_handler;
+ local_irq_restore(flag);
+ }
+ else {
+ acrn_setup_intr_irq(vhm_intr_handler);
}
- local_irq_save(flag);
- 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");
@@ -854,6 +861,7 @@ static int __init vhm_init(void)
static void __exit vhm_exit(void)
{
tasklet_kill(&vhm_io_req_tasklet);
+ acrn_remove_intr_irq();
device_destroy(vhm_class, MKDEV(major, 0));
class_unregister(vhm_class);
class_destroy(vhm_class);
--
https://clearlinux.org