A table group might not have a table but it always has the default 32bit
window parameters so use these.

No change in behavior is expected.

Signed-off-by: Alexey Kardashevskiy <a...@ozlabs.ru>
---
Changes:
v9:
* new in the series - to make the next patch simpler
---
 drivers/vfio/vfio_iommu_spapr_tce.c | 19 +++++++++++--------
 1 file changed, 11 insertions(+), 8 deletions(-)

diff --git a/drivers/vfio/vfio_iommu_spapr_tce.c 
b/drivers/vfio/vfio_iommu_spapr_tce.c
index 4cfc2c1..a7d6729 100644
--- a/drivers/vfio/vfio_iommu_spapr_tce.c
+++ b/drivers/vfio/vfio_iommu_spapr_tce.c
@@ -185,7 +185,6 @@ static int tce_iommu_enable(struct tce_container *container)
 {
        int ret = 0;
        unsigned long locked;
-       struct iommu_table *tbl;
        struct iommu_table_group *table_group;
 
        if (!container->grp)
@@ -221,13 +220,19 @@ static int tce_iommu_enable(struct tce_container 
*container)
         * this is that we cannot tell here the amount of RAM used by the guest
         * as this information is only available from KVM and VFIO is
         * KVM agnostic.
+        *
+        * So we do not allow enabling a container without a group attached
+        * as there is no way to know how much we should increment
+        * the locked_vm counter.
         */
        table_group = iommu_group_get_iommudata(container->grp);
        if (!table_group)
                return -ENODEV;
 
-       tbl = &table_group->tables[0];
-       locked = (tbl->it_size << tbl->it_page_shift) >> PAGE_SHIFT;
+       if (!table_group->tce32_size)
+               return -EPERM;
+
+       locked = table_group->tce32_size >> PAGE_SHIFT;
        ret = try_increment_locked_vm(locked);
        if (ret)
                return ret;
@@ -504,7 +509,6 @@ static long tce_iommu_ioctl(void *iommu_data,
 
        case VFIO_IOMMU_SPAPR_TCE_GET_INFO: {
                struct vfio_iommu_spapr_tce_info info;
-               struct iommu_table *tbl;
                struct iommu_table_group *table_group;
 
                if (WARN_ON(!container->grp))
@@ -512,8 +516,7 @@ static long tce_iommu_ioctl(void *iommu_data,
 
                table_group = iommu_group_get_iommudata(container->grp);
 
-               tbl = &table_group->tables[0];
-               if (WARN_ON_ONCE(!tbl))
+               if (!table_group)
                        return -ENXIO;
 
                minsz = offsetofend(struct vfio_iommu_spapr_tce_info,
@@ -525,8 +528,8 @@ static long tce_iommu_ioctl(void *iommu_data,
                if (info.argsz < minsz)
                        return -EINVAL;
 
-               info.dma32_window_start = tbl->it_offset << tbl->it_page_shift;
-               info.dma32_window_size = tbl->it_size << tbl->it_page_shift;
+               info.dma32_window_start = table_group->tce32_start;
+               info.dma32_window_size = table_group->tce32_size;
                info.flags = 0;
 
                if (copy_to_user((void __user *)arg, &info, minsz))
-- 
2.0.0

_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Reply via email to