lkml.org 
[lkml]   [2019]   [May]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v8 22/29] vfio: VFIO_IOMMU_ATTACH/DETACH_PASID_TABLE
    Date
    From: "Liu, Yi L" <yi.l.liu@linux.intel.com>

    This patch adds VFIO_IOMMU_ATTACH/DETACH_PASID_TABLE ioctl
    which aims to pass/withdraw the virtual iommu guest configuration
    to/from the VFIO driver downto to the iommu subsystem.

    Signed-off-by: Jacob Pan <jacob.jun.pan@linux.intel.com>
    Signed-off-by: Liu, Yi L <yi.l.liu@linux.intel.com>
    Signed-off-by: Eric Auger <eric.auger@redhat.com>

    ---
    v6 -> v7:
    - add a comment related to VFIO_IOMMU_DETACH_PASID_TABLE

    v3 -> v4:
    - restore ATTACH/DETACH
    - add unwind on failure

    v2 -> v3:
    - s/BIND_PASID_TABLE/SET_PASID_TABLE

    v1 -> v2:
    - s/BIND_GUEST_STAGE/BIND_PASID_TABLE
    - remove the struct device arg
    ---
    drivers/vfio/vfio_iommu_type1.c | 53 +++++++++++++++++++++++++++++++++
    include/uapi/linux/vfio.h | 22 ++++++++++++++
    2 files changed, 75 insertions(+)

    diff --git a/drivers/vfio/vfio_iommu_type1.c b/drivers/vfio/vfio_iommu_type1.c
    index 3ddc375e7063..b2d609d6fe83 100644
    --- a/drivers/vfio/vfio_iommu_type1.c
    +++ b/drivers/vfio/vfio_iommu_type1.c
    @@ -1758,6 +1758,43 @@ static int vfio_domains_have_iommu_cache(struct vfio_iommu *iommu)
    return ret;
    }

    +static void
    +vfio_detach_pasid_table(struct vfio_iommu *iommu)
    +{
    + struct vfio_domain *d;
    +
    + mutex_lock(&iommu->lock);
    +
    + list_for_each_entry(d, &iommu->domain_list, next) {
    + iommu_detach_pasid_table(d->domain);
    + }
    + mutex_unlock(&iommu->lock);
    +}
    +
    +static int
    +vfio_attach_pasid_table(struct vfio_iommu *iommu,
    + struct vfio_iommu_type1_attach_pasid_table *ustruct)
    +{
    + struct vfio_domain *d;
    + int ret = 0;
    +
    + mutex_lock(&iommu->lock);
    +
    + list_for_each_entry(d, &iommu->domain_list, next) {
    + ret = iommu_attach_pasid_table(d->domain, &ustruct->config);
    + if (ret)
    + goto unwind;
    + }
    + goto unlock;
    +unwind:
    + list_for_each_entry_continue_reverse(d, &iommu->domain_list, next) {
    + iommu_detach_pasid_table(d->domain);
    + }
    +unlock:
    + mutex_unlock(&iommu->lock);
    + return ret;
    +}
    +
    static long vfio_iommu_type1_ioctl(void *iommu_data,
    unsigned int cmd, unsigned long arg)
    {
    @@ -1828,6 +1865,22 @@ static long vfio_iommu_type1_ioctl(void *iommu_data,

    return copy_to_user((void __user *)arg, &unmap, minsz) ?
    -EFAULT : 0;
    + } else if (cmd == VFIO_IOMMU_ATTACH_PASID_TABLE) {
    + struct vfio_iommu_type1_attach_pasid_table ustruct;
    +
    + minsz = offsetofend(struct vfio_iommu_type1_attach_pasid_table,
    + config);
    +
    + if (copy_from_user(&ustruct, (void __user *)arg, minsz))
    + return -EFAULT;
    +
    + if (ustruct.argsz < minsz || ustruct.flags)
    + return -EINVAL;
    +
    + return vfio_attach_pasid_table(iommu, &ustruct);
    + } else if (cmd == VFIO_IOMMU_DETACH_PASID_TABLE) {
    + vfio_detach_pasid_table(iommu);
    + return 0;
    }

    return -ENOTTY;
    diff --git a/include/uapi/linux/vfio.h b/include/uapi/linux/vfio.h
    index 8f10748dac79..4316dd8cb5b5 100644
    --- a/include/uapi/linux/vfio.h
    +++ b/include/uapi/linux/vfio.h
    @@ -14,6 +14,7 @@

    #include <linux/types.h>
    #include <linux/ioctl.h>
    +#include <linux/iommu.h>

    #define VFIO_API_VERSION 0

    @@ -763,6 +764,27 @@ struct vfio_iommu_type1_dma_unmap {
    #define VFIO_IOMMU_ENABLE _IO(VFIO_TYPE, VFIO_BASE + 15)
    #define VFIO_IOMMU_DISABLE _IO(VFIO_TYPE, VFIO_BASE + 16)

    +/**
    + * VFIO_IOMMU_ATTACH_PASID_TABLE - _IOWR(VFIO_TYPE, VFIO_BASE + 22,
    + * struct vfio_iommu_type1_attach_pasid_table)
    + *
    + * Passes the PASID table to the host. Calling ATTACH_PASID_TABLE
    + * while a table is already installed is allowed: it replaces the old
    + * table. DETACH does a comprehensive tear down of the nested mode.
    + */
    +struct vfio_iommu_type1_attach_pasid_table {
    + __u32 argsz;
    + __u32 flags;
    + struct iommu_pasid_table_config config;
    +};
    +#define VFIO_IOMMU_ATTACH_PASID_TABLE _IO(VFIO_TYPE, VFIO_BASE + 22)
    +
    +/**
    + * VFIO_IOMMU_DETACH_PASID_TABLE - - _IOWR(VFIO_TYPE, VFIO_BASE + 23)
    + * Detaches the PASID table
    + */
    +#define VFIO_IOMMU_DETACH_PASID_TABLE _IO(VFIO_TYPE, VFIO_BASE + 23)
    +
    /* -------- Additional API for SPAPR TCE (Server POWERPC) IOMMU -------- */

    /*
    --
    2.20.1
    \
     
     \ /
      Last update: 2019-05-26 18:12    [W:4.116 / U:0.140 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site