[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 11/12] migration: handle EAGAIN while reading QE
From: |
Orit Wasserman |
Subject: |
Re: [Qemu-devel] [PATCH 11/12] migration: handle EAGAIN while reading QEMUFile |
Date: |
Sun, 28 Oct 2012 12:01:41 +0200 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:15.0) Gecko/20120911 Thunderbird/15.0.1 |
On 10/18/2012 12:22 PM, Paolo Bonzini wrote:
> This will never happen right now (the assertion would fail). The
> next patch will set the socket or pipe in non-blocking mode, thus
> enabling this part of the code.
>
> Coroutines can just stop whenever they want with qemu_coroutine_yield.
> As soon as select tells the main loop that the migration stream is
> readable, the coroutine is re-entered directly in qemu_get_buffer,
> where it will read more data and pass it to the loading routines.
>
> Signed-off-by: Paolo Bonzini <address@hidden>
> ---
> savevm.c | 30 ++++++++++++++++++++++++------
> 1 file modificato, 24 inserzioni(+), 6 rimozioni(-)
>
> diff --git a/savevm.c b/savevm.c
> index ae5e617..783bb3c 100644
> --- a/savevm.c
> +++ b/savevm.c
> @@ -199,13 +199,22 @@ static int socket_get_buffer(void *opaque, uint8_t
> *buf, int64_t pos, int size)
> QEMUFileSocket *s = opaque;
> ssize_t len;
>
> - do {
> + for (;;) {
> len = qemu_recv(s->fd, buf, size, 0);
> - } while (len == -1 && socket_error() == EINTR);
> + if (len != -1) {
> + break;
> + }
> + if (errno == EAGAIN) {
socket_error()
> + assert(qemu_in_coroutine());
> + qemu_coroutine_yield();
> + } else if (errno != EINTR) {
socket_error()
> + break;
> + }
> + }
>
> - if (len == -1)
> + if (len == -1) {
> len = -socket_error();
> -
> + }
> return len;
> }
>
> @@ -236,10 +245,19 @@ static int stdio_get_buffer(void *opaque, uint8_t *buf,
> int64_t pos, int size)
> FILE *fp = s->stdio_file;
> int bytes;
>
> - do {
> + for (;;) {
> clearerr(fp);
> bytes = fread(buf, 1, size, fp);
> - } while ((bytes == 0) && ferror(fp) && (errno == EINTR));
> + if (bytes != 0 || !ferror(fp)) {
> + break;
> + }
> + if (errno == EAGAIN) {
> + assert(qemu_in_coroutine());
> + qemu_coroutine_yield();
> + } else if (errno != EINTR) {
> + break;
> + }
> + }
> return bytes;
> }
>
>
- Re: [Qemu-devel] [PATCH 06/12] migration: use migrate_fd_close in migrate_fd_cleanup, (continued)
- [Qemu-devel] [PATCH 09/12] migration: close socket QEMUFile from socket_close, Paolo Bonzini, 2012/10/18
- [Qemu-devel] [PATCH 07/12] migration: use closesocket, not close, Paolo Bonzini, 2012/10/18
- [Qemu-devel] [PATCH 08/12] migration: xxx_close will only be called once, Paolo Bonzini, 2012/10/18
- [Qemu-devel] [PATCH 10/12] migration: move qemu_fclose to process_incoming_migration, Paolo Bonzini, 2012/10/18
- [Qemu-devel] [PATCH 11/12] migration: handle EAGAIN while reading QEMUFile, Paolo Bonzini, 2012/10/18
- Re: [Qemu-devel] [PATCH 11/12] migration: handle EAGAIN while reading QEMUFile,
Orit Wasserman <=
- [Qemu-devel] [PATCH 12/12] migration: move process_incoming_migration to a coroutine, Paolo Bonzini, 2012/10/18