Message ID | 20170717154026.32697-2-stefanha@redhat.com |
---|---|
State | New |
Headers | show |
> + if (io_read) { > + bitmask |= FD_READ | FD_ACCEPT | FD_CLOSE; > + } > + > + if (io_write) { > + bitmask |= FD_WRITE | FD_CONNECT; > + } > + > event = event_notifier_get_handle(&ctx->notifier); > - WSAEventSelect(node->pfd.fd, event, > - FD_READ | FD_ACCEPT | FD_CLOSE | > - FD_CONNECT | FD_WRITE | FD_OOB); > + WSAEventSelect(node->pfd.fd, event, bitmask); > } > As noticed by Eric, if the same socket is in use via both aio-win32 and another GSource, or via multiple AioContexts, this would break because there is only one WSAEventSelect mask for each socket handle. It is probably not going to break anything in the case of aio-win32, but I think it is worth at least a comment. And because WSAEventSelect is edge-triggered (e.g. an FD_WRITE event doesn't trigger again until the next write) it shouldn't be that bad for performance. If there's time to revert this patch, I think it would be preferable. Paolo
On Mon, Jul 17, 2017 at 7:23 PM, Paolo Bonzini <pbonzini@redhat.com> wrote: >> + if (io_read) { >> + bitmask |= FD_READ | FD_ACCEPT | FD_CLOSE; >> + } >> + >> + if (io_write) { >> + bitmask |= FD_WRITE | FD_CONNECT; >> + } >> + >> event = event_notifier_get_handle(&ctx->notifier); >> - WSAEventSelect(node->pfd.fd, event, >> - FD_READ | FD_ACCEPT | FD_CLOSE | >> - FD_CONNECT | FD_WRITE | FD_OOB); >> + WSAEventSelect(node->pfd.fd, event, bitmask); >> } >> > > As noticed by Eric, if the same socket is in use via both aio-win32 and > another GSource, or via multiple AioContexts, this would break because > there is only one WSAEventSelect mask for each socket handle. > > It is probably not going to break anything in the case of aio-win32, but I > think it is worth at least a comment. And because WSAEventSelect is > edge-triggered (e.g. an FD_WRITE event doesn't trigger again until the next > write) it shouldn't be that bad for performance. If there's time to revert > this patch, I think it would be preferable. It looks like this was applied, I'll be back in the office next week should I try and revert this or just add a comment explaining the limitation. Either that or store the current mask and OR then all together. Thanks, Alistair > > Paolo
diff --git a/util/aio-win32.c b/util/aio-win32.c index bca496a..d6d5e02 100644 --- a/util/aio-win32.c +++ b/util/aio-win32.c @@ -71,6 +71,7 @@ void aio_set_fd_handler(AioContext *ctx, } } else { HANDLE event; + long bitmask = 0; if (node == NULL) { /* Alloc and insert if it's not already there */ @@ -95,10 +96,16 @@ void aio_set_fd_handler(AioContext *ctx, node->io_write = io_write; node->is_external = is_external; + if (io_read) { + bitmask |= FD_READ | FD_ACCEPT | FD_CLOSE; + } + + if (io_write) { + bitmask |= FD_WRITE | FD_CONNECT; + } + event = event_notifier_get_handle(&ctx->notifier); - WSAEventSelect(node->pfd.fd, event, - FD_READ | FD_ACCEPT | FD_CLOSE | - FD_CONNECT | FD_WRITE | FD_OOB); + WSAEventSelect(node->pfd.fd, event, bitmask); } qemu_lockcnt_unlock(&ctx->list_lock);