On Wed, Jan 07, 2026 at 02:13:28PM -0800, Alex Mastro wrote:
 
> @@ -124,20 +127,43 @@ static void vfio_pci_region_get(struct vfio_pci_device 
> *device, int index,
>  static void vfio_pci_bar_map(struct vfio_pci_device *device, int index)
>  {
>       struct vfio_pci_bar *bar = &device->bars[index];
> +     size_t align, size;
> +     void *map_base, *map_align;
>       int prot = 0;
>  
>       VFIO_ASSERT_LT(index, PCI_STD_NUM_BARS);
>       VFIO_ASSERT_NULL(bar->vaddr);
>       VFIO_ASSERT_TRUE(bar->info.flags & VFIO_REGION_INFO_FLAG_MMAP);
> +     VFIO_ASSERT_GT(bar->info.size, 0);
>  
>       if (bar->info.flags & VFIO_REGION_INFO_FLAG_READ)
>               prot |= PROT_READ;
>       if (bar->info.flags & VFIO_REGION_INFO_FLAG_WRITE)
>               prot |= PROT_WRITE;
>  
> -     bar->vaddr = mmap(NULL, bar->info.size, prot, MAP_FILE | MAP_SHARED,
> +     /*
> +      * Align the mmap for more efficient IOMMU mapping.
> +      * The largest PUD size supporting huge pfnmap is 1GiB.
> +      */
> +     size = bar->info.size;
> +     align = min_t(u64, 1ULL << __builtin_ctzll(size), SZ_1G);
> +
> +     map_base = mmap(NULL, size + align, PROT_NONE,
> +                     MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
> +     VFIO_ASSERT_NE(map_base, MAP_FAILED);
> +
> +     map_align = (void *)ALIGN((uintptr_t)map_base, align);
> +
> +     if (map_align > map_base)
> +             munmap(map_base, map_align - map_base);
> +     if (align > (size_t)(map_align - map_base))

I realized that this is tautological. Will fix in v2.

> +             munmap(map_align + size, align - (map_align - map_base));
> +
> +     bar->vaddr = mmap(map_align, size, prot, MAP_SHARED | MAP_FIXED,
>                         device->fd, bar->info.offset);
>       VFIO_ASSERT_NE(bar->vaddr, MAP_FAILED);
> +
> +     madvise(bar->vaddr, size, MADV_HUGEPAGE);
>  }
 

Reply via email to