lkml.org 
[lkml]   [2016]   [Feb]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RFC v4 10/14] vfio: introduce VFIO_IOVA_RESERVED vfio_dma type
    Date
    We introduce a vfio_dma type since we will need to discriminate
    legacy vfio_dma's from new reserved ones. Since those latter are
    not mapped at registration, some treatments need to be reworked:
    removal, replay. Currently they are unplugged. In subsequent patches
    they will be reworked.

    Signed-off-by: Eric Auger <eric.auger@linaro.org>
    ---
    drivers/vfio/vfio_iommu_type1.c | 17 ++++++++++++++++-
    1 file changed, 16 insertions(+), 1 deletion(-)

    diff --git a/drivers/vfio/vfio_iommu_type1.c b/drivers/vfio/vfio_iommu_type1.c
    index 6f1ea3d..692e9a2 100644
    --- a/drivers/vfio/vfio_iommu_type1.c
    +++ b/drivers/vfio/vfio_iommu_type1.c
    @@ -53,6 +53,15 @@ module_param_named(disable_hugepages,
    MODULE_PARM_DESC(disable_hugepages,
    "Disable VFIO IOMMU support for IOMMU hugepages.");

    +enum vfio_iova_type {
    + VFIO_IOVA_USER = 0, /* standard IOVA used to map user vaddr */
    + /*
    + * IOVA reserved to map special host physical addresses,
    + * MSI frames for instance
    + */
    + VFIO_IOVA_RESERVED,
    +};
    +
    struct vfio_iommu {
    struct list_head domain_list;
    struct mutex lock;
    @@ -75,6 +84,7 @@ struct vfio_dma {
    unsigned long vaddr; /* Process virtual addr */
    size_t size; /* Map size (bytes) */
    int prot; /* IOMMU_READ/WRITE */
    + enum vfio_iova_type type; /* type of IOVA */
    };

    struct vfio_group {
    @@ -395,7 +405,8 @@ static void vfio_unmap_unpin(struct vfio_iommu *iommu, struct vfio_dma *dma)

    static void vfio_remove_dma(struct vfio_iommu *iommu, struct vfio_dma *dma)
    {
    - vfio_unmap_unpin(iommu, dma);
    + if (likely(dma->type != VFIO_IOVA_RESERVED))
    + vfio_unmap_unpin(iommu, dma);
    vfio_unlink_dma(iommu, dma);
    kfree(dma);
    }
    @@ -671,6 +682,10 @@ static int vfio_iommu_replay(struct vfio_iommu *iommu,
    dma_addr_t iova;

    dma = rb_entry(n, struct vfio_dma, node);
    +
    + if (unlikely(dma->type == VFIO_IOVA_RESERVED))
    + continue;
    +
    iova = dma->iova;

    while (iova < dma->iova + dma->size) {
    --
    1.9.1
    \
     
     \ /
      Last update: 2016-02-26 19:21    [W:4.064 / U:0.356 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site