[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v2 7/8] hyperv: make HvSintRoute reference-counted
From: |
Roman Kagan |
Subject: |
[Qemu-devel] [PATCH v2 7/8] hyperv: make HvSintRoute reference-counted |
Date: |
Fri, 21 Sep 2018 11:18:35 +0300 |
Multiple entities (e.g. VMBus devices) can use the same SINT route. To
make their lives easier in maintaining SINT route ownership, make it
reference-counted. Adjust the respective API names accordingly.
Signed-off-by: Roman Kagan <address@hidden>
---
target/i386/hyperv.h | 10 +++++-----
hw/misc/hyperv_testdev.c | 4 ++--
target/i386/hyperv.c | 25 +++++++++++++++++++++----
3 files changed, 28 insertions(+), 11 deletions(-)
diff --git a/target/i386/hyperv.h b/target/i386/hyperv.h
index ab99047bf8..cdf44a7757 100644
--- a/target/i386/hyperv.h
+++ b/target/i386/hyperv.h
@@ -22,11 +22,11 @@ typedef void (*HvSintAckClb)(void *data);
int kvm_hv_handle_exit(X86CPU *cpu, struct kvm_hyperv_exit *exit);
-HvSintRoute *kvm_hv_sint_route_create(uint32_t vp_index, uint32_t sint,
- HvSintAckClb sint_ack_clb,
- void *sint_ack_clb_data);
-
-void kvm_hv_sint_route_destroy(HvSintRoute *sint_route);
+HvSintRoute *hyperv_sint_route_new(uint32_t vp_index, uint32_t sint,
+ HvSintAckClb sint_ack_clb,
+ void *sint_ack_clb_data);
+void hyperv_sint_route_ref(HvSintRoute *sint_route);
+void hyperv_sint_route_unref(HvSintRoute *sint_route);
int kvm_hv_sint_route_set_sint(HvSintRoute *sint_route);
diff --git a/hw/misc/hyperv_testdev.c b/hw/misc/hyperv_testdev.c
index 6f4fa2ab91..0d0776eb3c 100644
--- a/hw/misc/hyperv_testdev.c
+++ b/hw/misc/hyperv_testdev.c
@@ -52,7 +52,7 @@ static void sint_route_create(HypervTestDev *dev,
sint_route->vp_index = vp_index;
sint_route->sint = sint;
- sint_route->sint_route = kvm_hv_sint_route_create(vp_index, sint, NULL,
NULL);
+ sint_route->sint_route = hyperv_sint_route_new(vp_index, sint, NULL, NULL);
assert(sint_route->sint_route);
QLIST_INSERT_HEAD(&dev->sint_routes, sint_route, le);
@@ -79,7 +79,7 @@ static void sint_route_destroy(HypervTestDev *dev,
sint_route = sint_route_find(dev, vp_index, sint);
QLIST_REMOVE(sint_route, le);
- kvm_hv_sint_route_destroy(sint_route->sint_route);
+ hyperv_sint_route_unref(sint_route->sint_route);
g_free(sint_route);
}
diff --git a/target/i386/hyperv.c b/target/i386/hyperv.c
index 0ce8a7aa2f..4d8ef6f2da 100644
--- a/target/i386/hyperv.c
+++ b/target/i386/hyperv.c
@@ -24,6 +24,7 @@ struct HvSintRoute {
EventNotifier sint_ack_notifier;
HvSintAckClb sint_ack_clb;
void *sint_ack_clb_data;
+ unsigned refcount;
};
uint32_t hyperv_vp_index(X86CPU *cpu)
@@ -90,9 +91,9 @@ static void kvm_hv_sint_ack_handler(EventNotifier *notifier)
sint_route->sint_ack_clb(sint_route->sint_ack_clb_data);
}
-HvSintRoute *kvm_hv_sint_route_create(uint32_t vp_index, uint32_t sint,
- HvSintAckClb sint_ack_clb,
- void *sint_ack_clb_data)
+HvSintRoute *hyperv_sint_route_new(uint32_t vp_index, uint32_t sint,
+ HvSintAckClb sint_ack_clb,
+ void *sint_ack_clb_data)
{
HvSintRoute *sint_route;
EventNotifier *ack_notifier;
@@ -136,6 +137,7 @@ HvSintRoute *kvm_hv_sint_route_create(uint32_t vp_index,
uint32_t sint,
sint_route->sint_ack_clb_data = sint_ack_clb_data;
sint_route->cpu = cpu;
sint_route->sint = sint;
+ sint_route->refcount = 1;
return sint_route;
@@ -154,8 +156,23 @@ err:
return NULL;
}
-void kvm_hv_sint_route_destroy(HvSintRoute *sint_route)
+void hyperv_sint_route_ref(HvSintRoute *sint_route)
{
+ sint_route->refcount++;
+}
+
+void hyperv_sint_route_unref(HvSintRoute *sint_route)
+{
+ if (!sint_route) {
+ return;
+ }
+
+ assert(sint_route->refcount > 0);
+
+ if (--sint_route->refcount) {
+ return;
+ }
+
kvm_irqchip_remove_irqfd_notifier_gsi(kvm_state,
&sint_route->sint_set_notifier,
sint_route->gsi);
--
2.17.1
- [Qemu-devel] [PATCH v2 0/8] hyperv: refactor HvSintRoute management, Roman Kagan, 2018/09/21
- [Qemu-devel] [PATCH v2 2/8] hyperv_testdev: drop unnecessary includes, Roman Kagan, 2018/09/21
- [Qemu-devel] [PATCH v2 1/8] hyperv_testdev: refactor for better maintainability, Roman Kagan, 2018/09/21
- [Qemu-devel] [PATCH v2 3/8] hyperv: cosmetic: g_malloc -> g_new, Roman Kagan, 2018/09/21
- [Qemu-devel] [PATCH v2 4/8] hyperv: synic: only setup ack notifier if there's a callback, Roman Kagan, 2018/09/21
- [Qemu-devel] [PATCH v2 5/8] hyperv: allow passing arbitrary data to sint ack callback, Roman Kagan, 2018/09/21
- [Qemu-devel] [PATCH v2 6/8] hyperv: address HvSintRoute by X86CPU pointer, Roman Kagan, 2018/09/21
- [Qemu-devel] [PATCH v2 8/8] hyperv: rename kvm_hv_sint_route_set_sint, Roman Kagan, 2018/09/21
- [Qemu-devel] [PATCH v2 7/8] hyperv: make HvSintRoute reference-counted,
Roman Kagan <=