clear-pkgs-linux-iot-lts2018/0555-VHM-add-ioctl-hypercal...

107 lines
3.9 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Minggui Cao <minggui.cao@intel.com>
Date: Wed, 8 Aug 2018 15:42:00 +0800
Subject: [PATCH] VHM: add ioctl/hypercall for UOS intr data monitor
DM can use this ioctl/hypercall to get the UOS pass-through devices'
interrupt count data, to monitor its status.
It is used to enhance the feature "interrupt storm mitigation"; DM can
monitor UOS pass-thru devices' interrupt data and give a response if one
"interrupt storm" happens.
V2:
Fix the building warning.
Tracked-on: https://github.com/projectacrn/acrn-hypervisor/issues/866
Signed-off-by: Minggui Cao <minggui.cao@intel.com>
Signed-off-by: Wei Liu <weix.w.liu@intel.com>
Reviewed-by: Zhao Yakui <yakui.zhao@intel.com>
---
drivers/char/vhm/vhm_dev.c | 17 +++++++++++++++++
drivers/vhm/vhm_hypercall.c | 5 +++++
include/linux/vhm/acrn_hv_defs.h | 1 +
include/linux/vhm/vhm_hypercall.h | 1 +
include/linux/vhm/vhm_ioctl_defs.h | 1 +
5 files changed, 25 insertions(+)
diff --git a/drivers/char/vhm/vhm_dev.c b/drivers/char/vhm/vhm_dev.c
index d57dc3972bc5..0d25f732da5b 100644
--- a/drivers/char/vhm/vhm_dev.c
+++ b/drivers/char/vhm/vhm_dev.c
@@ -630,6 +630,23 @@ static long vhm_dev_ioctl(struct file *filep,
break;
}
+ case IC_VM_INTR_MONITOR: {
+ struct page *page;
+
+ ret = get_user_pages_fast(ioctl_param, 1, 1, &page);
+ if (unlikely(ret != 1) || (page == NULL)) {
+ pr_err("vhm-dev: failed to pin intr hdr buffer!\n");
+ return -ENOMEM;
+ }
+
+ ret = hcall_vm_intr_monitor(vm->vmid, page_to_phys(page));
+ if (ret < 0) {
+ pr_err("vhm-dev: monitor intr data err=%ld\n", ret);
+ return -EFAULT;
+ }
+ break;
+ }
+
default:
pr_warn("Unknown IOCTL 0x%x\n", ioctl_num);
ret = 0;
diff --git a/drivers/vhm/vhm_hypercall.c b/drivers/vhm/vhm_hypercall.c
index d994835dd924..666f9aeb87ad 100644
--- a/drivers/vhm/vhm_hypercall.c
+++ b/drivers/vhm/vhm_hypercall.c
@@ -177,3 +177,8 @@ inline long hcall_vm_gpa2hpa(unsigned long vmid, unsigned long addr)
{
return acrn_hypercall2(HC_VM_GPA2HPA, vmid, addr);
}
+
+inline long hcall_vm_intr_monitor(unsigned long vmid, unsigned long addr)
+{
+ return acrn_hypercall2(HC_VM_INTR_MONITOR, vmid, addr);
+}
diff --git a/include/linux/vhm/acrn_hv_defs.h b/include/linux/vhm/acrn_hv_defs.h
index 24ca7be2c2b9..2cd6172e8e1d 100644
--- a/include/linux/vhm/acrn_hv_defs.h
+++ b/include/linux/vhm/acrn_hv_defs.h
@@ -85,6 +85,7 @@
#define HC_DEASSERT_IRQLINE _HC_ID(HC_ID, HC_ID_IRQ_BASE + 0x01)
#define HC_PULSE_IRQLINE _HC_ID(HC_ID, HC_ID_IRQ_BASE + 0x02)
#define HC_INJECT_MSI _HC_ID(HC_ID, HC_ID_IRQ_BASE + 0x03)
+#define HC_VM_INTR_MONITOR _HC_ID(HC_ID, HC_ID_IRQ_BASE + 0x04)
/* DM ioreq management */
#define HC_ID_IOREQ_BASE 0x30UL
diff --git a/include/linux/vhm/vhm_hypercall.h b/include/linux/vhm/vhm_hypercall.h
index 703b35bec053..062196ab1194 100644
--- a/include/linux/vhm/vhm_hypercall.h
+++ b/include/linux/vhm/vhm_hypercall.h
@@ -167,5 +167,6 @@ inline long hcall_reset_ptdev_intr_info(unsigned long vmid,
unsigned long pt_irq);
inline long hcall_remap_pci_msix(unsigned long vmid, unsigned long msi);
inline long hcall_vm_gpa2hpa(unsigned long vmid, unsigned long addr);
+inline long hcall_vm_intr_monitor(unsigned long vmid, unsigned long addr);
#endif /* VHM_HYPERCALL_H */
diff --git a/include/linux/vhm/vhm_ioctl_defs.h b/include/linux/vhm/vhm_ioctl_defs.h
index 6c09157a9bef..063ebd5c7a93 100644
--- a/include/linux/vhm/vhm_ioctl_defs.h
+++ b/include/linux/vhm/vhm_ioctl_defs.h
@@ -80,6 +80,7 @@
#define IC_DEASSERT_IRQLINE _IC_ID(IC_ID, IC_ID_IRQ_BASE + 0x01)
#define IC_PULSE_IRQLINE _IC_ID(IC_ID, IC_ID_IRQ_BASE + 0x02)
#define IC_INJECT_MSI _IC_ID(IC_ID, IC_ID_IRQ_BASE + 0x03)
+#define IC_VM_INTR_MONITOR _IC_ID(IC_ID, IC_ID_IRQ_BASE + 0x04)
/* DM ioreq management */
#define IC_ID_IOREQ_BASE 0x30UL
--
https://clearlinux.org