migration: make writes blocking
Move all the writes to the migration_thread, and make writings blocking. Notice that are still using the iothread for everything that we do. Signed-off-by: Juan Quintela <quintela@redhat.com>
This commit is contained in:
parent
766bd1769e
commit
dd217b8732
@ -113,11 +113,6 @@ int64_t qemu_file_set_rate_limit(QEMUFile *f, int64_t new_rate);
|
|||||||
int64_t qemu_file_get_rate_limit(QEMUFile *f);
|
int64_t qemu_file_get_rate_limit(QEMUFile *f);
|
||||||
int qemu_file_get_error(QEMUFile *f);
|
int qemu_file_get_error(QEMUFile *f);
|
||||||
|
|
||||||
/* Try to send any outstanding data. This function is useful when output is
|
|
||||||
* halted due to rate limiting or EAGAIN errors occur as it can be used to
|
|
||||||
* resume output. */
|
|
||||||
int qemu_file_put_notify(QEMUFile *f);
|
|
||||||
|
|
||||||
static inline void qemu_put_be64s(QEMUFile *f, const uint64_t *pv)
|
static inline void qemu_put_be64s(QEMUFile *f, const uint64_t *pv)
|
||||||
{
|
{
|
||||||
qemu_put_be64(f, *pv);
|
qemu_put_be64(f, *pv);
|
||||||
|
@ -69,7 +69,6 @@ void exec_start_outgoing_migration(MigrationState *s, const char *command, Error
|
|||||||
|
|
||||||
s->fd = fileno(f);
|
s->fd = fileno(f);
|
||||||
assert(s->fd != -1);
|
assert(s->fd != -1);
|
||||||
socket_set_nonblock(s->fd);
|
|
||||||
|
|
||||||
s->opaque = qemu_popen(f, "w");
|
s->opaque = qemu_popen(f, "w");
|
||||||
|
|
||||||
|
@ -75,7 +75,6 @@ void fd_start_outgoing_migration(MigrationState *s, const char *fdname, Error **
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
fcntl(s->fd, F_SETFL, O_NONBLOCK);
|
|
||||||
s->get_error = fd_errno;
|
s->get_error = fd_errno;
|
||||||
s->write = fd_write;
|
s->write = fd_write;
|
||||||
s->close = fd_close;
|
s->close = fd_close;
|
||||||
|
@ -60,6 +60,7 @@ static void tcp_wait_for_connect(int fd, void *opaque)
|
|||||||
} else {
|
} else {
|
||||||
DPRINTF("migrate connect success\n");
|
DPRINTF("migrate connect success\n");
|
||||||
s->fd = fd;
|
s->fd = fd;
|
||||||
|
socket_set_block(s->fd);
|
||||||
migrate_fd_connect(s);
|
migrate_fd_connect(s);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -60,6 +60,7 @@ static void unix_wait_for_connect(int fd, void *opaque)
|
|||||||
} else {
|
} else {
|
||||||
DPRINTF("migrate connect success\n");
|
DPRINTF("migrate connect success\n");
|
||||||
s->fd = fd;
|
s->fd = fd;
|
||||||
|
socket_set_block(s->fd);
|
||||||
migrate_fd_connect(s);
|
migrate_fd_connect(s);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
17
migration.c
17
migration.c
@ -297,18 +297,6 @@ static void migrate_fd_completed(MigrationState *s)
|
|||||||
notifier_list_notify(&migration_state_notifiers, s);
|
notifier_list_notify(&migration_state_notifiers, s);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void migrate_fd_put_notify(void *opaque)
|
|
||||||
{
|
|
||||||
MigrationState *s = opaque;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
qemu_set_fd_handler2(s->fd, NULL, NULL, NULL, NULL);
|
|
||||||
ret = qemu_file_put_notify(s->file);
|
|
||||||
if (ret) {
|
|
||||||
migrate_fd_error(s);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ssize_t migrate_fd_put_buffer(MigrationState *s, const void *data,
|
ssize_t migrate_fd_put_buffer(MigrationState *s, const void *data,
|
||||||
size_t size)
|
size_t size)
|
||||||
{
|
{
|
||||||
@ -325,10 +313,6 @@ ssize_t migrate_fd_put_buffer(MigrationState *s, const void *data,
|
|||||||
if (ret == -1)
|
if (ret == -1)
|
||||||
ret = -(s->get_error(s));
|
ret = -(s->get_error(s));
|
||||||
|
|
||||||
if (ret == -EAGAIN) {
|
|
||||||
qemu_set_fd_handler2(s->fd, NULL, NULL, migrate_fd_put_notify, s);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -425,7 +409,6 @@ int migrate_fd_close(MigrationState *s)
|
|||||||
{
|
{
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
if (s->fd != -1) {
|
if (s->fd != -1) {
|
||||||
qemu_set_fd_handler2(s->fd, NULL, NULL, NULL, NULL);
|
|
||||||
rc = s->close(s);
|
rc = s->close(s);
|
||||||
s->fd = -1;
|
s->fd = -1;
|
||||||
}
|
}
|
||||||
|
5
savevm.c
5
savevm.c
@ -555,11 +555,6 @@ int qemu_fclose(QEMUFile *f)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int qemu_file_put_notify(QEMUFile *f)
|
|
||||||
{
|
|
||||||
return f->ops->put_buffer(f->opaque, NULL, 0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void qemu_put_buffer(QEMUFile *f, const uint8_t *buf, int size)
|
void qemu_put_buffer(QEMUFile *f, const uint8_t *buf, int size)
|
||||||
{
|
{
|
||||||
int l;
|
int l;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user