[PATCH v2 2/2] pci/iov: fix kobject_uevent() ordering in sriov_enable()

Jim Harris posted 2 patches 2 years ago
There is a newer version of this series
[PATCH v2 2/2] pci/iov: fix kobject_uevent() ordering in sriov_enable()
Posted by Jim Harris 2 years ago
Wait to call kobject_uevent() until all of the associated changes are done,
including updating the num_VFs value. This avoids any possibility of
userspace responding to the event and getting a stale value (although
probably impossible to actually happen).

Suggested-by: Leon Romanovsky <leonro@nvidia.com>
Reviewed-by: Leon Romanovsky <leonro@nvidia.com>
Signed-off-by: Jim Harris <jim.harris@samsung.com>
---
 drivers/pci/iov.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c
index 0ca20cd518d5..c00b0f822526 100644
--- a/drivers/pci/iov.c
+++ b/drivers/pci/iov.c
@@ -677,8 +677,8 @@ static int sriov_enable(struct pci_dev *dev, int nr_virtfn)
 	if (rc)
 		goto err_pcibios;
 
-	kobject_uevent(&dev->dev.kobj, KOBJ_CHANGE);
 	iov->num_VFs = nr_virtfn;
+	kobject_uevent(&dev->dev.kobj, KOBJ_CHANGE);
 
 	return 0;
 

Re: [PATCH v2 2/2] pci/iov: fix kobject_uevent() ordering in sriov_enable()
Posted by Kuppuswamy Sathyanarayanan 2 years ago
On 2/9/24 3:52 PM, Jim Harris wrote:
> Wait to call kobject_uevent() until all of the associated changes are done,
> including updating the num_VFs value. This avoids any possibility of
> userspace responding to the event and getting a stale value (although
> probably impossible to actually happen).
>
> Suggested-by: Leon Romanovsky <leonro@nvidia.com>
> Reviewed-by: Leon Romanovsky <leonro@nvidia.com>
> Signed-off-by: Jim Harris <jim.harris@samsung.com>
> ---

It looks fine to me.

Reviewed-by: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>

>  drivers/pci/iov.c |    2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c
> index 0ca20cd518d5..c00b0f822526 100644
> --- a/drivers/pci/iov.c
> +++ b/drivers/pci/iov.c
> @@ -677,8 +677,8 @@ static int sriov_enable(struct pci_dev *dev, int nr_virtfn)
>  	if (rc)
>  		goto err_pcibios;
>  
> -	kobject_uevent(&dev->dev.kobj, KOBJ_CHANGE);
>  	iov->num_VFs = nr_virtfn;
> +	kobject_uevent(&dev->dev.kobj, KOBJ_CHANGE);
>  
>  	return 0;
>  
>
-- 
Sathyanarayanan Kuppuswamy
Linux Kernel Developer
Re: [PATCH v2 2/2] pci/iov: fix kobject_uevent() ordering in sriov_enable()
Posted by Keith Busch 1 year, 12 months ago
On Fri, Feb 09, 2024 at 07:22:17PM -0800, Kuppuswamy Sathyanarayanan wrote:
> On 2/9/24 3:52 PM, Jim Harris wrote:
> > @@ -677,8 +677,8 @@ static int sriov_enable(struct pci_dev *dev, int nr_virtfn)
> >  	if (rc)
> >  		goto err_pcibios;
> >  
> > -	kobject_uevent(&dev->dev.kobj, KOBJ_CHANGE);
> >  	iov->num_VFs = nr_virtfn;
> > +	kobject_uevent(&dev->dev.kobj, KOBJ_CHANGE);

Since it's accessed unlocked now, I *think* this wants appropriate
barriers to ensure the order is observed the same on all CPUs. Something
like 'smp_store_release(&iov->num_VFs, nr_virtfn)' for writing it, and
use 'smp_load_acquire()' on the read-side.
Re: [PATCH v2 2/2] pci/iov: fix kobject_uevent() ordering in sriov_enable()
Posted by Leon Romanovsky 1 year, 12 months ago
On Mon, Feb 12, 2024 at 08:17:58AM -0700, Keith Busch wrote:
> On Fri, Feb 09, 2024 at 07:22:17PM -0800, Kuppuswamy Sathyanarayanan wrote:
> > On 2/9/24 3:52 PM, Jim Harris wrote:
> > > @@ -677,8 +677,8 @@ static int sriov_enable(struct pci_dev *dev, int nr_virtfn)
> > >  	if (rc)
> > >  		goto err_pcibios;
> > >  
> > > -	kobject_uevent(&dev->dev.kobj, KOBJ_CHANGE);
> > >  	iov->num_VFs = nr_virtfn;
> > > +	kobject_uevent(&dev->dev.kobj, KOBJ_CHANGE);
> 
> Since it's accessed unlocked now, I *think* this wants appropriate
> barriers to ensure the order is observed the same on all CPUs. Something
> like 'smp_store_release(&iov->num_VFs, nr_virtfn)' for writing it, and
> use 'smp_load_acquire()' on the read-side.

It is unlocked only for sysfs read. IMHO it is overkill to use stores
for this case.

Thanks

>