2013-05-30 05:46:03

by Hao, Xudong

[permalink] [raw]
Subject: [PATCH] PCI: set correct value for iov device before device

Since device registering is put into pci_device_add(), it must set value of
Virtual Function device's member before the pci_dev is put to device tree. Or
some relevant subsystem of driver model such as xen will report a incorrect
IOV device to Xen hypervior.

Signed-off-by: Xudong Hao <[email protected]>
---
drivers/pci/iov.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c
index c93071d..43d3de9 100644
--- a/drivers/pci/iov.c
+++ b/drivers/pci/iov.c
@@ -110,12 +110,12 @@ static int virtfn_add(struct pci_dev *dev, int id, int reset)
if (reset)
__pci_reset_function(virtfn);

- pci_device_add(virtfn, virtfn->bus);
- mutex_unlock(&iov->dev->sriov->lock);
-
virtfn->physfn = pci_dev_get(dev);
virtfn->is_virtfn = 1;

+ pci_device_add(virtfn, virtfn->bus);
+ mutex_unlock(&iov->dev->sriov->lock);
+
rc = pci_bus_add_device(virtfn);
sprintf(buf, "virtfn%u", id);
rc = sysfs_create_link(&dev->dev.kobj, &virtfn->dev.kobj, buf);
--
1.7.12.1


2013-05-30 06:04:43

by Yijing Wang

[permalink] [raw]
Subject: Re: [PATCH] PCI: set correct value for iov device before device

Hi Xudong,
This bug has been fixed by Jiang Liu in patch
https://patchwork.kernel.org/patch/2613481/


On 2013/5/30 13:45, Xudong Hao wrote:
> Since device registering is put into pci_device_add(), it must set value of
> Virtual Function device's member before the pci_dev is put to device tree. Or
> some relevant subsystem of driver model such as xen will report a incorrect
> IOV device to Xen hypervior.
>
> Signed-off-by: Xudong Hao <[email protected]>
> ---
> drivers/pci/iov.c | 6 +++---
> 1 file changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c
> index c93071d..43d3de9 100644
> --- a/drivers/pci/iov.c
> +++ b/drivers/pci/iov.c
> @@ -110,12 +110,12 @@ static int virtfn_add(struct pci_dev *dev, int id, int reset)
> if (reset)
> __pci_reset_function(virtfn);
>
> - pci_device_add(virtfn, virtfn->bus);
> - mutex_unlock(&iov->dev->sriov->lock);
> -
> virtfn->physfn = pci_dev_get(dev);
> virtfn->is_virtfn = 1;
>
> + pci_device_add(virtfn, virtfn->bus);
> + mutex_unlock(&iov->dev->sriov->lock);
> +
> rc = pci_bus_add_device(virtfn);
> sprintf(buf, "virtfn%u", id);
> rc = sysfs_create_link(&dev->dev.kobj, &virtfn->dev.kobj, buf);
>


--
Thanks!
Yijing

2013-05-30 06:05:07

by Yinghai Lu

[permalink] [raw]
Subject: Re: [PATCH] PCI: set correct value for iov device before device

On Wed, May 29, 2013 at 10:45 PM, Xudong Hao <[email protected]> wrote:
> Since device registering is put into pci_device_add(), it must set value of
> Virtual Function device's member before the pci_dev is put to device tree. Or
> some relevant subsystem of driver model such as xen will report a incorrect
> IOV device to Xen hypervior.
>
> Signed-off-by: Xudong Hao <[email protected]>
> ---
> drivers/pci/iov.c | 6 +++---
> 1 file changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c
> index c93071d..43d3de9 100644
> --- a/drivers/pci/iov.c
> +++ b/drivers/pci/iov.c
> @@ -110,12 +110,12 @@ static int virtfn_add(struct pci_dev *dev, int id, int reset)
> if (reset)
> __pci_reset_function(virtfn);
>
> - pci_device_add(virtfn, virtfn->bus);
> - mutex_unlock(&iov->dev->sriov->lock);
> -
> virtfn->physfn = pci_dev_get(dev);
> virtfn->is_virtfn = 1;
>
> + pci_device_add(virtfn, virtfn->bus);
> + mutex_unlock(&iov->dev->sriov->lock);
> +
> rc = pci_bus_add_device(virtfn);
> sprintf(buf, "virtfn%u", id);
> rc = sysfs_create_link(&dev->dev.kobj, &virtfn->dev.kobj, buf);

