Skip to content

Commit 94e89b4

Browse files
committed
Merge tag 'vfio-v5.5-rc1' of git://github.com/awilliam/linux-vfio
Pull VFIO updates from Alex Williamson: - Remove hugepage checks for reserved pfns (Ben Luo) - Fix irq-bypass unregister ordering (Jiang Yi) * tag 'vfio-v5.5-rc1' of git://github.com/awilliam/linux-vfio: vfio/pci: call irq_bypass_unregister_producer() before freeing irq vfio/type1: remove hugepage checks in is_invalid_reserved_pfn()
2 parents f74fd13 + 9917b54 commit 94e89b4

File tree

2 files changed

+5
-23
lines changed

2 files changed

+5
-23
lines changed

drivers/vfio/pci/vfio_pci_intrs.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -294,8 +294,8 @@ static int vfio_msi_set_vector_signal(struct vfio_pci_device *vdev,
294294
irq = pci_irq_vector(pdev, vector);
295295

296296
if (vdev->ctx[vector].trigger) {
297-
free_irq(irq, vdev->ctx[vector].trigger);
298297
irq_bypass_unregister_producer(&vdev->ctx[vector].producer);
298+
free_irq(irq, vdev->ctx[vector].trigger);
299299
kfree(vdev->ctx[vector].name);
300300
eventfd_ctx_put(vdev->ctx[vector].trigger);
301301
vdev->ctx[vector].trigger = NULL;

drivers/vfio/vfio_iommu_type1.c

Lines changed: 4 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -294,31 +294,13 @@ static int vfio_lock_acct(struct vfio_dma *dma, long npage, bool async)
294294
* Some mappings aren't backed by a struct page, for example an mmap'd
295295
* MMIO range for our own or another device. These use a different
296296
* pfn conversion and shouldn't be tracked as locked pages.
297+
* For compound pages, any driver that sets the reserved bit in head
298+
* page needs to set the reserved bit in all subpages to be safe.
297299
*/
298300
static bool is_invalid_reserved_pfn(unsigned long pfn)
299301
{
300-
if (pfn_valid(pfn)) {
301-
bool reserved;
302-
struct page *tail = pfn_to_page(pfn);
303-
struct page *head = compound_head(tail);
304-
reserved = !!(PageReserved(head));
305-
if (head != tail) {
306-
/*
307-
* "head" is not a dangling pointer
308-
* (compound_head takes care of that)
309-
* but the hugepage may have been split
310-
* from under us (and we may not hold a
311-
* reference count on the head page so it can
312-
* be reused before we run PageReferenced), so
313-
* we've to check PageTail before returning
314-
* what we just read.
315-
*/
316-
smp_rmb();
317-
if (PageTail(tail))
318-
return reserved;
319-
}
320-
return PageReserved(tail);
321-
}
302+
if (pfn_valid(pfn))
303+
return PageReserved(pfn_to_page(pfn));
322304

323305
return true;
324306
}

0 commit comments

Comments
 (0)