[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 30/65] migration/rdma: Fix QEMUFileHooks method return values
|
From: |
Juan Quintela |
|
Subject: |
[PULL 30/65] migration/rdma: Fix QEMUFileHooks method return values |
|
Date: |
Wed, 11 Oct 2023 11:21:28 +0200 |
From: Markus Armbruster <armbru@redhat.com>
The QEMUFileHooks methods don't come with a written contract. Digging
through the code calling them, we find:
* save_page():
Negative values RAM_SAVE_CONTROL_DELAYED and
RAM_SAVE_CONTROL_NOT_SUPP are special. Any other negative value is
an unspecified error.
qemu_rdma_save_page() returns -EIO or rdma->error_state on error. I
believe the latter is always negative. Nothing stops either of them
to clash with the special values, though. Feels unlikely, but fix
it anyway to return only the special values and -1.
* before_ram_iterate(), after_ram_iterate():
Negative value means error. qemu_rdma_registration_start() and
qemu_rdma_registration_stop() comply as far as I can tell. Make
them comply *obviously*, by returning -1 on error.
* hook_ram_load:
Negative value means error. rdma_load_hook() already returns -1 on
error. Leave it alone.
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Li Zhijian <lizhijian@fujitsu.com>
Reviewed-by: Juan Quintela <quintela@redhat.com>
Signed-off-by: Juan Quintela <quintela@redhat.com>
Message-ID: <20230928132019.2544702-24-armbru@redhat.com>
---
migration/rdma.c | 79 +++++++++++++++++++++++-------------------------
1 file changed, 37 insertions(+), 42 deletions(-)
diff --git a/migration/rdma.c b/migration/rdma.c
index 55eb8222ea..974edde6a3 100644
--- a/migration/rdma.c
+++ b/migration/rdma.c
@@ -3268,12 +3268,11 @@ static int qemu_rdma_save_page(QEMUFile *f, ram_addr_t
block_offset,
rdma = qatomic_rcu_read(&rioc->rdmaout);
if (!rdma) {
- return -EIO;
+ return -1;
}
- ret = check_error_state(rdma);
- if (ret) {
- return ret;
+ if (check_error_state(rdma)) {
+ return -1;
}
qemu_fflush(f);
@@ -3329,9 +3328,10 @@ static int qemu_rdma_save_page(QEMUFile *f, ram_addr_t
block_offset,
}
return RAM_SAVE_CONTROL_DELAYED;
+
err:
rdma->error_state = ret;
- return ret;
+ return -1;
}
static void rdma_accept_incoming_migration(void *opaque);
@@ -3577,12 +3577,11 @@ static int qemu_rdma_registration_handle(QEMUFile *f)
rdma = qatomic_rcu_read(&rioc->rdmain);
if (!rdma) {
- return -EIO;
+ return -1;
}
- ret = check_error_state(rdma);
- if (ret) {
- return ret;
+ if (check_error_state(rdma)) {
+ return -1;
}
local = &rdma->local_ram_blocks;
@@ -3615,7 +3614,7 @@ static int qemu_rdma_registration_handle(QEMUFile *f)
(unsigned int)comp->block_idx,
rdma->local_ram_blocks.nb_blocks);
ret = -EIO;
- goto out;
+ goto err;
}
block = &(rdma->local_ram_blocks.block[comp->block_idx]);
@@ -3627,7 +3626,7 @@ static int qemu_rdma_registration_handle(QEMUFile *f)
case RDMA_CONTROL_REGISTER_FINISHED:
trace_qemu_rdma_registration_handle_finished();
- goto out;
+ return 0;
case RDMA_CONTROL_RAM_BLOCKS_REQUEST:
trace_qemu_rdma_registration_handle_ram_blocks();
@@ -3648,7 +3647,7 @@ static int qemu_rdma_registration_handle(QEMUFile *f)
if (ret) {
error_report("rdma migration: error dest "
"registering ram blocks");
- goto out;
+ goto err;
}
}
@@ -3687,7 +3686,7 @@ static int qemu_rdma_registration_handle(QEMUFile *f)
if (ret < 0) {
error_report("rdma migration: error sending remote info");
- goto out;
+ goto err;
}
break;
@@ -3714,7 +3713,7 @@ static int qemu_rdma_registration_handle(QEMUFile *f)
(unsigned int)reg->current_index,
rdma->local_ram_blocks.nb_blocks);
ret = -ENOENT;
- goto out;
+ goto err;
}
block = &(rdma->local_ram_blocks.block[reg->current_index]);
if (block->is_ram_block) {
@@ -3724,7 +3723,7 @@ static int qemu_rdma_registration_handle(QEMUFile *f)
block->block_name, block->offset,
reg->key.current_addr);
ret = -ERANGE;
- goto out;
+ goto err;
}
host_addr = (block->local_host_addr +
(reg->key.current_addr - block->offset));
@@ -3740,7 +3739,7 @@ static int qemu_rdma_registration_handle(QEMUFile *f)
" chunk: %" PRIx64,
block->block_name, reg->key.chunk);
ret = -ERANGE;
- goto out;
+ goto err;
}
}
chunk_start = ram_chunk_start(block, chunk);
@@ -3752,7 +3751,7 @@ static int qemu_rdma_registration_handle(QEMUFile *f)
chunk, chunk_start, chunk_end)) {
error_report("cannot get rkey");
ret = -EINVAL;
- goto out;
+ goto err;
}
reg_result->rkey = tmp_rkey;
@@ -3769,7 +3768,7 @@ static int qemu_rdma_registration_handle(QEMUFile *f)
if (ret < 0) {
error_report("Failed to send control buffer");
- goto out;
+ goto err;
}
break;
case RDMA_CONTROL_UNREGISTER_REQUEST:
@@ -3792,7 +3791,7 @@ static int qemu_rdma_registration_handle(QEMUFile *f)
if (ret != 0) {
perror("rdma unregistration chunk failed");
ret = -ret;
- goto out;
+ goto err;
}
rdma->total_registrations--;
@@ -3805,24 +3804,23 @@ static int qemu_rdma_registration_handle(QEMUFile *f)
if (ret < 0) {
error_report("Failed to send control buffer");
- goto out;
+ goto err;
}
break;
case RDMA_CONTROL_REGISTER_RESULT:
error_report("Invalid RESULT message at dest.");
ret = -EIO;
- goto out;
+ goto err;
default:
error_report("Unknown control message %s",
control_desc(head.type));
ret = -EIO;
- goto out;
+ goto err;
}
} while (1);
-out:
- if (ret < 0) {
- rdma->error_state = ret;
- }
- return ret;
+
+err:
+ rdma->error_state = ret;
+ return -1;
}
/* Destination:
@@ -3844,7 +3842,7 @@ rdma_block_notification_handle(QEMUFile *f, const char
*name)
rdma = qatomic_rcu_read(&rioc->rdmain);
if (!rdma) {
- return -EIO;
+ return -1;
}
/* Find the matching RAMBlock in our local list */
@@ -3857,7 +3855,7 @@ rdma_block_notification_handle(QEMUFile *f, const char
*name)
if (found == -1) {
error_report("RAMBlock '%s' not found on destination", name);
- return -ENOENT;
+ return -1;
}
rdma->local_ram_blocks.block[curr].src_index = rdma->next_src_index;
@@ -3887,7 +3885,6 @@ static int qemu_rdma_registration_start(QEMUFile *f,
{
QIOChannelRDMA *rioc = QIO_CHANNEL_RDMA(qemu_file_get_ioc(f));
RDMAContext *rdma;
- int ret;
if (migration_in_postcopy()) {
return 0;
@@ -3896,12 +3893,11 @@ static int qemu_rdma_registration_start(QEMUFile *f,
RCU_READ_LOCK_GUARD();
rdma = qatomic_rcu_read(&rioc->rdmaout);
if (!rdma) {
- return -EIO;
+ return -1;
}
- ret = check_error_state(rdma);
- if (ret) {
- return ret;
+ if (check_error_state(rdma)) {
+ return -1;
}
trace_qemu_rdma_registration_start(flags);
@@ -3930,12 +3926,11 @@ static int qemu_rdma_registration_stop(QEMUFile *f,
RCU_READ_LOCK_GUARD();
rdma = qatomic_rcu_read(&rioc->rdmaout);
if (!rdma) {
- return -EIO;
+ return -1;
}
- ret = check_error_state(rdma);
- if (ret) {
- return ret;
+ if (check_error_state(rdma)) {
+ return -1;
}
qemu_fflush(f);
@@ -3966,7 +3961,7 @@ static int qemu_rdma_registration_stop(QEMUFile *f,
qemu_rdma_reg_whole_ram_blocks : NULL);
if (ret < 0) {
fprintf(stderr, "receiving remote info!");
- return ret;
+ return -1;
}
nb_dest_blocks = resp.len / sizeof(RDMADestBlock);
@@ -3989,7 +3984,7 @@ static int qemu_rdma_registration_stop(QEMUFile *f,
"not identical on both the source and destination.",
local->nb_blocks, nb_dest_blocks);
rdma->error_state = -EINVAL;
- return -EINVAL;
+ return -1;
}
qemu_rdma_move_header(rdma, reg_result_idx, &resp);
@@ -4005,7 +4000,7 @@ static int qemu_rdma_registration_stop(QEMUFile *f,
local->block[i].length,
rdma->dest_blocks[i].length);
rdma->error_state = -EINVAL;
- return -EINVAL;
+ return -1;
}
local->block[i].remote_host_addr =
rdma->dest_blocks[i].remote_host_addr;
@@ -4025,7 +4020,7 @@ static int qemu_rdma_registration_stop(QEMUFile *f,
return 0;
err:
rdma->error_state = ret;
- return ret;
+ return -1;
}
static const QEMUFileHooks rdma_read_hooks = {
--
2.41.0
- [PULL 21/65] migration/rdma: Make qemu_rdma_buffer_mergeable() return bool, (continued)
- [PULL 21/65] migration/rdma: Make qemu_rdma_buffer_mergeable() return bool, Juan Quintela, 2023/10/11
- [PULL 28/65] migration/rdma: Fix qemu_get_cm_event_timeout() to always set error, Juan Quintela, 2023/10/11
- [PULL 23/65] migration/rdma: Fix or document problematic uses of errno, Juan Quintela, 2023/10/11
- [PULL 24/65] migration/rdma: Ditch useless numeric error codes in error messages, Juan Quintela, 2023/10/11
- [PULL 31/65] migration/rdma: Fix rdma_getaddrinfo() error checking, Juan Quintela, 2023/10/11
- [PULL 34/65] migration/rdma: Replace int error_state by bool errored, Juan Quintela, 2023/10/11
- [PULL 33/65] migration/rdma: Dumb down remaining int error values to -1, Juan Quintela, 2023/10/11
- [PULL 22/65] migration/rdma: Use bool for two RDMAContext flags, Juan Quintela, 2023/10/11
- [PULL 25/65] migration/rdma: Fix io_writev(), io_readv() methods to obey contract, Juan Quintela, 2023/10/11
- [PULL 29/65] migration/rdma: Drop dead qemu_rdma_data_init() code for !@host_port, Juan Quintela, 2023/10/11
- [PULL 30/65] migration/rdma: Fix QEMUFileHooks method return values,
Juan Quintela <=
- [PULL 26/65] migration/rdma: Replace dangerous macro CHECK_ERROR_STATE(), Juan Quintela, 2023/10/11
- [PULL 32/65] migration/rdma: Return -1 instead of negative errno code, Juan Quintela, 2023/10/11
- [PULL 27/65] migration/rdma: Fix qemu_rdma_broken_ipv6_kernel() to set error, Juan Quintela, 2023/10/11
- [PULL 37/65] migration/rdma: Plug a memory leak and improve a message, Juan Quintela, 2023/10/11
- [PULL 36/65] migration/rdma: Check negative error values the same way everywhere, Juan Quintela, 2023/10/11
- [PULL 35/65] migration/rdma: Drop superfluous assignments to @ret, Juan Quintela, 2023/10/11
- [PULL 38/65] migration/rdma: Delete inappropriate error_report() in macro ERROR(), Juan Quintela, 2023/10/11
- [PULL 41/65] migration/rdma: Drop "@errp is clear" guards around error_setg(), Juan Quintela, 2023/10/11
- [PULL 43/65] migration/rdma: Convert qemu_rdma_exchange_send() to Error, Juan Quintela, 2023/10/11
- [PULL 39/65] migration/rdma: Retire macro ERROR(), Juan Quintela, 2023/10/11