From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:36130) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1c4N96-0003Dy-3D for qemu-devel@nongnu.org; Wed, 09 Nov 2016 02:18:09 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1c4N92-0006nu-PW for qemu-devel@nongnu.org; Wed, 09 Nov 2016 02:18:07 -0500 Received: from mx1.redhat.com ([209.132.183.28]:36216) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1c4N92-0006nk-K7 for qemu-devel@nongnu.org; Wed, 09 Nov 2016 02:18:04 -0500 Date: Wed, 9 Nov 2016 12:48:00 +0530 From: Amit Shah Message-ID: <20161109071800.GA1888@amit-lp.rh> References: <1478265017-5700-1-git-send-email-thuth@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1478265017-5700-1-git-send-email-thuth@redhat.com> Subject: Re: [Qemu-devel] [PATCH for-2.8] migration: Fix return code of ram_save_iterate() List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Thomas Huth Cc: Juan Quintela , qemu-devel@nongnu.org, "Dr. David Alan Gilbert" , David Gibson On (Fri) 04 Nov 2016 [14:10:17], Thomas Huth wrote: > qemu_savevm_state_iterate() expects the iterators to return 1 > when they are done, and 0 if there is still something left to do. > However, ram_save_iterate() does not obey this rule and returns > the number of saved pages instead. This causes a fatal hang with > ppc64 guests when you run QEMU like this (also works with TCG): "works with" -- does that mean reproduces with? > qemu-img create -f qcow2 /tmp/test.qcow2 1M > qemu-system-ppc64 -nographic -nodefaults -m 256 \ > -hda /tmp/test.qcow2 -serial mon:stdio > > ... then switch to the monitor by pressing CTRL-a c and try to > save a snapshot with "savevm test1" for example. > > After the first iteration, ram_save_iterate() always returns 0 here, > so that qemu_savevm_state_iterate() hangs in an endless loop and you > can only "kill -9" the QEMU process. > Fix it by using proper return values in ram_save_iterate(). > > Signed-off-by: Thomas Huth > --- > migration/ram.c | 6 +++--- > 1 file changed, 3 insertions(+), 3 deletions(-) > > diff --git a/migration/ram.c b/migration/ram.c > index fb9252d..a1c8089 100644 > --- a/migration/ram.c > +++ b/migration/ram.c > @@ -1987,7 +1987,7 @@ static int ram_save_iterate(QEMUFile *f, void *opaque) > int ret; > int i; > int64_t t0; > - int pages_sent = 0; > + int done = 0; > > rcu_read_lock(); > if (ram_list.version != last_version) { > @@ -2007,9 +2007,9 @@ static int ram_save_iterate(QEMUFile *f, void *opaque) > pages = ram_find_and_save_block(f, false, &bytes_transferred); > /* no more pages to sent */ > if (pages == 0) { > + done = 1; > break; > } > - pages_sent += pages; > acct_info.iterations++; > > /* we want to check in the 1st loop, just in case it was the 1st time > @@ -2044,7 +2044,7 @@ static int ram_save_iterate(QEMUFile *f, void *opaque) > return ret; > } > > - return pages_sent; > + return done; > } I agree with David, we can just remove the return value. The first patch of the series can do that; and this one could become the 2nd patch. Should be OK for the soft freeze. Amit