mbox

[PULL,00/12] Incoming migration coroutine

Message ID 1351878665-32413-1-git-send-email-pbonzini@redhat.com
State New
Headers show

Pull-request

git://github.com/bonzini/qemu.git migr-coroutine

Message

Paolo Bonzini Nov. 2, 2012, 5:50 p.m. UTC
Anthony,

The following changes since commit 4ba79505f43bd0ace35c3fe42197eb02e7e0478e:

  Merge remote-tracking branch 'kraxel/pixman.v3' into staging (2012-11-01 11:14:39 -0500)

are available in the git repository at:


  git://github.com/bonzini/qemu.git migr-coroutine

for you to fetch changes up to 82a4da79fd6c108400637143f8439c2364bdb21e:

  migration: move process_incoming_migration to a coroutine (2012-11-02 18:35:08 +0100)

With these patches, the monitor and the NBD server are responsive during
migration.

The first ten patches are just cleanups, generalizing some parts of
QEMUFile and improving the way migration sockets are closed.

The last two actually implement the feature.  They are the opposite
change of the nonblocking->blocking change that you implemented for the
migration thread.  However, the change is much simpler because we have
no timers, and because of the use of coroutines.

Without coroutines (and as in non-threaded migration), you have
to proceed in two steps: first collect data in a buffer, then
write it.  This lets you handle EAGAIN only at precise points in
buffered_flush/buffered_put_buffer, so that you can restart writing
in migrate_fd_put_notify.  This "checkpointing" is the reason why
QEMUFileBuffered exists.  With coroutines, you can just stop whenever
you want with qemu_coroutine_yield.  As soon as select tells you that
you can read, you'll re-enter directly in qemu_get_buffer, read more
data and pass it to the loading routines.

Paolo
----------------------------------------------------------------
Paolo Bonzini (12):
      migration: unify stdio-based QEMUFile operations
      migration: consolidate QEMUFile methods in a single QEMUFileOps struct
      migration: add qemu_get_fd
      migration: replace qemu_stdio_fd with qemu_get_fd
      migration: clean up server sockets and handlers before invoking process_incoming_migration
      migration: use migrate_fd_close in migrate_fd_cleanup
      migration: use closesocket, not close
      migration: xxx_close will only be called once
      migration: close socket QEMUFile from socket_close
      migration: move qemu_fclose to process_incoming_migration
      migration: handle EAGAIN while reading QEMUFile
      migration: move process_incoming_migration to a coroutine

 buffered_file.c  |  21 +++++--
 migration-exec.c |  19 +++---
 migration-fd.c   |  36 +++++------
 migration-tcp.c  |  19 +++---
 migration-unix.c |  17 +++--
 migration.c      |  46 ++++++++++----
 qemu-file.h      |  23 ++++---
 savevm.c         | 188 ++++++++++++++++++++++++++++++++-----------------------
 8 file modificati, 215 inserzioni(+), 154 rimozioni(-)

Comments

Anthony Liguori Nov. 2, 2012, 7:12 p.m. UTC | #1
Paolo Bonzini <pbonzini@redhat.com> writes:

> Anthony,
>
> The following changes since commit 4ba79505f43bd0ace35c3fe42197eb02e7e0478e:
>
>   Merge remote-tracking branch 'kraxel/pixman.v3' into staging (2012-11-01 11:14:39 -0500)
>
> are available in the git repository at:

Pulled. Thanks.

Regards,

Anthony Liguori

>
>
>   git://github.com/bonzini/qemu.git migr-coroutine
>
> for you to fetch changes up to 82a4da79fd6c108400637143f8439c2364bdb21e:
>
>   migration: move process_incoming_migration to a coroutine (2012-11-02 18:35:08 +0100)
>
> With these patches, the monitor and the NBD server are responsive during
> migration.
>
> The first ten patches are just cleanups, generalizing some parts of
> QEMUFile and improving the way migration sockets are closed.
>
> The last two actually implement the feature.  They are the opposite
> change of the nonblocking->blocking change that you implemented for the
> migration thread.  However, the change is much simpler because we have
> no timers, and because of the use of coroutines.
>
> Without coroutines (and as in non-threaded migration), you have
> to proceed in two steps: first collect data in a buffer, then
> write it.  This lets you handle EAGAIN only at precise points in
> buffered_flush/buffered_put_buffer, so that you can restart writing
> in migrate_fd_put_notify.  This "checkpointing" is the reason why
> QEMUFileBuffered exists.  With coroutines, you can just stop whenever
> you want with qemu_coroutine_yield.  As soon as select tells you that
> you can read, you'll re-enter directly in qemu_get_buffer, read more
> data and pass it to the loading routines.
>
> Paolo
> ----------------------------------------------------------------
> Paolo Bonzini (12):
>       migration: unify stdio-based QEMUFile operations
>       migration: consolidate QEMUFile methods in a single QEMUFileOps struct
>       migration: add qemu_get_fd
>       migration: replace qemu_stdio_fd with qemu_get_fd
>       migration: clean up server sockets and handlers before invoking process_incoming_migration
>       migration: use migrate_fd_close in migrate_fd_cleanup
>       migration: use closesocket, not close
>       migration: xxx_close will only be called once
>       migration: close socket QEMUFile from socket_close
>       migration: move qemu_fclose to process_incoming_migration
>       migration: handle EAGAIN while reading QEMUFile
>       migration: move process_incoming_migration to a coroutine
>
>  buffered_file.c  |  21 +++++--
>  migration-exec.c |  19 +++---
>  migration-fd.c   |  36 +++++------
>  migration-tcp.c  |  19 +++---
>  migration-unix.c |  17 +++--
>  migration.c      |  46 ++++++++++----
>  qemu-file.h      |  23 ++++---
>  savevm.c         | 188 ++++++++++++++++++++++++++++++++-----------------------
>  8 file modificati, 215 inserzioni(+), 154 rimozioni(-)
> -- 
> 1.7.12.1