From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Michael S. Tsirkin" Subject: Re: qemu-kvm: require 4K aligned resource size for memory Date: Thu, 22 Oct 2009 11:18:54 +0200 Message-ID: <20091022091854.GA27622@redhat.com> References: <20091020171508.GD13378@redhat.com> <20091022064247.GC24456@x200.localdomain> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: Avi Kivity , Dor Laor , kvm@vger.kernel.org To: Chris Wright Return-path: Received: from mx1.redhat.com ([209.132.183.28]:46054 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752318AbZJVJVG (ORCPT ); Thu, 22 Oct 2009 05:21:06 -0400 Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id n9M9LBdx031705 for ; Thu, 22 Oct 2009 05:21:11 -0400 Content-Disposition: inline In-Reply-To: <20091022064247.GC24456@x200.localdomain> Sender: kvm-owner@vger.kernel.org List-ID: On Wed, Oct 21, 2009 at 11:42:47PM -0700, Chris Wright wrote: > * Michael S. Tsirkin (mst@redhat.com) wrote: > > KVM does not virtualize low address bits for memory accesses, so we must > > require that PCI BAR size is a multiple of 4K for passthrough to work > > (this also guarantees that address is 4K aligned). > > > > Users of recent linux kernels can force resource size up to 4K > > using: > > > > commit 32a9a682bef2f6fce7026bd94d1ce20028b0e52d > > Author: Yuji Shimada > > Date: Mon Mar 16 17:13:39 2009 +0900 > > PCI: allow assignment of memory resources with a specified alignment > > > > Signed-off-by: Michael S. Tsirkin > > > > --- > > > > diff --git a/hw/device-assignment.c b/hw/device-assignment.c > > index 237060f..c2ef31f 100644 > > --- a/hw/device-assignment.c > > +++ b/hw/device-assignment.c > > @@ -381,6 +381,14 @@ static int assigned_dev_register_regions(PCIRegion *io_regions, > > int t = cur_region->type & IORESOURCE_PREFETCH > > ? PCI_ADDRESS_SPACE_MEM_PREFETCH > > : PCI_ADDRESS_SPACE_MEM; > > + if (cur_region->size & 0xFFF) { > > + fprintf(stderr, "Unable to assign device: PCI region %d " > > + "at address 0x%llx has size 0x%x, " > > + " which is not a multiple of 4K\n", > > + i, (unsigned long long)cur_region->base_addr, > > + cur_region->size); > > + return -1; > > + } > > should render this useless now shouldn't it? > > /* add offset */ > pci_dev->v_addrs[i].u.r_virtbase += > (cur_region->base_addr & 0xFFF); Yes, we could go over the code and remove all alignment. But I'd rather not in case we decide on another approach in the future. And for upstream, all this code will have to be rewritten anyway. > thanks, > -chris