Message ID | 20230918144206.560120-30-armbru@redhat.com |
---|---|
State | New |
Headers | show |
Series | migration/rdma: Error handling fixes | expand |
On 18/09/2023 22:41, Markus Armbruster wrote: > When migration capability @rdma-pin-all is true, but the server cannot > honor it, qemu_rdma_connect() calls macro ERROR(), then returns > success. > > ERROR() sets an error. Since qemu_rdma_connect() returns success, its > caller rdma_start_outgoing_migration() duly assumes @errp is still > clear. The Error object leaks. > > ERROR() additionally reports the situation to the user as an error: > > RDMA ERROR: Server cannot support pinning all memory. Will register memory dynamically. > > Is this an error or not? It actually isn't; we disable @rdma-pin-all > and carry on. "Correcting" the user's configuration decisions that > way feels problematic, but that's a topic for another day. > > Replace ERROR() by warn_report(). This plugs the memory leak, and > emits a clearer message to the user. > > Signed-off-by: Markus Armbruster <armbru@redhat.com> Reviewed-by: Li Zhijian <lizhijian@fujitsu.com> > --- > migration/rdma.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/migration/rdma.c b/migration/rdma.c > index 6c643a1b30..d52de857c5 100644 > --- a/migration/rdma.c > +++ b/migration/rdma.c > @@ -2586,8 +2586,8 @@ static int qemu_rdma_connect(RDMAContext *rdma, bool return_path, > * and disable them otherwise. > */ > if (rdma->pin_all && !(cap.flags & RDMA_CAPABILITY_PIN_ALL)) { > - ERROR(errp, "Server cannot support pinning all memory. " > - "Will register memory dynamically."); > + warn_report("RDMA: Server cannot support pinning all memory. " > + "Will register memory dynamically."); > rdma->pin_all = false; > } >
diff --git a/migration/rdma.c b/migration/rdma.c index 6c643a1b30..d52de857c5 100644 --- a/migration/rdma.c +++ b/migration/rdma.c @@ -2586,8 +2586,8 @@ static int qemu_rdma_connect(RDMAContext *rdma, bool return_path, * and disable them otherwise. */ if (rdma->pin_all && !(cap.flags & RDMA_CAPABILITY_PIN_ALL)) { - ERROR(errp, "Server cannot support pinning all memory. " - "Will register memory dynamically."); + warn_report("RDMA: Server cannot support pinning all memory. " + "Will register memory dynamically."); rdma->pin_all = false; }
When migration capability @rdma-pin-all is true, but the server cannot honor it, qemu_rdma_connect() calls macro ERROR(), then returns success. ERROR() sets an error. Since qemu_rdma_connect() returns success, its caller rdma_start_outgoing_migration() duly assumes @errp is still clear. The Error object leaks. ERROR() additionally reports the situation to the user as an error: RDMA ERROR: Server cannot support pinning all memory. Will register memory dynamically. Is this an error or not? It actually isn't; we disable @rdma-pin-all and carry on. "Correcting" the user's configuration decisions that way feels problematic, but that's a topic for another day. Replace ERROR() by warn_report(). This plugs the memory leak, and emits a clearer message to the user. Signed-off-by: Markus Armbruster <armbru@redhat.com> --- migration/rdma.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)