I have similar patch at
https://patchwork.kernel.org/patch/2562551/
[5/7] PCI, ACPI: Don't glue ACPI dev with pci VFs

and Jiang has another one
https://patchwork.kernel.org/patch/2613481/
[v3,part1,10/10] PCI, IOV: hide remove and rescan sysfs interfaces
for SR-IOV virtual functions

Thanks

Yinghai

2013-05-30 06:27:13

by Hao, Xudong

[permalink] [raw]
Subject: RE: [PATCH] PCI: set correct value for iov device before device

Okay, I saw patch in PCI tree two days ago by Jiang Liu.

Thanks,
-Xudong


> -----Original Message-----
> From: [email protected] [mailto:[email protected]] On Behalf Of
> Yinghai Lu
> Sent: Thursday, May 30, 2013 2:05 PM
> To: Hao, Xudong
> Cc: Bjorn Helgaas; [email protected]; Linux Kernel Mailing List
> Subject: Re: [PATCH] PCI: set correct value for iov device before device
>
> On Wed, May 29, 2013 at 10:45 PM, Xudong Hao <[email protected]>
> wrote:
> > Since device registering is put into pci_device_add(), it must set value of
> > Virtual Function device's member before the pci_dev is put to device tree. Or
> > some relevant subsystem of driver model such as xen will report a incorrect
> > IOV device to Xen hypervior.
> >
> > Signed-off-by: Xudong Hao <[email protected]>
> > ---
> > drivers/pci/iov.c | 6 +++---
> > 1 file changed, 3 insertions(+), 3 deletions(-)
> >
> > diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c
> > index c93071d..43d3de9 100644
> > --- a/drivers/pci/iov.c
> > +++ b/drivers/pci/iov.c
> > @@ -110,12 +110,12 @@ static int virtfn_add(struct pci_dev *dev, int id, int
> reset)
> > if (reset)
> > __pci_reset_function(virtfn);
> >
> > - pci_device_add(virtfn, virtfn->bus);
> > - mutex_unlock(&iov->dev->sriov->lock);
> > -
> > virtfn->physfn = pci_dev_get(dev);
> > virtfn->is_virtfn = 1;
> >
> > + pci_device_add(virtfn, virtfn->bus);
> > + mutex_unlock(&iov->dev->sriov->lock);
> > +
> > rc = pci_bus_add_device(virtfn);
> > sprintf(buf, "virtfn%u", id);
> > rc = sysfs_create_link(&dev->dev.kobj, &virtfn->dev.kobj, buf);
>
> I have similar patch at
> https://patchwork.kernel.org/patch/2562551/
> [5/7] PCI, ACPI: Don't glue ACPI dev with pci VFs
>
> and Jiang has another one
> https://patchwork.kernel.org/patch/2613481/
> [v3,part1,10/10] PCI, IOV: hide remove and rescan sysfs interfaces
> for SR-IOV virtual functions
>
> Thanks
>
> Yinghai

2013-05-30 20:27:30

by Yinghai Lu

[permalink] [raw]
Subject: Re: [PATCH] PCI: set correct value for iov device before device

On Wed, May 29, 2013 at 11:04 PM, Yinghai Lu <[email protected]> wrote:
> On Wed, May 29, 2013 at 10:45 PM, Xudong Hao <[email protected]> wrote:
>> Since device registering is put into pci_device_add(), it must set value of
>> Virtual Function device's member before the pci_dev is put to device tree. Or
>> some relevant subsystem of driver model such as xen will report a incorrect
>> IOV device to Xen hypervior.
>>
>> Signed-off-by: Xudong Hao <[email protected]>
>> ---
>> drivers/pci/iov.c | 6 +++---
>> 1 file changed, 3 insertions(+), 3 deletions(-)
>>
>> diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c
>> index c93071d..43d3de9 100644
>> --- a/drivers/pci/iov.c
>> +++ b/drivers/pci/iov.c
>> @@ -110,12 +110,12 @@ static int virtfn_add(struct pci_dev *dev, int id, int reset)
>> if (reset)
>> __pci_reset_function(virtfn);
>>
>> - pci_device_add(virtfn, virtfn->bus);
>> - mutex_unlock(&iov->dev->sriov->lock);
>> -
>> virtfn->physfn = pci_dev_get(dev);
>> virtfn->is_virtfn = 1;
>>
>> + pci_device_add(virtfn, virtfn->bus);
>> + mutex_unlock(&iov->dev->sriov->lock);
>> +
>> rc = pci_bus_add_device(virtfn);
>> sprintf(buf, "virtfn%u", id);
>> rc = sysfs_create_link(&dev->dev.kobj, &virtfn->dev.kobj, buf);
>
> I have similar patch at
> https://patchwork.kernel.org/patch/2562551/
> [5/7] PCI, ACPI: Don't glue ACPI dev with pci VFs
>
> and Jiang has another one
> https://patchwork.kernel.org/patch/2613481/
> [v3,part1,10/10] PCI, IOV: hide remove and rescan sysfs interfaces
> for SR-IOV virtual functions

