From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48219) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1W4t6G-0008IY-9s for qemu-devel@nongnu.org; Sun, 19 Jan 2014 09:11:49 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1W4t69-0000RC-0O for qemu-devel@nongnu.org; Sun, 19 Jan 2014 09:11:44 -0500 Received: from mx1.redhat.com ([209.132.183.28]:59903) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1W4t68-0000R2-OP for qemu-devel@nongnu.org; Sun, 19 Jan 2014 09:11:36 -0500 Message-ID: <1390140691.8705.99.camel@bling.home> From: Alex Williamson Date: Sun, 19 Jan 2014 07:11:31 -0700 In-Reply-To: References: <20140117192252.10456.96113.stgit@bling.home> <20140117192550.10456.54442.stgit@bling.home> Content-Type: text/plain; charset="UTF-8" Mime-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PULL 7/7] vfio: fix mapping of MSIX bar List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Kai Huang Cc: Alexey Kardashevskiy , qemu-devel@nongnu.org, aliguori@amazon.com, kvm@vger.kernel.org On Sun, 2014-01-19 at 22:03 +0800, Kai Huang wrote: > On Sat, Jan 18, 2014 at 3:25 AM, Alex Williamson > wrote: > > From: Alexey Kardashevskiy > > > > VFIO virtualizes MSIX table for the guest but not mapping the part of > > a BAR which contains an MSIX table. Since vfio_mmap_bar() mmaps chunks > > before and after the MSIX table, they have to be aligned to the host > > page size which may be TARGET_PAGE_MASK (4K) or 64K in case of PPC64. > > > > This fixes boundaries calculations to use the real host page size. > > > > Without the patch, the chunk before MSIX table may overlap with the MSIX > > table and mmap will fail in the host kernel. The result will be serious > > slowdown as the whole BAR will be emulated by QEMU. > > > > Signed-off-by: Alexey Kardashevskiy > > Signed-off-by: Alex Williamson > > --- > > hw/misc/vfio.c | 6 +++--- > > 1 file changed, 3 insertions(+), 3 deletions(-) > > > > diff --git a/hw/misc/vfio.c b/hw/misc/vfio.c > > index 432547c..8a1f1a1 100644 > > --- a/hw/misc/vfio.c > > +++ b/hw/misc/vfio.c > > @@ -2544,7 +2544,7 @@ static void vfio_map_bar(VFIODevice *vdev, int nr) > > * potentially insert a direct-mapped subregion before and after it. > > */ > > if (vdev->msix && vdev->msix->table_bar == nr) { > > - size = vdev->msix->table_offset & TARGET_PAGE_MASK; > > + size = vdev->msix->table_offset & qemu_host_page_mask; > > } > > > > strncat(name, " mmap", sizeof(name) - strlen(name) - 1); > > @@ -2556,8 +2556,8 @@ static void vfio_map_bar(VFIODevice *vdev, int nr) > > if (vdev->msix && vdev->msix->table_bar == nr) { > > unsigned start; > > > > - start = TARGET_PAGE_ALIGN(vdev->msix->table_offset + > > - (vdev->msix->entries * PCI_MSIX_ENTRY_SIZE)); > > + start = HOST_PAGE_ALIGN(vdev->msix->table_offset + > > + (vdev->msix->entries * PCI_MSIX_ENTRY_SIZE)); > > > Hi Alex, > > I am new to vfio and qemu, and have some questions. Does MSIX have one > dedicated bar when qemu emulating the device? Looks your code maps > both the content before and after the MSIX table? If MSIX has > dedicated bar, I think we can just skip the MSIX bar, why do we need > to map the context before and after the MSIX table? vfio is used to pass through existing physical devices. We don't get to define the MSI-X layout of those devices. Therefore we must be prepared to handle any possible layout. The BAR may be dedicated to the MSI-X table or it may also include memory mapped register space for the device. Thanks, Alex