Skip to content

Commit

Permalink
Merge tag 'vfio-v4.18-rc4' of git://github.com/awilliam/linux-vfio
Browse files Browse the repository at this point in the history
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
  • Loading branch information
torvalds committed Jul 6, 2018
2 parents b4d0562 + d7ef489 commit 1bb1557
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 22 deletions.
12 changes: 10 additions & 2 deletions drivers/vfio/pci/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -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.
16 changes: 7 additions & 9 deletions drivers/vfio/vfio_iommu_type1.c
Original file line number Diff line number Diff line change
Expand Up @@ -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];
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, !!(prot & IOMMU_WRITE),
page, vmas);
ret = get_user_pages_longterm(vaddr, 1, flags, page, vmas);
} else {
unsigned int flags = 0;

if (prot & IOMMU_WRITE)
flags |= FOLL_WRITE;

down_read(&mm->mmap_sem);
ret = get_user_pages_remote(NULL, mm, vaddr, 1, flags, page,
vmas, NULL);
/*
Expand All @@ -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]);
Expand Down
19 changes: 8 additions & 11 deletions samples/vfio-mdev/mbochs.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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,
};

Expand Down

0 comments on commit 1bb1557

Please sign in to comment.