Re: [PATCH 3/9] vfio/pci: Add a helper to create a DMABUF for a BAR-map VMA

Jason Gunthorpe
2026-04-24T18:24:34Z

On Thu, Apr 16, 2026 at 06:17:46AM -0700, Matt Evans wrote:
> +int vfio_pci_core_mmap_prep_dmabuf(struct vfio_pci_core_device *vdev,
> + struct vm_area_struct *vma,
> + u64 phys_start, u64 req_len,
> + unsigned int res_index)
> +{
> + struct vfio_pci_dma_buf *priv;
> + const unsigned int nr_ranges = 1;
> + int ret;
> +
> + priv = kzalloc_obj(*priv);
> + if (!priv)
> + return -ENOMEM;
> +
> + priv->phys_vec = kzalloc_obj(*priv->phys_vec);
> + if (!priv->phys_vec) {
> + ret = -ENOMEM;
> + goto err_free_priv;
> + }
> +
> + /*
> + * The mmap() request's vma->vm_offs might be non-zero, but
> + * the DMABUF is created from _offset zero_ of the BAR. The
> + * portion between zero and the vm_offs is inaccessible
> + * through this VMA, but this approach keeps the
> + * /proc/<pid>/maps offset somewhat consistent with the
> + * pre-DMABUF code. Size includes the offset portion.

I'm not sure I understand this comment?

For the old path vm_pgoff for byte 0 of the bar starts at some large
offset

For the new path vm_pgoff for byte 0 of the first range starts at 0

> + * This differs from an mmap() of an explicitly-exported
> + * DMABUF which is an arbitrary slice of the BAR, would be
> + * created with the desired offset+size, and would usually be
> + * mmap()ed with pgoff = 0.
> + *
> + * Both are equivalent and vfio_pci_dma_buf_find_pfn() finds
> + * the same PFNs.
> + */
> + priv->vdev = vdev;
> + priv->nr_ranges = nr_ranges;
> + priv->size = (vma->vm_pgoff << PAGE_SHIFT) + req_len;

And why is size being calculated from pgoff ?

Jason