xen-bus: allow AioContext to be specified for each event channel
This patch adds an AioContext parameter to xen_device_bind_event_channel() and then uses aio_set_fd_handler() to set the callback rather than qemu_set_fd_handler(). Signed-off-by: Paul Durrant <paul.durrant@citrix.com> Reviewed-by: Anthony PERARD <anthony.perard@citrix.com> Message-Id: <20190408151617.13025-3-paul.durrant@citrix.com> [Call aio_set_fd_handler() with is_external=true] Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
This commit is contained in:
parent
c0b336ea19
commit
83361a8a1f
@ -806,7 +806,7 @@ void xen_block_dataplane_start(XenBlockDataPlane *dataplane,
|
||||
}
|
||||
|
||||
dataplane->event_channel =
|
||||
xen_device_bind_event_channel(xendev, event_channel,
|
||||
xen_device_bind_event_channel(xendev, dataplane->ctx, event_channel,
|
||||
xen_block_dataplane_event, dataplane,
|
||||
&local_err);
|
||||
if (local_err) {
|
||||
|
@ -925,6 +925,7 @@ done:
|
||||
|
||||
struct XenEventChannel {
|
||||
QLIST_ENTRY(XenEventChannel) list;
|
||||
AioContext *ctx;
|
||||
xenevtchn_handle *xeh;
|
||||
evtchn_port_t local_port;
|
||||
XenEventHandler handler;
|
||||
@ -944,6 +945,7 @@ static void xen_device_event(void *opaque)
|
||||
}
|
||||
|
||||
XenEventChannel *xen_device_bind_event_channel(XenDevice *xendev,
|
||||
AioContext *ctx,
|
||||
unsigned int port,
|
||||
XenEventHandler handler,
|
||||
void *opaque, Error **errp)
|
||||
@ -969,8 +971,9 @@ XenEventChannel *xen_device_bind_event_channel(XenDevice *xendev,
|
||||
channel->handler = handler;
|
||||
channel->opaque = opaque;
|
||||
|
||||
qemu_set_fd_handler(xenevtchn_fd(channel->xeh), xen_device_event, NULL,
|
||||
channel);
|
||||
channel->ctx = ctx;
|
||||
aio_set_fd_handler(channel->ctx, xenevtchn_fd(channel->xeh), true,
|
||||
xen_device_event, NULL, NULL, channel);
|
||||
|
||||
QLIST_INSERT_HEAD(&xendev->event_channels, channel, list);
|
||||
|
||||
@ -1011,7 +1014,8 @@ void xen_device_unbind_event_channel(XenDevice *xendev,
|
||||
|
||||
QLIST_REMOVE(channel, list);
|
||||
|
||||
qemu_set_fd_handler(xenevtchn_fd(channel->xeh), NULL, NULL, NULL);
|
||||
aio_set_fd_handler(channel->ctx, xenevtchn_fd(channel->xeh), true,
|
||||
NULL, NULL, NULL, NULL);
|
||||
|
||||
if (xenevtchn_unbind(channel->xeh, channel->local_port) < 0) {
|
||||
error_setg_errno(errp, errno, "xenevtchn_unbind failed");
|
||||
|
@ -122,6 +122,7 @@ void xen_device_copy_grant_refs(XenDevice *xendev, bool to_domain,
|
||||
typedef void (*XenEventHandler)(void *opaque);
|
||||
|
||||
XenEventChannel *xen_device_bind_event_channel(XenDevice *xendev,
|
||||
AioContext *ctx,
|
||||
unsigned int port,
|
||||
XenEventHandler handler,
|
||||
void *opaque, Error **errp);
|
||||
|
Loading…
x
Reference in New Issue
Block a user