[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-block] [PATCH v3 04/13] nbd: convert to using I/O channels for
From: |
Paolo Bonzini |
Subject: |
Re: [Qemu-block] [PATCH v3 04/13] nbd: convert to using I/O channels for actual socket I/O |
Date: |
Tue, 19 Jan 2016 17:08:12 +0100 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.5.0 |
On 19/01/2016 14:09, Daniel P. Berrange wrote:
> + * This will update @iov so that its head is advanced
> + * by @skip bytes. To do this, zero or more complete
> + * elements of @iov will be skipped over. The new head
> + * of @iov will then have its base & len updated to
> + * skip the remaining number of bytes. @oldiov will
> + * hold the original data from the new head of @iov.
> + */
> +static void nbd_skip_iov(size_t skip,
> + struct iovec **iov,
> + int *niov,
> + struct iovec *oldiov)
> {
> - size_t offset = 0;
> - int err;
> -
> - if (qemu_in_coroutine()) {
> - if (do_read) {
> - return qemu_co_recv(fd, buffer, size);
> + ssize_t done = 0;
> + size_t i;
> + for (i = 0; i < *niov; i++) {
> + if ((*iov)[i].iov_len <= skip) {
> + done += (*iov)[i].iov_len;
> + skip -= (*iov)[i].iov_len;
> } else {
> - return qemu_co_send(fd, buffer, size);
> + done += skip;
> + oldiov->iov_base = (*iov)[i].iov_base;
> + oldiov->iov_len = (*iov)[i].iov_len;
> + (*iov)[i].iov_len -= skip;
> + (*iov)[i].iov_base += skip;
> + *iov = *iov + i;
> + *niov = *niov - i;
> + break;
> }
> }
Can you use iov_discard_front instead?
>
> + /* XXX see about using qio_channel_yield() in
> + * future if we can use normal watches instead
> + * of the AIO handlers */
> + qemu_coroutine_yield();
This breaks dataplane. The simplest solution is to change
qio_channel_yield() to just
qio_channel_aio_yield(ioc, qemu_get_aio_context(), condition);
where qio_channel_aio_yield(QIOChannel*, AioContext *, int) is
implemented by the backends. The implementation could then use
aio_set_fd_handler, and it would be almost trivial because it would
reuse common code just like the one in io/channel-watch.c.
Websock is the only complicated case. I think it's fine if you simply
must not use qio_channel_{,aio_}yield() for websock channels.
That said, I'm not sure you can even rely on nbd_negotiate_continue to
run in the main I/O thread. So, another possibility is to add an
alternative watch API similar to AioContext's:
qio_channel_set_handler(QIOChannel*, AioContext*, void(*in)(void*),
void(*out)(void*), void *opaque)
whose implementation would again be simple for backends other than
websock, and probably trivial for backends other than buffer and
websock. Again, it wouldn't be a problem to skip buffer and websock for
the time being (read, until someone actually needs it).
Converting the block layer to use GMainLoop, unfortunately, would lose
too much performance.
Paolo
- [Qemu-block] [PATCH v3 03/13] nbd: convert blockdev NBD server to use I/O channels for connection setup, (continued)
- [Qemu-block] [PATCH v3 03/13] nbd: convert blockdev NBD server to use I/O channels for connection setup, Daniel P. Berrange, 2016/01/19
- [Qemu-block] [PATCH v3 01/13] nbd: convert block client to use I/O channels for connection setup, Daniel P. Berrange, 2016/01/19
- [Qemu-block] [PATCH v3 07/13] nbd: make client request fixed new style if advertized, Daniel P. Berrange, 2016/01/19
- [Qemu-block] [PATCH v3 06/13] nbd: make server compliant with fixed newstyle spec, Daniel P. Berrange, 2016/01/19
- [Qemu-block] [PATCH v3 05/13] nbd: invert client logic for negotiating protocol version, Daniel P. Berrange, 2016/01/19
- [Qemu-block] [PATCH v3 08/13] nbd: allow setting of an export name for qemu-nbd server, Daniel P. Berrange, 2016/01/19
- [Qemu-block] [PATCH v3 10/13] nbd: implement TLS support in the protocol negotiation, Daniel P. Berrange, 2016/01/19
- [Qemu-block] [PATCH v3 04/13] nbd: convert to using I/O channels for actual socket I/O, Daniel P. Berrange, 2016/01/19
- Re: [Qemu-block] [PATCH v3 04/13] nbd: convert to using I/O channels for actual socket I/O,
Paolo Bonzini <=
- [Qemu-block] [PATCH v3 09/13] nbd: pick first exported volume if no export name is requested, Daniel P. Berrange, 2016/01/19
[Qemu-block] [PATCH v3 11/13] nbd: enable use of TLS with NBD block driver, Daniel P. Berrange, 2016/01/19
[Qemu-block] [PATCH v3 13/13] nbd: enable use of TLS with nbd-server-start command, Daniel P. Berrange, 2016/01/19
[Qemu-block] [PATCH v3 12/13] nbd: enable use of TLS with qemu-nbd server, Daniel P. Berrange, 2016/01/19