On 30/11/17 05:27, Alex Williamson wrote: > On Thu, 23 Nov 2017 15:56:26 +1100 > Alexey Kardashevskiy <aik@xxxxxxxxx> wrote: > >> It is currently possible to have a sparse capability with 1 areas which >> starts at 0 and 0 bytes long. One example is: >> >> Texas Instruments TUSB73x0 SuperSpeed USB 3.0 xHCI Host Controller >> [...] >> Region 0: Memory at 3fe280000000 (64-bit, non-prefetchable) [size=64K] >> Region 2: Memory at 3fe280010000 (64-bit, non-prefetchable) [size=8K] >> [...] >> Capabilities: [c0] MSI-X: Enable+ Count=8 Masked- >> Vector table: BAR=2 offset=00000000 >> PBA: BAR=2 offset=00001000 >> >> With PAGE_SIZE=64K, MSIX BAR occupies the entire BAR2 and cannot be >> mapped. >> >> This makes it explicit - if sparse->areas is empty, then advertise >> nr_areas as 0. >> >> Signed-off-by: Alexey Kardashevskiy <aik@xxxxxxxxx> >> --- >> >> QEMU gets it right as vfio_setup_region_sparse_mmaps() checks for size >> after QEMU's 24acf72b9a291ce "vfio: Handle zero-length sparse mmap ranges" >> but why not make it explicit in the first place? >> >> >> --- >> drivers/vfio/pci/vfio_pci.c | 4 ++++ >> 1 file changed, 4 insertions(+) >> >> diff --git a/drivers/vfio/pci/vfio_pci.c b/drivers/vfio/pci/vfio_pci.c >> index f041b1a..a201c45 100644 >> --- a/drivers/vfio/pci/vfio_pci.c >> +++ b/drivers/vfio/pci/vfio_pci.c >> @@ -597,6 +597,10 @@ static int msix_sparse_mmap_cap(struct vfio_pci_device *vdev, >> i++; >> } >> >> + /* With all alignments, there are no gaps left to mmap */ >> + if (i == 0) >> + sparse->nr_areas = 0; >> + > > Ok, but why does 0 become a special case? Shouldn't we set > sparse->nr_areas = i? Thanks, This is what is returned to QEMU now - 1 sparse region, starts at 0, 0 bytes long. I am missing the point in having such region... > > Alex > >> ret = vfio_info_add_capability(caps, VFIO_REGION_INFO_CAP_SPARSE_MMAP, >> sparse); >> kfree(sparse); > -- Alexey