Commit 83361a8a authored by Paul Durrant's avatar Paul Durrant Committed by Anthony PERARD
Browse files

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: default avatarPaul Durrant <paul.durrant@citrix.com>
Reviewed-by: default avatarAnthony 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: default avatarAnthony PERARD <anthony.perard@citrix.com>
parent c0b336ea
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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) {
+7 −3
Original line number Diff line number Diff line
@@ -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");
+1 −0
Original line number Diff line number Diff line
@@ -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);