hyperv: allow passing arbitrary data to sint ack callback
Make sint ack callback accept an opaque pointer, that is stored on sint_route at creation time. This allows for more convenient interaction with the callback. Besides, nothing outside hyperv.c should need to know the layout of HvSintRoute fields any more so its declaration can be removed from the header. Signed-off-by: Roman Kagan <rkagan@virtuozzo.com> Message-Id: <20180921081836.29230-6-rkagan@virtuozzo.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
bd4ed63caa
commit
b56920245c
@ -52,7 +52,7 @@ static void sint_route_create(HypervTestDev *dev,
|
|||||||
sint_route->vp_index = vp_index;
|
sint_route->vp_index = vp_index;
|
||||||
sint_route->sint = sint;
|
sint_route->sint = sint;
|
||||||
|
|
||||||
sint_route->sint_route = kvm_hv_sint_route_create(vp_index, sint, NULL);
|
sint_route->sint_route = kvm_hv_sint_route_create(vp_index, sint, NULL, NULL);
|
||||||
assert(sint_route->sint_route);
|
assert(sint_route->sint_route);
|
||||||
|
|
||||||
QLIST_INSERT_HEAD(&dev->sint_routes, sint_route, le);
|
QLIST_INSERT_HEAD(&dev->sint_routes, sint_route, le);
|
||||||
|
@ -16,6 +16,16 @@
|
|||||||
#include "hyperv.h"
|
#include "hyperv.h"
|
||||||
#include "hyperv-proto.h"
|
#include "hyperv-proto.h"
|
||||||
|
|
||||||
|
struct HvSintRoute {
|
||||||
|
uint32_t sint;
|
||||||
|
uint32_t vp_index;
|
||||||
|
int gsi;
|
||||||
|
EventNotifier sint_set_notifier;
|
||||||
|
EventNotifier sint_ack_notifier;
|
||||||
|
HvSintAckClb sint_ack_clb;
|
||||||
|
void *sint_ack_clb_data;
|
||||||
|
};
|
||||||
|
|
||||||
uint32_t hyperv_vp_index(X86CPU *cpu)
|
uint32_t hyperv_vp_index(X86CPU *cpu)
|
||||||
{
|
{
|
||||||
return CPU(cpu)->cpu_index;
|
return CPU(cpu)->cpu_index;
|
||||||
@ -77,11 +87,12 @@ static void kvm_hv_sint_ack_handler(EventNotifier *notifier)
|
|||||||
HvSintRoute *sint_route = container_of(notifier, HvSintRoute,
|
HvSintRoute *sint_route = container_of(notifier, HvSintRoute,
|
||||||
sint_ack_notifier);
|
sint_ack_notifier);
|
||||||
event_notifier_test_and_clear(notifier);
|
event_notifier_test_and_clear(notifier);
|
||||||
sint_route->sint_ack_clb(sint_route);
|
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 *kvm_hv_sint_route_create(uint32_t vp_index, uint32_t sint,
|
||||||
HvSintAckClb sint_ack_clb)
|
HvSintAckClb sint_ack_clb,
|
||||||
|
void *sint_ack_clb_data)
|
||||||
{
|
{
|
||||||
HvSintRoute *sint_route;
|
HvSintRoute *sint_route;
|
||||||
EventNotifier *ack_notifier;
|
EventNotifier *ack_notifier;
|
||||||
@ -116,6 +127,7 @@ HvSintRoute *kvm_hv_sint_route_create(uint32_t vp_index, uint32_t sint,
|
|||||||
}
|
}
|
||||||
sint_route->gsi = gsi;
|
sint_route->gsi = gsi;
|
||||||
sint_route->sint_ack_clb = sint_ack_clb;
|
sint_route->sint_ack_clb = sint_ack_clb;
|
||||||
|
sint_route->sint_ack_clb_data = sint_ack_clb_data;
|
||||||
sint_route->vp_index = vp_index;
|
sint_route->vp_index = vp_index;
|
||||||
sint_route->sint = sint;
|
sint_route->sint = sint;
|
||||||
|
|
||||||
|
@ -16,24 +16,15 @@
|
|||||||
|
|
||||||
#include "cpu.h"
|
#include "cpu.h"
|
||||||
#include "sysemu/kvm.h"
|
#include "sysemu/kvm.h"
|
||||||
#include "qemu/event_notifier.h"
|
|
||||||
|
|
||||||
typedef struct HvSintRoute HvSintRoute;
|
typedef struct HvSintRoute HvSintRoute;
|
||||||
typedef void (*HvSintAckClb)(HvSintRoute *sint_route);
|
typedef void (*HvSintAckClb)(void *data);
|
||||||
|
|
||||||
struct HvSintRoute {
|
|
||||||
uint32_t sint;
|
|
||||||
uint32_t vp_index;
|
|
||||||
int gsi;
|
|
||||||
EventNotifier sint_set_notifier;
|
|
||||||
EventNotifier sint_ack_notifier;
|
|
||||||
HvSintAckClb sint_ack_clb;
|
|
||||||
};
|
|
||||||
|
|
||||||
int kvm_hv_handle_exit(X86CPU *cpu, struct kvm_hyperv_exit *exit);
|
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 *kvm_hv_sint_route_create(uint32_t vp_index, uint32_t sint,
|
||||||
HvSintAckClb sint_ack_clb);
|
HvSintAckClb sint_ack_clb,
|
||||||
|
void *sint_ack_clb_data);
|
||||||
|
|
||||||
void kvm_hv_sint_route_destroy(HvSintRoute *sint_route);
|
void kvm_hv_sint_route_destroy(HvSintRoute *sint_route);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user