Skip to content

Commit

Permalink
vfio/ap: Validate iova during dma_unmap and trigger irq disable
Browse files Browse the repository at this point in the history
Currently, each mapped iova is stashed in its associated vfio_ap_queue;
when we get an unmap request, validate that it matches with one or more of
these stashed values before attempting unpins.

Each stashed iova represents IRQ that was enabled for a queue.  Therefore,
if a match is found, trigger IRQ disable for this queue to ensure that
underlying firmware will no longer try to use the associated pfn after the
page is unpinned. IRQ disable will also handle the associated unpin.

Link: https://lore.kernel.org/r/[email protected]
Reviewed-by: Tony Krowiak <[email protected]>
Signed-off-by: Matthew Rosato <[email protected]>
Signed-off-by: Yi Liu <[email protected]>
Signed-off-by: Jason Gunthorpe <[email protected]>
  • Loading branch information
rosatomj authored and jgunthorpe committed Dec 2, 2022
1 parent 4dc334c commit 2a54e34
Showing 1 changed file with 17 additions and 1 deletion.
18 changes: 17 additions & 1 deletion drivers/s390/crypto/vfio_ap_ops.c
Original file line number Diff line number Diff line change
Expand Up @@ -1535,13 +1535,29 @@ static int vfio_ap_mdev_set_kvm(struct ap_matrix_mdev *matrix_mdev,
return 0;
}

static void unmap_iova(struct ap_matrix_mdev *matrix_mdev, u64 iova, u64 length)
{
struct ap_queue_table *qtable = &matrix_mdev->qtable;
struct vfio_ap_queue *q;
int loop_cursor;

hash_for_each(qtable->queues, loop_cursor, q, mdev_qnode) {
if (q->saved_iova >= iova && q->saved_iova < iova + length)
vfio_ap_irq_disable(q);
}
}

static void vfio_ap_mdev_dma_unmap(struct vfio_device *vdev, u64 iova,
u64 length)
{
struct ap_matrix_mdev *matrix_mdev =
container_of(vdev, struct ap_matrix_mdev, vdev);

vfio_unpin_pages(&matrix_mdev->vdev, iova, 1);
mutex_lock(&matrix_dev->mdevs_lock);

unmap_iova(matrix_mdev, iova, length);

mutex_unlock(&matrix_dev->mdevs_lock);
}

/**
Expand Down

0 comments on commit 2a54e34

Please sign in to comment.