Bjorn,

I double check this one, we should split the patch from me or Jiang.
and the one about set virtfn=1 should be -stable material.

That will address another problem that is caused by
moving device_add from pci_bus_add_device to pci_device_add.

Yinghai

2013-05-30 23:22:47

by Bjorn Helgaas

[permalink] [raw]
Subject: Re: [PATCH] PCI: set correct value for iov device before device

On Thu, May 30, 2013 at 2:27 PM, Yinghai Lu <[email protected]> wrote:
> On Wed, May 29, 2013 at 11:04 PM, Yinghai Lu <[email protected]> wrote:
>> On Wed, May 29, 2013 at 10:45 PM, Xudong Hao <[email protected]> wrote:
>>> Since device registering is put into pci_device_add(), it must set value of
>>> Virtual Function device's member before the pci_dev is put to device tree. Or
>>> some relevant subsystem of driver model such as xen will report a incorrect
>>> IOV device to Xen hypervior.
>>>
>>> Signed-off-by: Xudong Hao <[email protected]>
>>> ---
>>> drivers/pci/iov.c | 6 +++---
>>> 1 file changed, 3 insertions(+), 3 deletions(-)
>>>
>>> diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c
>>> index c93071d..43d3de9 100644
>>> --- a/drivers/pci/iov.c
>>> +++ b/drivers/pci/iov.c
>>> @@ -110,12 +110,12 @@ static int virtfn_add(struct pci_dev *dev, int id, int reset)
>>> if (reset)
>>> __pci_reset_function(virtfn);
>>>
>>> - pci_device_add(virtfn, virtfn->bus);
>>> - mutex_unlock(&iov->dev->sriov->lock);
>>> -
>>> virtfn->physfn = pci_dev_get(dev);
>>> virtfn->is_virtfn = 1;
>>>
>>> + pci_device_add(virtfn, virtfn->bus);
>>> + mutex_unlock(&iov->dev->sriov->lock);
>>> +
>>> rc = pci_bus_add_device(virtfn);
>>> sprintf(buf, "virtfn%u", id);
>>> rc = sysfs_create_link(&dev->dev.kobj, &virtfn->dev.kobj, buf);
>>
>> I have similar patch at
>> https://patchwork.kernel.org/patch/2562551/
>> [5/7] PCI, ACPI: Don't glue ACPI dev with pci VFs
>>
>> and Jiang has another one
>> https://patchwork.kernel.org/patch/2613481/
>> [v3,part1,10/10] PCI, IOV: hide remove and rescan sysfs interfaces
>> for SR-IOV virtual functions
>
> Bjorn,
>
> I double check this one, we should split the patch from me or Jiang.

I don't know what the sentence above means.

> and the one about set virtfn=1 should be -stable material.

I assume you mean that Jiang's "[v3,part1,10/10] PCI, IOV: hide remove
and rescan sysfs interfaces for SR-IOV virtual functions" patch does
not need to be in v3.10, but it should be marked for -stable.

How far back should it go? v3.9+?

> That will address another problem that is caused by
> moving device_add from pci_bus_add_device to pci_device_add.

I assume you're talking about a problem caused by 4f535093 ("PCI: Put
pci_dev in device tree as early as possible"). That commit appeared
in v3.9.

If we're asking to add the "hide remove and rescan sysfs interfaces"
patch to the v3.9 stable series, we should have a description of
exactly what problem it fixes, and ideally, a bugzilla for it. Can
you provide that?

That patch appears to be the only one in the [v3,part1,0/10] series
that actually directly fixes an issue, so it would be nice to have
more specifics in that changelog to begin with. The other patches in
that series appear to to be cleanups and preparation for the real
fixes that will come later.

Bjorn

2013-05-31 00:54:33

by Yinghai Lu

[permalink] [raw]
Subject: Re: [PATCH] PCI: set correct value for iov device before device

On Thu, May 30, 2013 at 4:22 PM, Bjorn Helgaas <[email protected]> wrote:
> On Thu, May 30, 2013 at 2:27 PM, Yinghai Lu <[email protected]> wrote:
>> On Wed, May 29, 2013 at 11:04 PM, Yinghai Lu <[email protected]> wrote:
>>> On Wed, May 29, 2013 at 10:45 PM, Xudong Hao <[email protected]> wrote:
>>>> Since device registering is put into pci_device_add(), it must set value of
>>>> Virtual Function device's member before the pci_dev is put to device tree. Or
>>>> some relevant subsystem of driver model such as xen will report a incorrect
>>>> IOV device to Xen hypervior.
>>>>
>>>> Signed-off-by: Xudong Hao <[email protected]>
>>>> ---
>>>> drivers/pci/iov.c | 6 +++---
>>>> 1 file changed, 3 insertions(+), 3 deletions(-)
>>>>
>>>> diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c
>>>> index c93071d..43d3de9 100644
>>>> --- a/drivers/pci/iov.c
>>>> +++ b/drivers/pci/iov.c
>>>> @@ -110,12 +110,12 @@ static int virtfn_add(struct pci_dev *dev, int id, int reset)
>>>> if (reset)
>>>> __pci_reset_function(virtfn);
>>>>
>>>> - pci_device_add(virtfn, virtfn->bus);
>>>> - mutex_unlock(&iov->dev->sriov->lock);
>>>> -
>>>> virtfn->physfn = pci_dev_get(dev);
>>>> virtfn->is_virtfn = 1;
>>>>
>>>> + pci_device_add(virtfn, virtfn->bus);
>>>> + mutex_unlock(&iov->dev->sriov->lock);
>>>> +
>>>> rc = pci_bus_add_device(virtfn);
>>>> sprintf(buf, "virtfn%u", id);
>>>> rc = sysfs_create_link(&dev->dev.kobj, &virtfn->dev.kobj, buf);
>>>
>>> I have similar patch at
>>> https://patchwork.kernel.org/patch/2562551/
>>> [5/7] PCI, ACPI: Don't glue ACPI dev with pci VFs
>>>
>>> and Jiang has another one
>>> https://patchwork.kernel.org/patch/2613481/
>>> [v3,part1,10/10] PCI, IOV: hide remove and rescan sysfs interfaces
>>> for SR-IOV virtual functions
>>
>> Bjorn,
>>
>> I double check this one, we should split the patch from me or Jiang.
>
> I don't know what the sentence above means.

I mean half of patch
https://patchwork.kernel.org/patch/2562551/
or half of patch
https://patchwork.kernel.org/patch/2613481/

just like what Xudong extracted.

>
>> and the one about set virtfn=1 should be -stable material.
>
> I assume you mean that Jiang's "[v3,part1,10/10] PCI, IOV: hide remove
> and rescan sysfs interfaces for SR-IOV virtual functions" patch does
> not need to be in v3.10, but it should be marked for -stable.

no half of it, move set virtfn=1 two lines forward.

>
> How far back should it go? v3.9+?

yes. v3.9+

>
>> That will address another problem that is caused by
>> moving device_add from pci_bus_add_device to pci_device_add.
>
> I assume you're talking about a problem caused by 4f535093 ("PCI: Put
> pci_dev in device tree as early as possible"). That commit appeared
> in v3.9.

yes.

>
> If we're asking to add the "hide remove and rescan sysfs interfaces"
> patch to the v3.9 stable series, we should have a description of
> exactly what problem it fixes, and ideally, a bugzilla for it. Can
> you provide that?

No. that is not what i mean.

That problem have been there when sriov support was added.

>
> That patch appears to be the only one in the [v3,part1,0/10] series
> that actually directly fixes an issue, so it would be nice to have
> more specifics in that changelog to begin with. The other patches in
> that series appear to to be cleanups and preparation for the real
> fixes that will come later.

yes. even should be separated from that patchset.

Yinghai

2013-05-31 01:29:25

by Jiang Liu

[permalink] [raw]
Subject: Re: [PATCH] PCI: set correct value for iov device before device

