[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [RFC PATCH 12/34] hyperv: add synic event flag signaling
From: |
Roman Kagan |
Subject: |
[Qemu-devel] [RFC PATCH 12/34] hyperv: add synic event flag signaling |
Date: |
Tue, 6 Feb 2018 23:30:26 +0300 |
Add infrastructure to signal SynIC event flags by atomically setting the
corresponding bit in the event flags page and firing a SINT if
necessary.
Signed-off-by: Roman Kagan <address@hidden>
---
target/i386/hyperv.h | 2 ++
target/i386/hyperv.c | 32 ++++++++++++++++++++++++++++++++
2 files changed, 34 insertions(+)
diff --git a/target/i386/hyperv.h b/target/i386/hyperv.h
index df17d9c3b7..3d942e5524 100644
--- a/target/i386/hyperv.h
+++ b/target/i386/hyperv.h
@@ -41,4 +41,6 @@ bool hyperv_synic_usable(void);
int hyperv_post_msg(HvSintRoute *sint_route, struct hyperv_message *msg);
+int hyperv_set_evt_flag(HvSintRoute *sint_route, unsigned evtno);
+
#endif
diff --git a/target/i386/hyperv.c b/target/i386/hyperv.c
index 918ba26849..b557cd5d5d 100644
--- a/target/i386/hyperv.c
+++ b/target/i386/hyperv.c
@@ -18,6 +18,7 @@
#include "hw/qdev-properties.h"
#include "exec/address-spaces.h"
#include "sysemu/cpus.h"
+#include "qemu/bitops.h"
#include "migration/vmstate.h"
#include "hyperv.h"
#include "hyperv-proto.h"
@@ -209,6 +210,37 @@ int hyperv_post_msg(HvSintRoute *sint_route, struct
hyperv_message *src_msg)
return 0;
}
+/*
+ * Set given event flag for a given sint on a given vcpu, and signal the sint.
+ */
+int hyperv_set_evt_flag(HvSintRoute *sint_route, unsigned evtno)
+{
+ int ret;
+ SynICState *synic = sint_route->synic;
+ unsigned long *flags, set_mask;
+ unsigned set_idx;
+
+ if (evtno > HV_EVENT_FLAGS_COUNT) {
+ return -EINVAL;
+ }
+ if (!synic->enabled || !synic->evt_page_addr) {
+ return -ENXIO;
+ }
+
+ set_idx = BIT_WORD(evtno);
+ set_mask = BIT_MASK(evtno);
+ flags = synic->evt_page->slot[sint_route->sint].flags;
+
+ if ((atomic_fetch_or(&flags[set_idx], set_mask) & set_mask) != set_mask) {
+ memory_region_set_dirty(&synic->evt_page_mr, 0,
+ sizeof(*synic->evt_page));
+ ret = kvm_hv_sint_route_set_sint(sint_route);
+ } else {
+ ret = 0;
+ }
+ return ret;
+}
+
static void async_synic_update(CPUState *cs, run_on_cpu_data data)
{
SynICState *synic = data.host_ptr;
--
2.14.3
- Re: [Qemu-devel] [RFC PATCH 08/34] hyperv: qom-ify SynIC, (continued)
[Qemu-devel] [RFC PATCH 10/34] hyperv: make overlay pages for SynIC, Roman Kagan, 2018/02/06
[Qemu-devel] [RFC PATCH 09/34] hyperv: block SynIC use in QEMU in incompatible configurations, Roman Kagan, 2018/02/06
[Qemu-devel] [RFC PATCH 11/34] hyperv: add synic message delivery, Roman Kagan, 2018/02/06
[Qemu-devel] [RFC PATCH 12/34] hyperv: add synic event flag signaling,
Roman Kagan <=
[Qemu-devel] [RFC PATCH 13/34] hyperv: process SIGNAL_EVENT hypercall, Roman Kagan, 2018/02/06
[Qemu-devel] [RFC PATCH 14/34] hyperv: process POST_MESSAGE hypercall, Roman Kagan, 2018/02/06
[Qemu-devel] [RFC PATCH 16/34] hyperv: update copyright notices, Roman Kagan, 2018/02/06
[Qemu-devel] [RFC PATCH 15/34] hyperv_testdev: add SynIC message and event testmodes, Roman Kagan, 2018/02/06
[Qemu-devel] [RFC PATCH 17/34] [not to commit] import HYPERV_EVENTFD stuff from kernel, Roman Kagan, 2018/02/06
[Qemu-devel] [RFC PATCH 18/34] hyperv: add support for KVM_HYPERV_EVENTFD, Roman Kagan, 2018/02/06