Introduce nonblocking fd read backend of QEMUFile. This will be used by postcopy live migration. Signed-off-by: Isaku Yamahata <yamahata@xxxxxxxxxxxxx> --- qemu-file.h | 1 + savevm.c | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 0 deletions(-) diff --git a/qemu-file.h b/qemu-file.h index 1a12e7d..af5b123 100644 --- a/qemu-file.h +++ b/qemu-file.h @@ -68,6 +68,7 @@ QEMUFile *qemu_fopen_ops(void *opaque, QEMUFilePutBufferFunc *put_buffer, QEMUFile *qemu_fopen(const char *filename, const char *mode); QEMUFile *qemu_fdopen(int fd, const char *mode); QEMUFile *qemu_fopen_socket(int fd); +QEMUFile *qemu_fopen_fd(int fd); QEMUFile *qemu_popen(FILE *popen_file, const char *mode); QEMUFile *qemu_popen_cmd(const char *command, const char *mode); int qemu_file_fd(QEMUFile *f); diff --git a/savevm.c b/savevm.c index 2fb0c3e..5640614 100644 --- a/savevm.c +++ b/savevm.c @@ -207,6 +207,35 @@ static int socket_get_buffer(void *opaque, uint8_t *buf, int64_t pos, int size) return len; } +static int fd_get_buffer(void *opaque, uint8_t *buf, int64_t pos, int size) +{ + QEMUFileFD *s = opaque; + ssize_t len = 0; + + while (size > 0) { + ssize_t ret = read(s->file->fd, buf, size); + if (ret == -1) { + if (errno == EINTR) { + continue; + } + if (len == 0) { + len = -errno; + } + break; + } + + if (ret == 0) { + /* the write end of the pipe is closed */ + break; + } + len += ret; + buf += ret; + size -= ret; + } + + return len; +} + static int fd_close(void *opaque) { QEMUFileFD *s = opaque; @@ -333,6 +362,17 @@ QEMUFile *qemu_fopen_socket(int fd) return s->file; } +QEMUFile *qemu_fopen_fd(int fd) +{ + QEMUFileFD *s = g_malloc0(sizeof(*s)); + + fcntl_setfl(fd, O_NONBLOCK); + s->file = qemu_fopen_ops(s, NULL, fd_get_buffer, fd_close, + NULL, NULL, NULL); + s->file->fd = fd; + return s->file; +} + static int file_put_buffer(void *opaque, const uint8_t *buf, int64_t pos, int size) { -- 1.7.1.1 -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html