All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jason Gunthorpe <jgg@nvidia.com>
To: Alex Williamson <alex.williamson@redhat.com>
Cc: cohuck@redhat.com, kvm@vger.kernel.org,
	linux-kernel@vger.kernel.org, peterx@redhat.com
Subject: Re: [PATCH v1 12/14] vfio/type1: Support batching of device mappings
Date: Mon, 8 Mar 2021 21:04:06 -0400	[thread overview]
Message-ID: <20210309010406.GE4247@nvidia.com> (raw)
In-Reply-To: <161524017090.3480.6508004360325488879.stgit@gimli.home>

On Mon, Mar 08, 2021 at 02:49:31PM -0700, Alex Williamson wrote:
> Populate the page array to the extent available to enable batching.
> 
> Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
>  drivers/vfio/vfio_iommu_type1.c |   10 +++++++++-
>  1 file changed, 9 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/vfio/vfio_iommu_type1.c b/drivers/vfio/vfio_iommu_type1.c
> index e89f11141dee..d499bccfbe3f 100644
> +++ b/drivers/vfio/vfio_iommu_type1.c
> @@ -628,6 +628,8 @@ static int vaddr_get_pfns(struct vfio_iommu *iommu, struct vfio_dma *dma,
>  	vma = find_vma_intersection(mm, vaddr, vaddr + 1);
>  
>  	if (vma && vma->vm_flags & VM_PFNMAP) {
> +		unsigned long count, i;
> +
>  		if ((dma->prot & IOMMU_WRITE && !(vma->vm_flags & VM_WRITE)) ||
>  		    (dma->prot & IOMMU_READ && !(vma->vm_flags & VM_READ))) {
>  			ret = -EFAULT;
> @@ -678,7 +680,13 @@ static int vaddr_get_pfns(struct vfio_iommu *iommu, struct vfio_dma *dma,
>  
>  		*pfn = ((vaddr - vma->vm_start) >> PAGE_SHIFT) +
>  							dma->pfnmap->base_pfn;
> -		ret = 1;
> +		count = min_t(long,
> +			      (vma->vm_end - vaddr) >> PAGE_SHIFT, npages);
> +
> +		for (i = 0; i < count; i++)
> +			pages[i] = pfn_to_page(*pfn + i);

This isn't safe, we can't pass a VM_PFNMAP pfn into pfn_to_page(). The
whole api here with the batch should be using pfns not struct pages

Also.. this is not nice at all:

static int put_pfn(unsigned long pfn, int prot)
{
        if (!is_invalid_reserved_pfn(pfn)) {
                struct page *page = pfn_to_page(pfn);

                unpin_user_pages_dirty_lock(&page, 1, prot & IOMMU_WRITE);

The manner in which the PFN was obtained should be tracked internally
to VFIO, not deduced externally by the pfn type. *only* pages returned
by pin_user_pages() should be used with unpin_user_pages() - the other
stuff must be kept distinct.

This is actually another bug with the way things are today, as if the
user gets a PFNMAP VMA that happens to point to a struct page (eg a
MIXEDMAP, these things exist in the kernel), the unpin will explode
when it gets here.

Something like what hmm_range_fault() does where the high bits of the
pfn encode information about it (there is always PAGE_SHIFT high bits
available for use) is much cleaner/safer.

Jason

  reply	other threads:[~2021-03-09  1:05 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-03-08 21:47 [PATCH v1 00/14] vfio: Device memory DMA mapping improvements Alex Williamson
2021-03-08 21:47 ` [PATCH v1 01/14] vfio: Create vfio_fs_type with inode per device Alex Williamson
2021-03-09  8:36   ` Christoph Hellwig
2021-04-09  4:54   ` 答复: " Zengtao (B)
2021-04-09 14:24     ` Alex Williamson
2021-04-09 17:32       ` Jason Gunthorpe
2021-04-12  4:03         ` 答复: " Zengtao (B)
2021-04-12  4:09       ` Zengtao (B)
2021-03-08 21:47 ` [PATCH v1 02/14] vfio: Update vfio_add_group_dev() API Alex Williamson
2021-03-10  7:48   ` Christoph Hellwig
2021-03-10 12:19     ` Jason Gunthorpe
2021-03-10 15:28       ` Alex Williamson
2021-03-11 11:23         ` Christoph Hellwig
2021-03-08 21:47 ` [PATCH v1 03/14] vfio: Export unmap_mapping_range() wrapper Alex Williamson
2021-03-08 21:48 ` [PATCH v1 04/14] vfio/pci: Use vfio_device_unmap_mapping_range() Alex Williamson
2021-03-08 21:48 ` [PATCH v1 05/14] vfio: Create a vfio_device from vma lookup Alex Williamson
2021-03-08 21:48 ` [PATCH v1 06/14] vfio: Add vma to pfn callback Alex Williamson
2021-03-09  0:33   ` Jason Gunthorpe
2021-03-08 21:48 ` [PATCH v1 07/14] vfio: Add a device notifier interface Alex Williamson
2021-03-09  0:46   ` Jason Gunthorpe
2021-03-09 15:45     ` Alex Williamson
2021-03-09 16:47       ` Jason Gunthorpe
2021-03-10  7:56   ` Christoph Hellwig
2021-03-19 22:25     ` Alex Williamson
2021-03-22 15:16       ` Christoph Hellwig
2021-03-08 21:48 ` [PATCH v1 08/14] vfio/pci: Notify on device release Alex Williamson
2021-03-08 21:48 ` [PATCH v1 09/14] vfio/type1: Refactor pfn_list clearing Alex Williamson
2021-03-10  8:01   ` Christoph Hellwig
2021-03-08 21:49 ` [PATCH v1 10/14] vfio/type1: Pass iommu and dma objects through to vaddr_get_pfn Alex Williamson
2021-03-08 21:49 ` [PATCH v1 11/14] vfio/type1: Register device notifier Alex Williamson
2021-03-10  8:03   ` Christoph Hellwig
2021-03-08 21:49 ` [PATCH v1 12/14] vfio/type1: Support batching of device mappings Alex Williamson
2021-03-09  1:04   ` Jason Gunthorpe [this message]
2021-03-08 21:49 ` [PATCH v1 13/14] vfio: Remove extern from declarations across vfio Alex Williamson
2021-03-09  0:21   ` Halil Pasic
2021-03-09  1:07   ` Jason Gunthorpe
2021-03-08 21:49 ` [PATCH v1 14/14] vfio: Cleanup use of bare unsigned Alex Williamson
2021-03-09  1:07   ` Jason Gunthorpe
2021-03-09  8:31     ` Christoph Hellwig
2021-03-09  1:06 ` [PATCH v1 00/14] vfio: Device memory DMA mapping improvements Jason Gunthorpe

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210309010406.GE4247@nvidia.com \
    --to=jgg@nvidia.com \
    --cc=alex.williamson@redhat.com \
    --cc=cohuck@redhat.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=peterx@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.