migration: qemu_file_set_blocking(): add errp parameter
qemu_file_set_blocking() is a wrapper on qio_channel_set_blocking(), so let's passthrough the errp. Note the migration should not be using &error_abort in these calls, however, this is done to expedite the API conversion. The original code would have eventually ended up calling either qemu_socket_set_nonblock which would asset on Linux, or g_unix_set_fd_nonblocking which would propagate errors. We never saw asserts in practice, and conceptually they should not happen, but ideally this code will be later adapted to remove use of &error_abort. Acked-by: Peter Xu <peterx@redhat.com> Reviewed-by: Daniel P. Berrangé <berrange@redhat.com> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
This commit is contained in:
parent
1ed8903916
commit
fe6a74f365
6 changed files with 15 additions and 10 deletions
|
|
@ -859,7 +859,10 @@ static void *colo_process_incoming_thread(void *opaque)
|
||||||
* coroutine, and here we are in the COLO incoming thread, so it is ok to
|
* coroutine, and here we are in the COLO incoming thread, so it is ok to
|
||||||
* set the fd back to blocked.
|
* set the fd back to blocked.
|
||||||
*/
|
*/
|
||||||
qemu_file_set_blocking(mis->from_src_file, true);
|
if (!qemu_file_set_blocking(mis->from_src_file, true, &local_err)) {
|
||||||
|
error_report_err(local_err);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
colo_incoming_start_dirty_log();
|
colo_incoming_start_dirty_log();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -951,7 +951,7 @@ static void migration_incoming_setup(QEMUFile *f)
|
||||||
|
|
||||||
assert(!mis->from_src_file);
|
assert(!mis->from_src_file);
|
||||||
mis->from_src_file = f;
|
mis->from_src_file = f;
|
||||||
qemu_file_set_blocking(f, false);
|
qemu_file_set_blocking(f, false, &error_abort);
|
||||||
}
|
}
|
||||||
|
|
||||||
void migration_incoming_process(void)
|
void migration_incoming_process(void)
|
||||||
|
|
@ -971,7 +971,7 @@ static bool postcopy_try_recover(void)
|
||||||
/* This should be set already in migration_incoming_setup() */
|
/* This should be set already in migration_incoming_setup() */
|
||||||
assert(mis->from_src_file);
|
assert(mis->from_src_file);
|
||||||
/* Postcopy has standalone thread to do vm load */
|
/* Postcopy has standalone thread to do vm load */
|
||||||
qemu_file_set_blocking(mis->from_src_file, true);
|
qemu_file_set_blocking(mis->from_src_file, true, &error_abort);
|
||||||
|
|
||||||
/* Re-configure the return path */
|
/* Re-configure the return path */
|
||||||
mis->to_src_file = qemu_file_get_return_path(mis->from_src_file);
|
mis->to_src_file = qemu_file_get_return_path(mis->from_src_file);
|
||||||
|
|
@ -4002,7 +4002,9 @@ void migration_connect(MigrationState *s, Error *error_in)
|
||||||
}
|
}
|
||||||
|
|
||||||
migration_rate_set(rate_limit);
|
migration_rate_set(rate_limit);
|
||||||
qemu_file_set_blocking(s->to_dst_file, true);
|
if (!qemu_file_set_blocking(s->to_dst_file, true, &local_err)) {
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Open the return path. For postcopy, it is used exclusively. For
|
* Open the return path. For postcopy, it is used exclusively. For
|
||||||
|
|
|
||||||
|
|
@ -1909,7 +1909,7 @@ void postcopy_preempt_new_channel(MigrationIncomingState *mis, QEMUFile *file)
|
||||||
* The new loading channel has its own threads, so it needs to be
|
* The new loading channel has its own threads, so it needs to be
|
||||||
* blocked too. It's by default true, just be explicit.
|
* blocked too. It's by default true, just be explicit.
|
||||||
*/
|
*/
|
||||||
qemu_file_set_blocking(file, true);
|
qemu_file_set_blocking(file, true, &error_abort);
|
||||||
mis->postcopy_qemufile_dst = file;
|
mis->postcopy_qemufile_dst = file;
|
||||||
qemu_sem_post(&mis->postcopy_qemufile_dst_done);
|
qemu_sem_post(&mis->postcopy_qemufile_dst_done);
|
||||||
trace_postcopy_preempt_new_channel();
|
trace_postcopy_preempt_new_channel();
|
||||||
|
|
|
||||||
|
|
@ -888,9 +888,9 @@ void qemu_put_counted_string(QEMUFile *f, const char *str)
|
||||||
* both directions, and thus changing the blocking on the main
|
* both directions, and thus changing the blocking on the main
|
||||||
* QEMUFile can also affect the return path.
|
* QEMUFile can also affect the return path.
|
||||||
*/
|
*/
|
||||||
void qemu_file_set_blocking(QEMUFile *f, bool block)
|
bool qemu_file_set_blocking(QEMUFile *f, bool block, Error **errp)
|
||||||
{
|
{
|
||||||
qio_channel_set_blocking(f->ioc, block, NULL);
|
return qio_channel_set_blocking(f->ioc, block, errp);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
||||||
|
|
@ -71,7 +71,7 @@ void qemu_file_set_error(QEMUFile *f, int ret);
|
||||||
int qemu_file_shutdown(QEMUFile *f);
|
int qemu_file_shutdown(QEMUFile *f);
|
||||||
QEMUFile *qemu_file_get_return_path(QEMUFile *f);
|
QEMUFile *qemu_file_get_return_path(QEMUFile *f);
|
||||||
int qemu_fflush(QEMUFile *f);
|
int qemu_fflush(QEMUFile *f);
|
||||||
void qemu_file_set_blocking(QEMUFile *f, bool block);
|
bool qemu_file_set_blocking(QEMUFile *f, bool block, Error **errp);
|
||||||
int qemu_file_get_to_fd(QEMUFile *f, int fd, size_t size);
|
int qemu_file_get_to_fd(QEMUFile *f, int fd, size_t size);
|
||||||
void qemu_set_offset(QEMUFile *f, off_t off, int whence);
|
void qemu_set_offset(QEMUFile *f, off_t off, int whence);
|
||||||
off_t qemu_get_offset(QEMUFile *f);
|
off_t qemu_get_offset(QEMUFile *f);
|
||||||
|
|
|
||||||
|
|
@ -2095,7 +2095,7 @@ static void *postcopy_ram_listen_thread(void *opaque)
|
||||||
* Because we're a thread and not a coroutine we can't yield
|
* Because we're a thread and not a coroutine we can't yield
|
||||||
* in qemu_file, and thus we must be blocking now.
|
* in qemu_file, and thus we must be blocking now.
|
||||||
*/
|
*/
|
||||||
qemu_file_set_blocking(f, true);
|
qemu_file_set_blocking(f, true, &error_fatal);
|
||||||
|
|
||||||
/* TODO: sanity check that only postcopiable data will be loaded here */
|
/* TODO: sanity check that only postcopiable data will be loaded here */
|
||||||
load_res = qemu_loadvm_state_main(f, mis);
|
load_res = qemu_loadvm_state_main(f, mis);
|
||||||
|
|
@ -2108,7 +2108,7 @@ static void *postcopy_ram_listen_thread(void *opaque)
|
||||||
f = mis->from_src_file;
|
f = mis->from_src_file;
|
||||||
|
|
||||||
/* And non-blocking again so we don't block in any cleanup */
|
/* And non-blocking again so we don't block in any cleanup */
|
||||||
qemu_file_set_blocking(f, false);
|
qemu_file_set_blocking(f, false, &error_fatal);
|
||||||
|
|
||||||
trace_postcopy_ram_listen_thread_exit();
|
trace_postcopy_ram_listen_thread_exit();
|
||||||
if (load_res < 0) {
|
if (load_res < 0) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue