From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:42135) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aG1l2-0006TQ-Sa for qemu-devel@nongnu.org; Mon, 04 Jan 2016 04:48:58 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aG1kw-0003nY-L2 for qemu-devel@nongnu.org; Mon, 04 Jan 2016 04:48:56 -0500 Received: from mx1.redhat.com ([209.132.183.28]:58294) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aG1kw-0003nR-DY for qemu-devel@nongnu.org; Mon, 04 Jan 2016 04:48:50 -0500 Date: Mon, 4 Jan 2016 09:48:45 +0000 From: "Dr. David Alan Gilbert" Message-ID: <20160104094845.GA2529@work-vm> References: <1447165546-27784-1-git-send-email-quintela@redhat.com> <1447165546-27784-50-git-send-email-quintela@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: Subject: Re: [Qemu-devel] [PULL 49/57] Round up RAMBlock sizes to host page sizes List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Peter Crosthwaite Cc: Amit Shah , Paolo Bonzini , "qemu-devel@nongnu.org Developers" , Juan Quintela * Peter Crosthwaite (crosthwaitepeter@gmail.com) wrote: > On Tue, Nov 10, 2015 at 6:25 AM, Juan Quintela wrote: > > From: "Dr. David Alan Gilbert" > > > > RAMBlocks that are not a multiple of host pages in length > > cause problems for postcopy (I've seen an ACPI table on aarch64 > > be 5k in length - i.e. 5x target-page), so round RAMBlock sizes > > up to a host-page. > > > > This potentially breaks migration compatibility due to changes > > in RAMBlock sizes; however: > > 1) x86 and s390 I think always have host=target page size > > 2) When I've tried on Power the block sizes already seem aligned. > > 3) I don't think there's anything else that maintains per-version > > machine-types for compatibility. > > > > Is there any reason this shouldn't be converted to > REAL_HOST_PAGE_ALIGN given these restrictions? If I remember correctly the only time host_page_size and real_host_page_size are different is the odd case where host_page_size < target_page_size; since we need to ensure alignment to the larger of the two, I don't think it's right to use real_host_page_size, since you might be aligning to something smaller than target_page_size. (I don't know if migration already works in that case anyway) > I'm thinking about multi-arch, where HOST_PAGE_ALIGN is inaccessible > from exec.c as it is target-arch specific. My previous workaround was > to define the target page size for multi-arch so that TARGET_PAGE_SIZE > was usable but not sure that should go viral to these other defs. Would it help to move qemu_ram_resize elsewhere? > The other approach, is to calculate the lowest common denominator for > the page size accross the multi-arch targets (+ the host) for the > implementation of HOST_PAGE_ALIGN and friends. I'm not sure I understand what happens to the migration bitmaps in multi-arch; the bitmaps are one bit per target-page. Dave > > Regards, > Peter > > > Signed-off-by: Dr. David Alan Gilbert > > Reviewed-by: Juan Quintela > > Signed-off-by: Juan Quintela > > --- > > exec.c | 8 ++++---- > > 1 file changed, 4 insertions(+), 4 deletions(-) > > > > diff --git a/exec.c b/exec.c > > index 36886ee..b09f18b 100644 > > --- a/exec.c > > +++ b/exec.c > > @@ -1452,7 +1452,7 @@ int qemu_ram_resize(ram_addr_t base, ram_addr_t newsize, Error **errp) > > > > assert(block); > > > > - newsize = TARGET_PAGE_ALIGN(newsize); > > + newsize = HOST_PAGE_ALIGN(newsize); > > > > if (block->used_length == newsize) { > > return 0; > > @@ -1596,7 +1596,7 @@ ram_addr_t qemu_ram_alloc_from_file(ram_addr_t size, MemoryRegion *mr, > > return -1; > > } > > > > - size = TARGET_PAGE_ALIGN(size); > > + size = HOST_PAGE_ALIGN(size); > > new_block = g_malloc0(sizeof(*new_block)); > > new_block->mr = mr; > > new_block->used_length = size; > > @@ -1632,8 +1632,8 @@ ram_addr_t qemu_ram_alloc_internal(ram_addr_t size, ram_addr_t max_size, > > ram_addr_t addr; > > Error *local_err = NULL; > > > > - size = TARGET_PAGE_ALIGN(size); > > - max_size = TARGET_PAGE_ALIGN(max_size); > > + size = HOST_PAGE_ALIGN(size); > > + max_size = HOST_PAGE_ALIGN(max_size); > > new_block = g_malloc0(sizeof(*new_block)); > > new_block->mr = mr; > > new_block->resized = resized; > > -- > > 2.5.0 > > > > -- Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK