Message ID | 1429964096-11524-31-git-send-email-aik@ozlabs.ru (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Benjamin Herrenschmidt |
Headers | show |
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))
On Sat, Apr 25, 2015 at 10:14:54PM +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> It would be easier to review if you took this and the parts of the earlier patch which add the tce32_* fields to table_group and roll them up on their own.
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))
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(-)