On Fri 31 May 2013 08:54:24 AM CST, Yinghai Lu wrote:
> On Thu, May 30, 2013 at 4:22 PM, Bjorn Helgaas <[email protected]> wrote:
>> On Thu, May 30, 2013 at 2:27 PM, Yinghai Lu <[email protected]> wrote:
>>> On Wed, May 29, 2013 at 11:04 PM, Yinghai Lu <[email protected]> wrote:
>>>> On Wed, May 29, 2013 at 10:45 PM, Xudong Hao <[email protected]> wrote:
>>>>> Since device registering is put into pci_device_add(), it must set value of
>>>>> Virtual Function device's member before the pci_dev is put to device tree. Or
>>>>> some relevant subsystem of driver model such as xen will report a incorrect
>>>>> IOV device to Xen hypervior.
>>>>>
>>>>> Signed-off-by: Xudong Hao <[email protected]>
>>>>> ---
>>>>> drivers/pci/iov.c | 6 +++---
>>>>> 1 file changed, 3 insertions(+), 3 deletions(-)
>>>>>
>>>>> diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c
>>>>> index c93071d..43d3de9 100644
>>>>> --- a/drivers/pci/iov.c
>>>>> +++ b/drivers/pci/iov.c
>>>>> @@ -110,12 +110,12 @@ static int virtfn_add(struct pci_dev *dev, int id, int reset)
>>>>> if (reset)
>>>>> __pci_reset_function(virtfn);
>>>>>
>>>>> - pci_device_add(virtfn, virtfn->bus);
>>>>> - mutex_unlock(&iov->dev->sriov->lock);
>>>>> -
>>>>> virtfn->physfn = pci_dev_get(dev);
>>>>> virtfn->is_virtfn = 1;
>>>>>
>>>>> + pci_device_add(virtfn, virtfn->bus);
>>>>> + mutex_unlock(&iov->dev->sriov->lock);
>>>>> +
>>>>> rc = pci_bus_add_device(virtfn);
>>>>> sprintf(buf, "virtfn%u", id);
>>>>> rc = sysfs_create_link(&dev->dev.kobj, &virtfn->dev.kobj, buf);
>>>>
>>>> I have similar patch at
>>>> https://patchwork.kernel.org/patch/2562551/
>>>> [5/7] PCI, ACPI: Don't glue ACPI dev with pci VFs
>>>>
>>>> and Jiang has another one
>>>> https://patchwork.kernel.org/patch/2613481/
>>>> [v3,part1,10/10] PCI, IOV: hide remove and rescan sysfs interfaces
>>>> for SR-IOV virtual functions
>>>
>>> Bjorn,
>>>
>>> I double check this one, we should split the patch from me or Jiang.
>>
>> I don't know what the sentence above means.
>
> I mean half of patch
> https://patchwork.kernel.org/patch/2562551/
> or half of patch
> https://patchwork.kernel.org/patch/2613481/
>
> just like what Xudong extracted.
>
>>
>>> and the one about set virtfn=1 should be -stable material.
>>
>> I assume you mean that Jiang's "[v3,part1,10/10] PCI, IOV: hide remove
>> and rescan sysfs interfaces for SR-IOV virtual functions" patch does
>> not need to be in v3.10, but it should be marked for -stable.
>
> no half of it, move set virtfn=1 two lines forward.
>
>>
>> How far back should it go? v3.9+?
>
> yes. v3.9+
>
>>
>>> That will address another problem that is caused by
>>> moving device_add from pci_bus_add_device to pci_device_add.
>>
>> I assume you're talking about a problem caused by 4f535093 ("PCI: Put
>> pci_dev in device tree as early as possible"). That commit appeared
>> in v3.9.
>
> yes.
>
>>
>> If we're asking to add the "hide remove and rescan sysfs interfaces"
>> patch to the v3.9 stable series, we should have a description of
>> exactly what problem it fixes, and ideally, a bugzilla for it. Can
>> you provide that?
>
> No. that is not what i mean.
>
> That problem have been there when sriov support was added.
>
>>
>> That patch appears to be the only one in the [v3,part1,0/10] series
>> that actually directly fixes an issue, so it would be nice to have
>> more specifics in that changelog to begin with. The other patches in
>> that series appear to to be cleanups and preparation for the real
>> fixes that will come later.
>
> yes. even should be separated from that patchset.
>
> Yinghai
> --
> To unsubscribe from this list: send the line "unsubscribe linux-pci" in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html
Hi Bjorn and Yinghai,
I think it's ok to separate out the bugfix part.
We found this issue when implementing the mechanism to hide
"remove"
sysfs entry for PCI virtual functions because it depends on "is_virtfn"
flag to
hide "remove" sysfs entry. Actually I didn't realize it also fixes
other issues
when making this change.
Sorry for the inconvenience!
Gerry