hyperv: make HvSintRoute reference-counted
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 <rkagan@virtuozzo.com> Message-Id: <20180921081836.29230-8-rkagan@virtuozzo.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
09cfb2f635
commit
3d3e6e85c3
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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,7 +91,7 @@ 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,
|
||||
HvSintRoute *hyperv_sint_route_new(uint32_t vp_index, uint32_t sint,
|
||||
HvSintAckClb sint_ack_clb,
|
||||
void *sint_ack_clb_data)
|
||||
{
|
||||
@ -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);
|
||||
|
@ -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,
|
||||
HvSintRoute *hyperv_sint_route_new(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);
|
||||
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);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user