Re: [PATCH kernel v9 30/32] vfio: powerpc/spapr: Use 32bit DMA window properties from table_group

Alex Williamson
2015-04-27T22:18:27Z

On Sat, 2015-04-25 at 22:14 +1000, Alexey Kardashevskiy wrote:
> 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 <aik@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(-)

Acked-by: Alex Williamson <alex.williamson@redhat.com>

> 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))