Il 21/03/2013 10:09, Orit Wasserman ha scritto: > In migration all data is copied to a static buffer in QEMUFile, > this hurts our network bandwidth and CPU usage especially with large guests. > We switched to iovec for storing different buffers to send (even a byte field > is > considered as a buffer) and use writev to send the iovec. > writev was chosen (as apposed to sendmsg) because it supprts non socket fds. > > Guest memory pages are not copied by calling a new function > qemu_put_buffer_no_copy. > The page header data and device state data are still copied into the static > buffer. This data consists of a lot of bytes and integer fields and the static > buffer is used to store it during batching. > Another improvement is changing qemu_putbe64/32/16 to create a single > buffer instead of several byte sized buffer.
Very nice! I just disagree on making writev_buffer mandatory; instead, a QemuFileOps could choose between implementing either put_buffer or writev_buffer. This removes the duplicate code you have between iov_writev and block_writev_buffer. Thanks, Paolo > Orit Wasserman (12): > Add iov_writev to use writev to send iovec (also for files) > Add QemuFileWritevBuffer QemuFileOps > Add socket_writev_buffer function > Add stdio_writev_buffer function > Add block_writev_buffer function > Update bytes_xfer in qemu_put_byte > Store the data to send also in iovec > Use writev ops instead of put_buffer ops > More optimized qemu_put_be64/32/16 > Add qemu_put_buffer_no_copy > Use qemu_put_buffer_no_copy for guest memory pages > Bye Bye put_buffer > > arch_init.c | 2 +- > include/migration/qemu-file.h | 20 ++++--- > include/qemu/iov.h | 12 ++++ > savevm.c | 130 > +++++++++++++++++++++++++----------------- > util/iov.c | 36 ++++++++++++ > 5 files changed, 139 insertions(+), 61 deletions(-) >