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>
master
Paul Durrant 2019-04-08 16:16:16 +01:00 committed by Anthony PERARD
parent c0b336ea19
commit 83361a8a1f
3 changed files with 9 additions and 4 deletions

View File

@ -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) {

View File

@ -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");

View File

@ -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);