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