Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1bb15570 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'vfio-v4.18-rc4' of git://github.com/awilliam/linux-vfio

Pull VFIO fixes from Alex Williamson:

 - Make vfio-pci IGD extensions optional via Kconfig (Alex Williamson)

 - Remove unused and soon to be removed map_atomic callback from mbochs
   sample driver, add unmap callback to avoid dmabuf leaks (Gerd
   Hoffmann)

 - Fix usage of get_user_pages_longterm() (Jason Gunthorpe)

 - Fix sample mbochs driver vm_operations_struct.fault return type
   (Souptick Joarder)

* tag 'vfio-v4.18-rc4' of git://github.com/awilliam/linux-vfio:
  sample/vfio-mdev: Change return type to vm_fault_t
  vfio: Use get_user_pages_longterm correctly
  sample/mdev/mbochs: add mbochs_kunmap_dmabuf
  sample/mdev/mbochs: remove mbochs_kmap_atomic_dmabuf
  vfio/pci: Make IGD support a configurable option
parents b4d05621 d7ef4899
Loading
Loading
Loading
Loading
+10 −2
Original line number Diff line number Diff line
@@ -28,5 +28,13 @@ config VFIO_PCI_INTX
	def_bool y if !S390

config VFIO_PCI_IGD
	depends on VFIO_PCI
	def_bool y if X86
	bool "VFIO PCI extensions for Intel graphics (GVT-d)"
	depends on VFIO_PCI && X86
	default y
	help
	  Support for Intel IGD specific extensions to enable direct
	  assignment to virtual machines.  This includes exposing an IGD
	  specific firmware table and read-only copies of the host bridge
	  and LPC bridge config space.

	  To enable Intel IGD assignment through vfio-pci, say Y.
+7 −9
Original line number Diff line number Diff line
@@ -343,18 +343,16 @@ static int vaddr_get_pfn(struct mm_struct *mm, unsigned long vaddr,
	struct page *page[1];
	struct vm_area_struct *vma;
	struct vm_area_struct *vmas[1];
	int ret;

	if (mm == current->mm) {
		ret = get_user_pages_longterm(vaddr, 1, !!(prot & IOMMU_WRITE),
					      page, vmas);
	} else {
	unsigned int flags = 0;
	int ret;

	if (prot & IOMMU_WRITE)
		flags |= FOLL_WRITE;

	down_read(&mm->mmap_sem);
	if (mm == current->mm) {
		ret = get_user_pages_longterm(vaddr, 1, flags, page, vmas);
	} else {
		ret = get_user_pages_remote(NULL, mm, vaddr, 1, flags, page,
					    vmas, NULL);
		/*
@@ -368,8 +366,8 @@ static int vaddr_get_pfn(struct mm_struct *mm, unsigned long vaddr,
			ret = -EOPNOTSUPP;
			put_page(page[0]);
		}
		up_read(&mm->mmap_sem);
	}
	up_read(&mm->mmap_sem);

	if (ret == 1) {
		*pfn = page_to_pfn(page[0]);
+8 −11
Original line number Diff line number Diff line
@@ -657,7 +657,7 @@ static void mbochs_put_pages(struct mdev_state *mdev_state)
	dev_dbg(dev, "%s: %d pages released\n", __func__, count);
}

static int mbochs_region_vm_fault(struct vm_fault *vmf)
static vm_fault_t mbochs_region_vm_fault(struct vm_fault *vmf)
{
	struct vm_area_struct *vma = vmf->vma;
	struct mdev_state *mdev_state = vma->vm_private_data;
@@ -695,7 +695,7 @@ static int mbochs_mmap(struct mdev_device *mdev, struct vm_area_struct *vma)
	return 0;
}

static int mbochs_dmabuf_vm_fault(struct vm_fault *vmf)
static vm_fault_t mbochs_dmabuf_vm_fault(struct vm_fault *vmf)
{
	struct vm_area_struct *vma = vmf->vma;
	struct mbochs_dmabuf *dmabuf = vma->vm_private_data;
@@ -803,29 +803,26 @@ static void mbochs_release_dmabuf(struct dma_buf *buf)
	mutex_unlock(&mdev_state->ops_lock);
}

static void *mbochs_kmap_atomic_dmabuf(struct dma_buf *buf,
				       unsigned long page_num)
static void *mbochs_kmap_dmabuf(struct dma_buf *buf, unsigned long page_num)
{
	struct mbochs_dmabuf *dmabuf = buf->priv;
	struct page *page = dmabuf->pages[page_num];

	return kmap_atomic(page);
	return kmap(page);
}

static void *mbochs_kmap_dmabuf(struct dma_buf *buf, unsigned long page_num)
static void mbochs_kunmap_dmabuf(struct dma_buf *buf, unsigned long page_num,
				 void *vaddr)
{
	struct mbochs_dmabuf *dmabuf = buf->priv;
	struct page *page = dmabuf->pages[page_num];

	return kmap(page);
	kunmap(vaddr);
}

static struct dma_buf_ops mbochs_dmabuf_ops = {
	.map_dma_buf	  = mbochs_map_dmabuf,
	.unmap_dma_buf	  = mbochs_unmap_dmabuf,
	.release	  = mbochs_release_dmabuf,
	.map_atomic	  = mbochs_kmap_atomic_dmabuf,
	.map		  = mbochs_kmap_dmabuf,
	.unmap		  = mbochs_kunmap_dmabuf,
	.mmap		  = mbochs_mmap_dmabuf,
};