This patch refactors the vfio_iommu_type1_ioctl() to use switch instead of
if-else, and each cmd got a helper function.

Cc: Kevin Tian <kevin.t...@intel.com>
CC: Jacob Pan <jacob.jun....@linux.intel.com>
Cc: Alex Williamson <alex.william...@redhat.com>
Cc: Eric Auger <eric.au...@redhat.com>
Cc: Jean-Philippe Brucker <jean-phili...@linaro.org>
Cc: Joerg Roedel <j...@8bytes.org>
Cc: Lu Baolu <baolu...@linux.intel.com>
Suggested-by: Christoph Hellwig <h...@infradead.org>
Signed-off-by: Liu Yi L <yi.l....@intel.com>
---
 drivers/vfio/vfio_iommu_type1.c | 183 +++++++++++++++++++++++-----------------
 1 file changed, 105 insertions(+), 78 deletions(-)

diff --git a/drivers/vfio/vfio_iommu_type1.c b/drivers/vfio/vfio_iommu_type1.c
index cc1d647..402aad3 100644
--- a/drivers/vfio/vfio_iommu_type1.c
+++ b/drivers/vfio/vfio_iommu_type1.c
@@ -2106,6 +2106,23 @@ static int vfio_domains_have_iommu_cache(struct 
vfio_iommu *iommu)
        return ret;
 }
 
+static int vfio_iommu_type1_check_extension(struct vfio_iommu *iommu,
+                                           unsigned long arg)
+{
+       switch (arg) {
+       case VFIO_TYPE1_IOMMU:
+       case VFIO_TYPE1v2_IOMMU:
+       case VFIO_TYPE1_NESTING_IOMMU:
+               return 1;
+       case VFIO_DMA_CC_IOMMU:
+               if (!iommu)
+                       return 0;
+               return vfio_domains_have_iommu_cache(iommu);
+       default:
+               return 0;
+       }
+}
+
 static int vfio_iommu_iova_add_cap(struct vfio_info_cap *caps,
                 struct vfio_iommu_type1_info_cap_iova_range *cap_iovas,
                 size_t size)
@@ -2173,110 +2190,120 @@ static int vfio_iommu_iova_build_caps(struct 
vfio_iommu *iommu,
        return ret;
 }
 
