[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v3 09/35] savevm/QEMUFile: introduce qemu_fopen_fd
From: |
Isaku Yamahata |
Subject: |
[Qemu-devel] [PATCH v3 09/35] savevm/QEMUFile: introduce qemu_fopen_fd |
Date: |
Tue, 30 Oct 2012 17:32:45 +0900 |
Introduce fd read/write backend of QEMUFile whose fd can be non-blocking
This will be used by postcopy live migration.
Signed-off-by: Isaku Yamahata <address@hidden>
---
qemu-file.h | 1 +
savevm.c | 35 +++++++++++++++++++++++++++++++++++
2 files changed, 36 insertions(+)
diff --git a/qemu-file.h b/qemu-file.h
index bc222dc..94557ea 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, const char *mode);
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 e24041b..712b7ae 100644
--- a/savevm.c
+++ b/savevm.c
@@ -207,6 +207,19 @@ 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;
+ return qemu_read_full(s->file->fd, buf, size);
+}
+
+static int fd_put_buffer(void *opaque,
+ const uint8_t *buf, int64_t pos, int size)
+{
+ QEMUFileFD *s = opaque;
+ return qemu_write_full(s->file->fd, buf, size);
+}
+
static int fd_close(void *opaque)
{
QEMUFileFD *s = opaque;
@@ -333,6 +346,28 @@ QEMUFile *qemu_fopen_socket(int fd)
return s->file;
}
+QEMUFile *qemu_fopen_fd(int fd, const char *mode)
+{
+ QEMUFileFD *s;
+
+ if (mode == NULL || (mode[0] != 'r' && mode[0] != 'w') || mode[1] != 0) {
+ fprintf(stderr, "qemu_fopen_fd: Argument validity check failed\n");
+ return NULL;
+ }
+
+ s = g_malloc0(sizeof(*s));
+ if (mode[0] == 'r') {
+ s->file = qemu_fopen_ops(s, NULL, fd_get_buffer, fd_close,
+ NULL, NULL, NULL);
+ } else {
+ s->file = qemu_fopen_ops(s, fd_put_buffer, NULL, 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.10.4
- [Qemu-devel] [PATCH v3 00/35] postcopy live migration, Isaku Yamahata, 2012/10/30
- [Qemu-devel] [PATCH v3 09/35] savevm/QEMUFile: introduce qemu_fopen_fd,
Isaku Yamahata <=
- [Qemu-devel] [PATCH v3 02/35] arch_init: DPRINTF format error and typo, Isaku Yamahata, 2012/10/30
- [Qemu-devel] [PATCH v3 05/35] protect the ramlist with a separate mutex, Isaku Yamahata, 2012/10/30
- [Qemu-devel] [PATCH v3 08/35] savevm/QEMUFile: consolidate QEMUFile functions a bit, Isaku Yamahata, 2012/10/30
- [Qemu-devel] [PATCH v3 06/35] osdep: add qemu_read_full() to read interrupt-safely, Isaku Yamahata, 2012/10/30
- [Qemu-devel] [PATCH v3 04/35] add a version number to ram_list, Isaku Yamahata, 2012/10/30
- [Qemu-devel] [PATCH v3 03/35] split MRU ram list, Isaku Yamahata, 2012/10/30
- [Qemu-devel] [PATCH v3 10/35] savevm/QEMUFile: add read/write QEMUFile on memory buffer, Isaku Yamahata, 2012/10/30
- [Qemu-devel] [PATCH v3 12/35] arch_init: export RAM_SAVE_xxx flags for postcopy, Isaku Yamahata, 2012/10/30
- [Qemu-devel] [PATCH v3 20/35] osdep: add QEMU_MADV_REMOVE and tirivial fix, Isaku Yamahata, 2012/10/30
- [Qemu-devel] [PATCH v3 01/35] migration.c: remove redundant line in migrate_init(), Isaku Yamahata, 2012/10/30