On 28/09/2023 21:20, Markus Armbruster wrote: > error_report() obeys -msg, reports the current error location if any, > and reports to the current monitor if any. Reporting to stderr > directly with fprintf() or perror() is wrong, because it loses all > this. > > Fix the offenders. Bonus: resolves a FIXME about problematic use of > errno. > > Signed-off-by: Markus Armbruster <arm...@redhat.com>
Reviewed-by: Li Zhijian <lizhij...@fujitsu.com> > --- > migration/rdma.c | 44 +++++++++++++++++++++----------------------- > 1 file changed, 21 insertions(+), 23 deletions(-) > > diff --git a/migration/rdma.c b/migration/rdma.c > index 54b59d12b1..dba0802fca 100644 > --- a/migration/rdma.c > +++ b/migration/rdma.c > @@ -877,12 +877,12 @@ static int qemu_rdma_broken_ipv6_kernel(struct > ibv_context *verbs, Error **errp) > > if (roce_found) { > if (ib_found) { > - fprintf(stderr, "WARN: migrations may fail:" > - " IPv6 over RoCE / iWARP in linux" > - " is broken. But since you appear to have a" > - " mixed RoCE / IB environment, be sure to > only" > - " migrate over the IB fabric until the > kernel " > - " fixes the bug.\n"); > + warn_report("WARN: migrations may fail:" > + " IPv6 over RoCE / iWARP in linux" > + " is broken. But since you appear to have a" > + " mixed RoCE / IB environment, be sure to only" > + " migrate over the IB fabric until the kernel " > + " fixes the bug."); > } else { > error_setg(errp, "RDMA ERROR: " > "You only have RoCE / iWARP devices in your > systems" > @@ -1418,12 +1418,8 @@ static int qemu_rdma_unregister_waiting(RDMAContext > *rdma) > block->remote_keys[chunk] = 0; > > if (ret != 0) { > - /* > - * FIXME perror() is problematic, bcause ibv_dereg_mr() is > - * not documented to set errno. Will go away later in > - * this series. > - */ > - perror("unregistration chunk failed"); > + error_report("unregistration chunk failed: %s", > + strerror(ret)); > return -1; > } > rdma->total_registrations--; > @@ -3767,7 +3763,8 @@ static int qemu_rdma_registration_handle(QEMUFile *f) > block->pmr[reg->key.chunk] = NULL; > > if (ret != 0) { > - perror("rdma unregistration chunk failed"); > + error_report("rdma unregistration chunk failed: %s", > + strerror(errno)); > goto err; > } > > @@ -3956,10 +3953,10 @@ static int qemu_rdma_registration_stop(QEMUFile *f, > */ > > if (local->nb_blocks != nb_dest_blocks) { > - fprintf(stderr, "ram blocks mismatch (Number of blocks %d vs %d) > " > - "Your QEMU command line parameters are probably " > - "not identical on both the source and destination.", > - local->nb_blocks, nb_dest_blocks); > + error_report("ram blocks mismatch (Number of blocks %d vs %d)", > + local->nb_blocks, nb_dest_blocks); > + error_printf("Your QEMU command line parameters are probably " > + "not identical on both the source and > destination."); > rdma->errored = true; > return -1; > } > @@ -3972,10 +3969,11 @@ static int qemu_rdma_registration_stop(QEMUFile *f, > > /* We require that the blocks are in the same order */ > if (rdma->dest_blocks[i].length != local->block[i].length) { > - fprintf(stderr, "Block %s/%d has a different length %" PRIu64 > - "vs %" PRIu64, local->block[i].block_name, i, > - local->block[i].length, > - rdma->dest_blocks[i].length); > + error_report("Block %s/%d has a different length %" PRIu64 > + "vs %" PRIu64, > + local->block[i].block_name, i, > + local->block[i].length, > + rdma->dest_blocks[i].length); > rdma->errored = true; > return -1; > } > @@ -4091,7 +4089,7 @@ static void rdma_accept_incoming_migration(void *opaque) > ret = qemu_rdma_accept(rdma); > > if (ret < 0) { > - fprintf(stderr, "RDMA ERROR: Migration initialization failed\n"); > + error_report("RDMA ERROR: Migration initialization failed"); > return; > } > > @@ -4103,7 +4101,7 @@ static void rdma_accept_incoming_migration(void *opaque) > > f = rdma_new_input(rdma); > if (f == NULL) { > - fprintf(stderr, "RDMA ERROR: could not open RDMA for input\n"); > + error_report("RDMA ERROR: could not open RDMA for input"); > qemu_rdma_cleanup(rdma); > return; > }