From mboxrd@z Thu Jan 1 00:00:00 1970 From: Avi Kivity Subject: Re: [Qemu-devel] [PATCH 03/23] memory: merge adjacent segments of a single memory region Date: Tue, 26 Jul 2011 12:55:23 +0300 Message-ID: <4E2E8F0B.9090402@redhat.com> References: <1311602584-23409-1-git-send-email-avi@redhat.com> <1311602584-23409-4-git-send-email-avi@redhat.com> <4E2DBA75.5010701@codemonkey.ws> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Cc: qemu-devel@nongnu.org, kvm@vger.kernel.org To: Anthony Liguori Return-path: Received: from mx1.redhat.com ([209.132.183.28]:13619 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750982Ab1GZJz2 (ORCPT ); Tue, 26 Jul 2011 05:55:28 -0400 In-Reply-To: <4E2DBA75.5010701@codemonkey.ws> Sender: kvm-owner@vger.kernel.org List-ID: On 07/25/2011 09:48 PM, Anthony Liguori wrote: >> +/* Attempt to simplify a view by merging ajacent ranges */ >> +static void flatview_simplify(FlatView *view) >> +{ >> + unsigned i; >> + FlatRange *r1, *r2; >> + >> + for (i = 0; i + 1< view->nr; ++i) { >> + r1 =&view->ranges[i]; >> + r2 =&view->ranges[i+1]; >> + if (addrrange_end(r1->addr) == r2->addr.start >> +&& r1->mr == r2->mr >> +&& r1->offset_in_region + r1->addr.size == r2->offset_in_region >> +&& r1->dirty_log_mask == r2->dirty_log_mask) { >> + r1->addr.size += r2->addr.size; >> + memmove(r2, r2 + 1, (view->nr - (i + 2)) * sizeof(*r2)); >> + --view->nr; >> + --i; >> + } > > > The --i is pretty subtle. Moving the index variable backwards in a > conditional in a for loop is pretty evil :-) I started writing up why > this was wrong until I noticed that. > > I think the following would be more straight forward: > > i = 0; > while (i + 1 < view->nr) { > int begin = i, end = i + 1; > > while (matches(&view->ranges[begin], &view->ranges[end])) { > end++; > } > > memmove(...) > } > Right; updated to something along these lines. -- error compiling committee.c: too many arguments to function