-static long vfio_iommu_type1_ioctl(void *iommu_data,
-                                  unsigned int cmd, unsigned long arg)
+static int vfio_iommu_type1_get_info(struct vfio_iommu *iommu,
+                                    unsigned long arg)
 {
-       struct vfio_iommu *iommu = iommu_data;
+       struct vfio_iommu_type1_info info;
        unsigned long minsz;
+       struct vfio_info_cap caps = { .buf = NULL, .size = 0 };
+       unsigned long capsz;
+       int ret;
 
-       if (cmd == VFIO_CHECK_EXTENSION) {
-               switch (arg) {
-               case VFIO_TYPE1_IOMMU:
-               case VFIO_TYPE1v2_IOMMU:
-               case VFIO_TYPE1_NESTING_IOMMU:
-                       return 1;
-               case VFIO_DMA_CC_IOMMU:
-                       if (!iommu)
-                               return 0;
-                       return vfio_domains_have_iommu_cache(iommu);
-               default:
-                       return 0;
-               }
-       } else if (cmd == VFIO_IOMMU_GET_INFO) {
-               struct vfio_iommu_type1_info info;
-               struct vfio_info_cap caps = { .buf = NULL, .size = 0 };
-               unsigned long capsz;
-               int ret;
-
-               minsz = offsetofend(struct vfio_iommu_type1_info, iova_pgsizes);
+       minsz = offsetofend(struct vfio_iommu_type1_info, iova_pgsizes);
 
-               /* For backward compatibility, cannot require this */
-               capsz = offsetofend(struct vfio_iommu_type1_info, cap_offset);
+       /* For backward compatibility, cannot require this */
+       capsz = offsetofend(struct vfio_iommu_type1_info, cap_offset);
 
-               if (copy_from_user(&info, (void __user *)arg, minsz))
-                       return -EFAULT;
+       if (copy_from_user(&info, (void __user *)arg, minsz))
+               return -EFAULT;
 
-               if (info.argsz < minsz)
-                       return -EINVAL;
+       if (info.argsz < minsz)
+               return -EINVAL;
 
-               if (info.argsz >= capsz) {
-                       minsz = capsz;
-                       info.cap_offset = 0; /* output, no-recopy necessary */
-               }
+       if (info.argsz >= capsz) {
+               minsz = capsz;
+               info.cap_offset = 0; /* output, no-recopy necessary */
+       }
 
-               info.flags = VFIO_IOMMU_INFO_PGSIZES;
+       info.flags = VFIO_IOMMU_INFO_PGSIZES;
 
-               info.iova_pgsizes = vfio_pgsize_bitmap(iommu);
+       info.iova_pgsizes = vfio_pgsize_bitmap(iommu);
 
-               ret = vfio_iommu_iova_build_caps(iommu, &caps);
-               if (ret)
-                       return ret;
+       ret = vfio_iommu_iova_build_caps(iommu, &caps);
+       if (ret)
+               return ret;
 
-               if (caps.size) {
-                       info.flags |= VFIO_IOMMU_INFO_CAPS;
+       if (caps.size) {
+               info.flags |= VFIO_IOMMU_INFO_CAPS;
 
-                       if (info.argsz < sizeof(info) + caps.size) {
-                               info.argsz = sizeof(info) + caps.size;
-                       } else {
-                               vfio_info_cap_shift(&caps, sizeof(info));
-                               if (copy_to_user((void __user *)arg +
-                                               sizeof(info), caps.buf,
-                                               caps.size)) {
-                                       kfree(caps.buf);
-                                       return -EFAULT;
-                               }
-                               info.cap_offset = sizeof(info);
+               if (info.argsz < sizeof(info) + caps.size) {
+                       info.argsz = sizeof(info) + caps.size;
+               } else {
+                       vfio_info_cap_shift(&caps, sizeof(info));
+                       if (copy_to_user((void __user *)arg +
+                                       sizeof(info), caps.buf,
+                                       caps.size)) {
+                               kfree(caps.buf);
+                               return -EFAULT;
                        }
-
-                       kfree(caps.buf);
+                       info.cap_offset = sizeof(info);
                }
 
-               return copy_to_user((void __user *)arg, &info, minsz) ?
-                       -EFAULT : 0;
+               kfree(caps.buf);
+       }
 
-       } else if (cmd == VFIO_IOMMU_MAP_DMA) {
-               struct vfio_iommu_type1_dma_map map;
-               uint32_t mask = VFIO_DMA_MAP_FLAG_READ |
-                               VFIO_DMA_MAP_FLAG_WRITE;
+       return copy_to_user((void __user *)arg, &info, minsz) ?
+               -EFAULT : 0;
 
-               minsz = offsetofend(struct vfio_iommu_type1_dma_map, size);
+}
 
-               if (copy_from_user(&map, (void __user *)arg, minsz))
-                       return -EFAULT;
+static int vfio_iommu_type1_map_dma(struct vfio_iommu *iommu,
+                                   unsigned long arg)
+{
+       struct vfio_iommu_type1_dma_map map;
+       unsigned long minsz;
+       uint32_t mask = VFIO_DMA_MAP_FLAG_READ |
+                       VFIO_DMA_MAP_FLAG_WRITE;
 
-               if (map.argsz < minsz || map.flags & ~mask)
-                       return -EINVAL;
+       minsz = offsetofend(struct vfio_iommu_type1_dma_map, size);
 
-               return vfio_dma_do_map(iommu, &map);
+       if (copy_from_user(&map, (void __user *)arg, minsz))
+               return -EFAULT;
 
-       } else if (cmd == VFIO_IOMMU_UNMAP_DMA) {
-               struct vfio_iommu_type1_dma_unmap unmap;
-               long ret;
+       if (map.argsz < minsz || map.flags & ~mask)
+               return -EINVAL;
 
-               minsz = offsetofend(struct vfio_iommu_type1_dma_unmap, size);
+       return vfio_dma_do_map(iommu, &map);
+}
 
-               if (copy_from_user(&unmap, (void __user *)arg, minsz))
-                       return -EFAULT;
+static int vfio_iommu_type1_unmap_dma(struct vfio_iommu *iommu,
+                                   unsigned long arg)
+{
+       struct vfio_iommu_type1_dma_unmap unmap;
+       unsigned long minsz;
+       long ret;
 
-               if (unmap.argsz < minsz || unmap.flags)
-                       return -EINVAL;
+       minsz = offsetofend(struct vfio_iommu_type1_dma_unmap, size);
 
-               ret = vfio_dma_do_unmap(iommu, &unmap);
-               if (ret)
-                       return ret;
+       if (copy_from_user(&unmap, (void __user *)arg, minsz))
+               return -EFAULT;
+
+       if (unmap.argsz < minsz || unmap.flags)
+               return -EINVAL;
+
+       ret = vfio_dma_do_unmap(iommu, &unmap);
+       if (ret)
+               return ret;
+
+       return copy_to_user((void __user *)arg, &unmap, minsz) ?
+               -EFAULT : 0;
+
+}
+
+static long vfio_iommu_type1_ioctl(void *iommu_data,
+                                  unsigned int cmd, unsigned long arg)
+{
+       struct vfio_iommu *iommu = iommu_data;
 
-               return copy_to_user((void __user *)arg, &unmap, minsz) ?
-                       -EFAULT : 0;
+       switch (cmd) {
+       case VFIO_CHECK_EXTENSION:
+               return vfio_iommu_type1_check_extension(iommu, arg);
+       case VFIO_IOMMU_GET_INFO:
+               return vfio_iommu_type1_get_info(iommu, arg);
+       case VFIO_IOMMU_MAP_DMA:
+               return vfio_iommu_type1_map_dma(iommu, arg);
+       case VFIO_IOMMU_UNMAP_DMA:
+               return vfio_iommu_type1_unmap_dma(iommu, arg);
        }
 
        return -ENOTTY;
-- 
2.7.4

Reply via email to