Re: [PATCH v4 8/8] iommu/vt-d: Misc macro clean up for SVM

2019-12-02 Thread Jacob Pan
On Mon, 02 Dec 2019 10:22:13 -0800
Joe Perches  wrote:

> On Mon, 2019-12-02 at 10:15 -0800, Jacob Pan wrote:
> > On Thu, 21 Nov 2019 13:37:10 -0800
> > Joe Perches  wrote:
> >   
> > > On Thu, 2019-11-21 at 13:26 -0800, Jacob Pan wrote:  
> > > > Use combined macros for_each_svm_dev() to simplify SVM device
> > > > iteration and error checking.
> > > []  
> > > > diff --git a/drivers/iommu/intel-svm.c
> > > > b/drivers/iommu/intel-svm.c
> > > []  
> > > > +#define for_each_svm_dev(sdev, svm, d) \
> > > > +   list_for_each_entry((sdev), &(svm)->devs, list)
> > > > \
> > > > +   if ((d) != (sdev)->dev) {} else
> > > > +
> > > >  int intel_svm_bind_mm(struct device *dev, int *pasid, int
> > > > flags, struct svm_dev_ops *ops) {
> > > > struct intel_iommu *iommu =
> > > > intel_svm_device_to_iommu(dev); @@ -274,15 +278,13 @@ int
> > > > intel_svm_bind_mm(struct device *dev, int *pasid, int flags,
> > > > struct svm_dev_ goto out; }
> > > >  
> > > > -   list_for_each_entry(sdev, >devs,
> > > > list) {
> > > > -   if (dev == sdev->dev) {
> > > > -   if (sdev->ops != ops) {
> > > > -   ret = -EBUSY;
> > > > -   goto out;
> > > > -   }
> > > > -   sdev->users++;
> > > > -   goto success;
> > > > +   for_each_svm_dev(sdev, svm, dev) {
> > > > +   if (sdev->ops != ops) {
> > > > +   ret = -EBUSY;
> > > > +   goto out;
> > > > }
> > > > +   sdev->users++;
> > > > +   goto success;
> > > > }
> > > 
> > > I think this does not read better as this is now a
> > > for_each loop that exits the loop on the first match.
> > >   
> > I think one of the benefits is reduced indentation. What do you
> > recommend?  
> 
> Making the code intelligible for a reader.
> 
> At least add a comment describing why there is only
> a single possible match.
> 
> Given the for_each name, it's odd code that only the
> first match has an action.
> 
I will add a comment to explain we are trying to find the matching
device on the list.

Thanks
___
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu


Re: [PATCH v4 8/8] iommu/vt-d: Misc macro clean up for SVM

2019-12-02 Thread Joe Perches
On Mon, 2019-12-02 at 10:15 -0800, Jacob Pan wrote:
> On Thu, 21 Nov 2019 13:37:10 -0800
> Joe Perches  wrote:
> 
> > On Thu, 2019-11-21 at 13:26 -0800, Jacob Pan wrote:
> > > Use combined macros for_each_svm_dev() to simplify SVM device
> > > iteration and error checking.  
> > []
> > > diff --git a/drivers/iommu/intel-svm.c b/drivers/iommu/intel-svm.c  
> > []
> > > +#define for_each_svm_dev(sdev, svm, d)   \
> > > + list_for_each_entry((sdev), &(svm)->devs, list) \
> > > + if ((d) != (sdev)->dev) {} else
> > > +
> > >  int intel_svm_bind_mm(struct device *dev, int *pasid, int flags,
> > > struct svm_dev_ops *ops) {
> > >   struct intel_iommu *iommu = intel_svm_device_to_iommu(dev);
> > > @@ -274,15 +278,13 @@ int intel_svm_bind_mm(struct device *dev, int
> > > *pasid, int flags, struct svm_dev_ goto out;
> > >   }
> > >  
> > > - list_for_each_entry(sdev, >devs,
> > > list) {
> > > - if (dev == sdev->dev) {
> > > - if (sdev->ops != ops) {
> > > - ret = -EBUSY;
> > > - goto out;
> > > - }
> > > - sdev->users++;
> > > - goto success;
> > > + for_each_svm_dev(sdev, svm, dev) {
> > > + if (sdev->ops != ops) {
> > > + ret = -EBUSY;
> > > + goto out;
> > >   }
> > > + sdev->users++;
> > > + goto success;
> > >   }  
> > 
> > I think this does not read better as this is now a
> > for_each loop that exits the loop on the first match.
> > 
> I think one of the benefits is reduced indentation. What do you
> recommend?

Making the code intelligible for a reader.

At least add a comment describing why there is only
a single possible match.

Given the for_each name, it's odd code that only the
first match has an action.


___
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu


Re: [PATCH v4 8/8] iommu/vt-d: Misc macro clean up for SVM

2019-12-02 Thread Jacob Pan
On Thu, 21 Nov 2019 13:37:10 -0800
Joe Perches  wrote:

> On Thu, 2019-11-21 at 13:26 -0800, Jacob Pan wrote:
> > Use combined macros for_each_svm_dev() to simplify SVM device
> > iteration and error checking.  
> []
> > diff --git a/drivers/iommu/intel-svm.c b/drivers/iommu/intel-svm.c  
> []
> > +#define for_each_svm_dev(sdev, svm, d) \
> > +   list_for_each_entry((sdev), &(svm)->devs, list) \
> > +   if ((d) != (sdev)->dev) {} else
> > +
> >  int intel_svm_bind_mm(struct device *dev, int *pasid, int flags,
> > struct svm_dev_ops *ops) {
> > struct intel_iommu *iommu = intel_svm_device_to_iommu(dev);
> > @@ -274,15 +278,13 @@ int intel_svm_bind_mm(struct device *dev, int
> > *pasid, int flags, struct svm_dev_ goto out;
> > }
> >  
> > -   list_for_each_entry(sdev, >devs,
> > list) {
> > -   if (dev == sdev->dev) {
> > -   if (sdev->ops != ops) {
> > -   ret = -EBUSY;
> > -   goto out;
> > -   }
> > -   sdev->users++;
> > -   goto success;
> > +   for_each_svm_dev(sdev, svm, dev) {
> > +   if (sdev->ops != ops) {
> > +   ret = -EBUSY;
> > +   goto out;
> > }
> > +   sdev->users++;
> > +   goto success;
> > }  
> 
> I think this does not read better as this is now a
> for_each loop that exits the loop on the first match.
> 
I think one of the benefits is reduced indentation. What do you
recommend?

> >  
> > break;
> > @@ -427,43 +429,36 @@ int intel_svm_unbind_mm(struct device *dev,
> > int pasid) goto out;
> > }
> >  
> > -   if (!svm)
> > -   goto out;
> > -
> > -   list_for_each_entry(sdev, >devs, list) {  
> []
> > +   for_each_svm_dev(sdev, svm, dev) {  
> 
> I think this should not remove the !svm test above.
> 
Yeah, !svm test should have been part of 6/8. I will fix that.

Thanks,

Jacob 
> 

[Jacob Pan]
___
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu


Re: [PATCH v4 8/8] iommu/vt-d: Misc macro clean up for SVM

2019-11-21 Thread Joe Perches
On Thu, 2019-11-21 at 13:26 -0800, Jacob Pan wrote:
> Use combined macros for_each_svm_dev() to simplify SVM device iteration
> and error checking.
[]
> diff --git a/drivers/iommu/intel-svm.c b/drivers/iommu/intel-svm.c
[]
> +#define for_each_svm_dev(sdev, svm, d)   \
> + list_for_each_entry((sdev), &(svm)->devs, list) \
> + if ((d) != (sdev)->dev) {} else
> +
>  int intel_svm_bind_mm(struct device *dev, int *pasid, int flags, struct 
> svm_dev_ops *ops)
>  {
>   struct intel_iommu *iommu = intel_svm_device_to_iommu(dev);
> @@ -274,15 +278,13 @@ int intel_svm_bind_mm(struct device *dev, int *pasid, 
> int flags, struct svm_dev_
>   goto out;
>   }
>  
> - list_for_each_entry(sdev, >devs, list) {
> - if (dev == sdev->dev) {
> - if (sdev->ops != ops) {
> - ret = -EBUSY;
> - goto out;
> - }
> - sdev->users++;
> - goto success;
> + for_each_svm_dev(sdev, svm, dev) {
> + if (sdev->ops != ops) {
> + ret = -EBUSY;
> + goto out;
>   }
> + sdev->users++;
> + goto success;
>   }

I think this does not read better as this is now a
for_each loop that exits the loop on the first match.

>  
>   break;
> @@ -427,43 +429,36 @@ int intel_svm_unbind_mm(struct device *dev, int pasid)
>   goto out;
>   }
>  
> - if (!svm)
> - goto out;
> -
> - list_for_each_entry(sdev, >devs, list) {
[]
> + for_each_svm_dev(sdev, svm, dev) {

I think this should not remove the !svm test above.


___
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu


[PATCH v4 8/8] iommu/vt-d: Misc macro clean up for SVM

2019-11-21 Thread Jacob Pan
Use combined macros for_each_svm_dev() to simplify SVM device iteration
and error checking.

Suggested-by: Andy Shevchenko 
Signed-off-by: Jacob Pan 
Reviewed-by: Eric Auger 
Acked-by: Lu Baolu 
---
 drivers/iommu/intel-svm.c | 81 ++-
 1 file changed, 38 insertions(+), 43 deletions(-)

diff --git a/drivers/iommu/intel-svm.c b/drivers/iommu/intel-svm.c
index 4eecc24412dc..5b4224871e34 100644
--- a/drivers/iommu/intel-svm.c
+++ b/drivers/iommu/intel-svm.c
@@ -226,6 +226,10 @@ static const struct mmu_notifier_ops intel_mmuops = {
 static DEFINE_MUTEX(pasid_mutex);
 static LIST_HEAD(global_svm_list);
 
+#define for_each_svm_dev(sdev, svm, d) \
+   list_for_each_entry((sdev), &(svm)->devs, list) \
+   if ((d) != (sdev)->dev) {} else
+
 int intel_svm_bind_mm(struct device *dev, int *pasid, int flags, struct 
svm_dev_ops *ops)
 {
struct intel_iommu *iommu = intel_svm_device_to_iommu(dev);
@@ -274,15 +278,13 @@ int intel_svm_bind_mm(struct device *dev, int *pasid, int 
flags, struct svm_dev_
goto out;
}
 
-   list_for_each_entry(sdev, >devs, list) {
-   if (dev == sdev->dev) {
-   if (sdev->ops != ops) {
-   ret = -EBUSY;
-   goto out;
-   }
-   sdev->users++;
-   goto success;
+   for_each_svm_dev(sdev, svm, dev) {
+   if (sdev->ops != ops) {
+   ret = -EBUSY;
+   goto out;
}
+   sdev->users++;
+   goto success;
}
 
break;
@@ -427,43 +429,36 @@ int intel_svm_unbind_mm(struct device *dev, int pasid)
goto out;
}
 
-   if (!svm)
-   goto out;
-
-   list_for_each_entry(sdev, >devs, list) {
-   if (dev == sdev->dev) {
-   ret = 0;
-   sdev->users--;
-   if (!sdev->users) {
-   list_del_rcu(>list);
-   /* Flush the PASID cache and IOTLB for this 
device.
-* Note that we do depend on the hardware *not* 
using
-* the PASID any more. Just as we depend on 
other
-* devices never using PASIDs that they have no 
right
-* to use. We have a *shared* PASID table, 
because it's
-* large and has to be physically contiguous. 
So it's
-* hard to be as defensive as we might like. */
-   intel_pasid_tear_down_entry(iommu, dev, 
svm->pasid);
-   intel_flush_svm_range_dev(svm, sdev, 0, -1, 0);
-   kfree_rcu(sdev, rcu);
-
-   if (list_empty(>devs)) {
-   ioasid_free(svm->pasid);
-   if (svm->mm)
-   
mmu_notifier_unregister(>notifier, svm->mm);
-
-   list_del(>list);
-
-   /* We mandate that no page faults may 
be outstanding
-* for the PASID when 
intel_svm_unbind_mm() is called.
-* If that is not obeyed, subtle errors 
will happen.
-* Let's make them less subtle... */
-   memset(svm, 0x6b, sizeof(*svm));
-   kfree(svm);
-   }
+   for_each_svm_dev(sdev, svm, dev) {
+   ret = 0;
+   sdev->users--;
+   if (!sdev->users) {
+   list_del_rcu(>list);
+   /* Flush the PASID cache and IOTLB for this device.
+* Note that we do depend on the hardware *not* using
+* the PASID any more. Just as we depend on other
+* devices never using PASIDs that they have no right
+* to use. We have a *shared* PASID table, because it's
+* large and has to be physically contiguous. So it's
+* hard to be as defensive as we might like. */
+   intel_pasid_tear_down_entry(iommu, dev, svm->pasid);
+   intel_flush_svm_range_dev(svm, sdev, 0, -1, 0);
+