All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/2] A couple of SR-IOV-related patches
@ 2014-02-12 21:05 Boris Ostrovsky
  2014-02-12 21:05 ` [PATCH 1/2] x86/pci: Store VF's memory space displacement in a 64-bit value Boris Ostrovsky
  2014-02-12 21:05 ` [PATCH 2/2] x86/pci: Remove unnecessary check in VF value computation Boris Ostrovsky
  0 siblings, 2 replies; 10+ messages in thread
From: Boris Ostrovsky @ 2014-02-12 21:05 UTC (permalink / raw)
  To: jbeulich, keir; +Cc: george.dunlap, xen-devel, boris.ostrovsky

The first patch fixes a bug in calculating offset to the Virtual Function's
memory space. It may be worth taking it to 4.4.

The second patch is removal of what seems to be a redundant check in computing
VF number.

Boris Ostrovsky (2):
  x86/pci: Store VF's memory space displacement in a 64-bit value
  x86/pci: Remove unnecessary check in VF value computation

 xen/arch/x86/msi.c | 7 ++-----
 1 file changed, 2 insertions(+), 5 deletions(-)

-- 
1.8.1.4

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH 1/2] x86/pci: Store VF's memory space displacement in a 64-bit value
  2014-02-12 21:05 [PATCH 0/2] A couple of SR-IOV-related patches Boris Ostrovsky
@ 2014-02-12 21:05 ` Boris Ostrovsky
  2014-02-12 21:05 ` [PATCH 2/2] x86/pci: Remove unnecessary check in VF value computation Boris Ostrovsky
  1 sibling, 0 replies; 10+ messages in thread
From: Boris Ostrovsky @ 2014-02-12 21:05 UTC (permalink / raw)
  To: jbeulich, keir; +Cc: george.dunlap, xen-devel, boris.ostrovsky

VF's memory space offset can be greater than 4GB and therefore needs
to be stored in a 64-bit variable.

Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
---
 xen/arch/x86/msi.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/xen/arch/x86/msi.c b/xen/arch/x86/msi.c
index 284042e..1aaceeb 100644
--- a/xen/arch/x86/msi.c
+++ b/xen/arch/x86/msi.c
@@ -610,7 +610,8 @@ static int msi_capability_init(struct pci_dev *dev,
 static u64 read_pci_mem_bar(u16 seg, u8 bus, u8 slot, u8 func, u8 bir, int vf)
 {
     u8 limit;
-    u32 addr, base = PCI_BASE_ADDRESS_0, disp = 0;
+    u32 addr, base = PCI_BASE_ADDRESS_0;
+    u64 disp = 0;
 
     if ( vf >= 0 )
     {
-- 
1.8.1.4

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 2/2] x86/pci: Remove unnecessary check in VF value computation
  2014-02-12 21:05 [PATCH 0/2] A couple of SR-IOV-related patches Boris Ostrovsky
  2014-02-12 21:05 ` [PATCH 1/2] x86/pci: Store VF's memory space displacement in a 64-bit value Boris Ostrovsky
@ 2014-02-12 21:05 ` Boris Ostrovsky
  2014-02-13  9:48   ` Jan Beulich
  1 sibling, 1 reply; 10+ messages in thread
From: Boris Ostrovsky @ 2014-02-12 21:05 UTC (permalink / raw)
  To: jbeulich, keir; +Cc: george.dunlap, xen-devel, boris.ostrovsky

This test is already performed a couple of lines above.

Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
---
 xen/arch/x86/msi.c | 4 ----
 1 file changed, 4 deletions(-)

diff --git a/xen/arch/x86/msi.c b/xen/arch/x86/msi.c
index 1aaceeb..27e47c3 100644
--- a/xen/arch/x86/msi.c
+++ b/xen/arch/x86/msi.c
@@ -639,11 +639,7 @@ static u64 read_pci_mem_bar(u16 seg, u8 bus, u8 slot, u8 func, u8 bir, int vf)
         if ( vf < 0 || (vf && vf % stride) )
             return 0;
         if ( stride )
-        {
-            if ( vf % stride )
-                return 0;
             vf /= stride;
-        }
         if ( vf >= num_vf )
             return 0;
         BUILD_BUG_ON(ARRAY_SIZE(pdev->vf_rlen) != PCI_SRIOV_NUM_BARS);
-- 
1.8.1.4

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [PATCH 2/2] x86/pci: Remove unnecessary check in VF value computation
  2014-02-12 21:05 ` [PATCH 2/2] x86/pci: Remove unnecessary check in VF value computation Boris Ostrovsky
@ 2014-02-13  9:48   ` Jan Beulich
  2014-02-18 10:16     ` Jan Beulich
  0 siblings, 1 reply; 10+ messages in thread
From: Jan Beulich @ 2014-02-13  9:48 UTC (permalink / raw)
  To: Boris Ostrovsky; +Cc: george.dunlap, xen-devel, keir

[-- Attachment #1: Type: text/plain, Size: 1421 bytes --]

>>> On 12.02.14 at 22:05, Boris Ostrovsky <boris.ostrovsky@oracle.com> wrote:
> This test is already performed a couple of lines above.

Except that it's the wrong code you remove:

> @@ -639,11 +639,7 @@ static u64 read_pci_mem_bar(u16 seg, u8 bus, u8 slot, u8 func, u8 bir, int vf)
>          if ( vf < 0 || (vf && vf % stride) )
>              return 0;
>          if ( stride )
> -        {
> -            if ( vf % stride )
> -                return 0;
>              vf /= stride;
> -        }

Note how this second check carefully avoids a division by zero.
>From what I can tell I think that I simply forgot to remove the
right side of the earlier || after having converted it to the safer
variant inside the if(). Hence I think we instead want:

x86/MSI: don't risk division by zero

The check in question is redundant with the one in the immediately
following if(), where dividing by zero gets carefully avoided.

Spotted-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/arch/x86/msi.c
+++ b/xen/arch/x86/msi.c
@@ -635,7 +635,7 @@ static u64 read_pci_mem_bar(u16 seg, u8 
             return 0;
         base = pos + PCI_SRIOV_BAR;
         vf -= PCI_BDF(bus, slot, func) + offset;
-        if ( vf < 0 || (vf && vf % stride) )
+        if ( vf < 0 )
             return 0;
         if ( stride )
         {




[-- Attachment #2: x86-MSI-VF-divide-by-zero.patch --]
[-- Type: text/plain, Size: 640 bytes --]

x86/MSI: don't risk division by zero

The check in question is redundant with the one in the immediately
following if(), where dividing by zero gets carefully avoided.

Spotted-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/arch/x86/msi.c
+++ b/xen/arch/x86/msi.c
@@ -635,7 +635,7 @@ static u64 read_pci_mem_bar(u16 seg, u8 
             return 0;
         base = pos + PCI_SRIOV_BAR;
         vf -= PCI_BDF(bus, slot, func) + offset;
-        if ( vf < 0 || (vf && vf % stride) )
+        if ( vf < 0 )
             return 0;
         if ( stride )
         {

[-- Attachment #3: Type: text/plain, Size: 126 bytes --]

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 2/2] x86/pci: Remove unnecessary check in VF value computation
  2014-02-13  9:48   ` Jan Beulich
@ 2014-02-18 10:16     ` Jan Beulich
  2014-02-18 15:49       ` Boris Ostrovsky
  0 siblings, 1 reply; 10+ messages in thread
From: Jan Beulich @ 2014-02-18 10:16 UTC (permalink / raw)
  To: Boris Ostrovsky; +Cc: george.dunlap, xen-devel, keir

>>> On 13.02.14 at 10:48, "Jan Beulich" <JBeulich@suse.com> wrote:
>>>> On 12.02.14 at 22:05, Boris Ostrovsky <boris.ostrovsky@oracle.com> wrote:
>> This test is already performed a couple of lines above.
> 
> Except that it's the wrong code you remove:

No opinion on this alternative at all?

Jan

>> @@ -639,11 +639,7 @@ static u64 read_pci_mem_bar(u16 seg, u8 bus, u8 slot, u8 
> func, u8 bir, int vf)
>>          if ( vf < 0 || (vf && vf % stride) )
>>              return 0;
>>          if ( stride )
>> -        {
>> -            if ( vf % stride )
>> -                return 0;
>>              vf /= stride;
>> -        }
> 
> Note how this second check carefully avoids a division by zero.
> From what I can tell I think that I simply forgot to remove the
> right side of the earlier || after having converted it to the safer
> variant inside the if(). Hence I think we instead want:
> 
> x86/MSI: don't risk division by zero
> 
> The check in question is redundant with the one in the immediately
> following if(), where dividing by zero gets carefully avoided.
> 
> Spotted-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
> Signed-off-by: Jan Beulich <jbeulich@suse.com>
> 
> --- a/xen/arch/x86/msi.c
> +++ b/xen/arch/x86/msi.c
> @@ -635,7 +635,7 @@ static u64 read_pci_mem_bar(u16 seg, u8 
>              return 0;
>          base = pos + PCI_SRIOV_BAR;
>          vf -= PCI_BDF(bus, slot, func) + offset;
> -        if ( vf < 0 || (vf && vf % stride) )
> +        if ( vf < 0 )
>              return 0;
>          if ( stride )
>          {

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 2/2] x86/pci: Remove unnecessary check in VF value computation
  2014-02-18 10:16     ` Jan Beulich
@ 2014-02-18 15:49       ` Boris Ostrovsky
  2014-02-18 16:41         ` Jan Beulich
  0 siblings, 1 reply; 10+ messages in thread
From: Boris Ostrovsky @ 2014-02-18 15:49 UTC (permalink / raw)
  To: Jan Beulich; +Cc: george.dunlap, xen-devel, keir

On 02/18/2014 05:16 AM, Jan Beulich wrote:
>>>> On 13.02.14 at 10:48, "Jan Beulich" <JBeulich@suse.com> wrote:
>>>>> On 12.02.14 at 22:05, Boris Ostrovsky <boris.ostrovsky@oracle.com> wrote:
>>> This test is already performed a couple of lines above.
>> Except that it's the wrong code you remove:
> No opinion on this alternative at all?

Sorry Jan, I didn't realize you were waiting for me on this.

Yes, your version is fine although to be honest I don't see how the 
original patch had any issues with division by zero since we'd still be 
inside the 'if (stride)' clause.

But as I said, either version is OK with me so you can add

Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>

-boris


>
> Jan
>
>>> @@ -639,11 +639,7 @@ static u64 read_pci_mem_bar(u16 seg, u8 bus, u8 slot, u8
>> func, u8 bir, int vf)
>>>           if ( vf < 0 || (vf && vf % stride) )
>>>               return 0;
>>>           if ( stride )
>>> -        {
>>> -            if ( vf % stride )
>>> -                return 0;
>>>               vf /= stride;
>>> -        }
>> Note how this second check carefully avoids a division by zero.
>>  From what I can tell I think that I simply forgot to remove the
>> right side of the earlier || after having converted it to the safer
>> variant inside the if(). Hence I think we instead want:
>>
>> x86/MSI: don't risk division by zero
>>
>> The check in question is redundant with the one in the immediately
>> following if(), where dividing by zero gets carefully avoided.
>>
>> Spotted-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
>> Signed-off-by: Jan Beulich <jbeulich@suse.com>
>>
>> --- a/xen/arch/x86/msi.c
>> +++ b/xen/arch/x86/msi.c
>> @@ -635,7 +635,7 @@ static u64 read_pci_mem_bar(u16 seg, u8
>>               return 0;
>>           base = pos + PCI_SRIOV_BAR;
>>           vf -= PCI_BDF(bus, slot, func) + offset;
>> -        if ( vf < 0 || (vf && vf % stride) )
>> +        if ( vf < 0 )
>>               return 0;
>>           if ( stride )
>>           {
>
>

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 2/2] x86/pci: Remove unnecessary check in VF value computation
  2014-02-18 15:49       ` Boris Ostrovsky
@ 2014-02-18 16:41         ` Jan Beulich
  2014-02-18 16:56           ` Boris Ostrovsky
  0 siblings, 1 reply; 10+ messages in thread
From: Jan Beulich @ 2014-02-18 16:41 UTC (permalink / raw)
  To: Boris Ostrovsky; +Cc: george.dunlap, xen-devel, keir

>>> On 18.02.14 at 16:49, Boris Ostrovsky <boris.ostrovsky@oracle.com> wrote:
> On 02/18/2014 05:16 AM, Jan Beulich wrote:
>>>>> On 13.02.14 at 10:48, "Jan Beulich" <JBeulich@suse.com> wrote:
>>>>>> On 12.02.14 at 22:05, Boris Ostrovsky <boris.ostrovsky@oracle.com> wrote:
>>>> This test is already performed a couple of lines above.
>>> Except that it's the wrong code you remove:
>> No opinion on this alternative at all?
> 
> Sorry Jan, I didn't realize you were waiting for me on this.
> 
> Yes, your version is fine although to be honest I don't see how the 
> original patch had any issues with division by zero since we'd still be 
> inside the 'if (stride)' clause.

It's the very division that this patch removes:

>>> --- a/xen/arch/x86/msi.c
>>> +++ b/xen/arch/x86/msi.c
>>> @@ -635,7 +635,7 @@ static u64 read_pci_mem_bar(u16 seg, u8
>>>               return 0;
>>>           base = pos + PCI_SRIOV_BAR;
>>>           vf -= PCI_BDF(bus, slot, func) + offset;
>>> -        if ( vf < 0 || (vf && vf % stride) )
>>> +        if ( vf < 0 )
>>>               return 0;
>>>           if ( stride )
>>>           {

Which isn't inside the if(stride).

Jan

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 2/2] x86/pci: Remove unnecessary check in VF value computation
  2014-02-18 16:41         ` Jan Beulich
@ 2014-02-18 16:56           ` Boris Ostrovsky
  2014-02-18 17:04             ` Jan Beulich
  0 siblings, 1 reply; 10+ messages in thread
From: Boris Ostrovsky @ 2014-02-18 16:56 UTC (permalink / raw)
  To: Jan Beulich; +Cc: george.dunlap, xen-devel, keir

On 02/18/2014 11:41 AM, Jan Beulich wrote:
>>>> On 18.02.14 at 16:49, Boris Ostrovsky <boris.ostrovsky@oracle.com> wrote:
>> On 02/18/2014 05:16 AM, Jan Beulich wrote:
>>>>>> On 13.02.14 at 10:48, "Jan Beulich" <JBeulich@suse.com> wrote:
>>>>>>> On 12.02.14 at 22:05, Boris Ostrovsky <boris.ostrovsky@oracle.com> wrote:
>>>>> This test is already performed a couple of lines above.
>>>> Except that it's the wrong code you remove:
>>> No opinion on this alternative at all?
>> Sorry Jan, I didn't realize you were waiting for me on this.
>>
>> Yes, your version is fine although to be honest I don't see how the
>> original patch had any issues with division by zero since we'd still be
>> inside the 'if (stride)' clause.
> It's the very division that this patch removes:
>
>>>> --- a/xen/arch/x86/msi.c
>>>> +++ b/xen/arch/x86/msi.c
>>>> @@ -635,7 +635,7 @@ static u64 read_pci_mem_bar(u16 seg, u8
>>>>                return 0;
>>>>            base = pos + PCI_SRIOV_BAR;
>>>>            vf -= PCI_BDF(bus, slot, func) + offset;
>>>> -        if ( vf < 0 || (vf && vf % stride) )
>>>> +        if ( vf < 0 )
>>>>                return 0;
>>>>            if ( stride )
>>>>            {
> Which isn't inside the if(stride).


Yes, I see it now. I was staring at a wrong line.

This actually now looks like a bug. You do check above for '(num_vf > 1 
&& !stride) ' but presumably if things are really messed up num_vf can 
be 1 but vf is 0. And then if stride is zero too then we are not doing 
particularly well.

So probably this should go into 4.4 as well?

-boris

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 2/2] x86/pci: Remove unnecessary check in VF value computation
  2014-02-18 16:56           ` Boris Ostrovsky
@ 2014-02-18 17:04             ` Jan Beulich
  2014-02-18 17:10               ` Boris Ostrovsky
  0 siblings, 1 reply; 10+ messages in thread
From: Jan Beulich @ 2014-02-18 17:04 UTC (permalink / raw)
  To: Boris Ostrovsky; +Cc: george.dunlap, xen-devel, keir

>>> On 18.02.14 at 17:56, Boris Ostrovsky <boris.ostrovsky@oracle.com> wrote:
> On 02/18/2014 11:41 AM, Jan Beulich wrote:
>>>>> On 18.02.14 at 16:49, Boris Ostrovsky <boris.ostrovsky@oracle.com> wrote:
>>> On 02/18/2014 05:16 AM, Jan Beulich wrote:
>>>>>>> On 13.02.14 at 10:48, "Jan Beulich" <JBeulich@suse.com> wrote:
>>>>>>>> On 12.02.14 at 22:05, Boris Ostrovsky <boris.ostrovsky@oracle.com> wrote:
>>>>>> This test is already performed a couple of lines above.
>>>>> Except that it's the wrong code you remove:
>>>> No opinion on this alternative at all?
>>> Sorry Jan, I didn't realize you were waiting for me on this.
>>>
>>> Yes, your version is fine although to be honest I don't see how the
>>> original patch had any issues with division by zero since we'd still be
>>> inside the 'if (stride)' clause.
>> It's the very division that this patch removes:
>>
>>>>> --- a/xen/arch/x86/msi.c
>>>>> +++ b/xen/arch/x86/msi.c
>>>>> @@ -635,7 +635,7 @@ static u64 read_pci_mem_bar(u16 seg, u8
>>>>>                return 0;
>>>>>            base = pos + PCI_SRIOV_BAR;
>>>>>            vf -= PCI_BDF(bus, slot, func) + offset;
>>>>> -        if ( vf < 0 || (vf && vf % stride) )
>>>>> +        if ( vf < 0 )
>>>>>                return 0;
>>>>>            if ( stride )
>>>>>            {
>> Which isn't inside the if(stride).
> 
> 
> Yes, I see it now. I was staring at a wrong line.
> 
> This actually now looks like a bug.

You mean the old code looks wrong or the new one?

> You do check above for '(num_vf > 1 
> && !stride) ' but presumably if things are really messed up num_vf can 
> be 1 but vf is 0. And then if stride is zero too then we are not doing 
> particularly well.
> 
> So probably this should go into 4.4 as well?

We've done with this unfixed quite fine so far, so it's generally
okay to leave as is until 4.4.1 (read: not a regression). I
personally wouldn't mind pushing it in, but only if other similar
not too high priority bug fixes would also go in.

Jan

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 2/2] x86/pci: Remove unnecessary check in VF value computation
  2014-02-18 17:04             ` Jan Beulich
@ 2014-02-18 17:10               ` Boris Ostrovsky
  0 siblings, 0 replies; 10+ messages in thread
From: Boris Ostrovsky @ 2014-02-18 17:10 UTC (permalink / raw)
  To: Jan Beulich; +Cc: george.dunlap, xen-devel, keir

On 02/18/2014 12:04 PM, Jan Beulich wrote:
>>>> On 18.02.14 at 17:56, Boris Ostrovsky <boris.ostrovsky@oracle.com> wrote:
>> On 02/18/2014 11:41 AM, Jan Beulich wrote:
>>>>>> On 18.02.14 at 16:49, Boris Ostrovsky <boris.ostrovsky@oracle.com> wrote:
>>>> On 02/18/2014 05:16 AM, Jan Beulich wrote:
>>>>>>>> On 13.02.14 at 10:48, "Jan Beulich" <JBeulich@suse.com> wrote:
>>>>>>>>> On 12.02.14 at 22:05, Boris Ostrovsky <boris.ostrovsky@oracle.com> wrote:
>>>>>>> This test is already performed a couple of lines above.
>>>>>> Except that it's the wrong code you remove:
>>>>> No opinion on this alternative at all?
>>>> Sorry Jan, I didn't realize you were waiting for me on this.
>>>>
>>>> Yes, your version is fine although to be honest I don't see how the
>>>> original patch had any issues with division by zero since we'd still be
>>>> inside the 'if (stride)' clause.
>>> It's the very division that this patch removes:
>>>
>>>>>> --- a/xen/arch/x86/msi.c
>>>>>> +++ b/xen/arch/x86/msi.c
>>>>>> @@ -635,7 +635,7 @@ static u64 read_pci_mem_bar(u16 seg, u8
>>>>>>                 return 0;
>>>>>>             base = pos + PCI_SRIOV_BAR;
>>>>>>             vf -= PCI_BDF(bus, slot, func) + offset;
>>>>>> -        if ( vf < 0 || (vf && vf % stride) )
>>>>>> +        if ( vf < 0 )
>>>>>>                 return 0;
>>>>>>             if ( stride )
>>>>>>             {
>>> Which isn't inside the if(stride).
>>
>> Yes, I see it now. I was staring at a wrong line.
>>
>> This actually now looks like a bug.
> You mean the old code looks wrong or the new one?


The old one. Your patch fixes it.


>
>> You do check above for '(num_vf > 1
>> && !stride) ' but presumably if things are really messed up num_vf can
>> be 1 but vf is 0. And then if stride is zero too then we are not doing
>> particularly well.
>>
>> So probably this should go into 4.4 as well?
> We've done with this unfixed quite fine so far, so it's generally
> okay to leave as is until 4.4.1 (read: not a regression). I
> personally wouldn't mind pushing it in, but only if other similar
> not too high priority bug fixes would also go in.
>

OK.

-boris

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2014-02-18 17:08 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-02-12 21:05 [PATCH 0/2] A couple of SR-IOV-related patches Boris Ostrovsky
2014-02-12 21:05 ` [PATCH 1/2] x86/pci: Store VF's memory space displacement in a 64-bit value Boris Ostrovsky
2014-02-12 21:05 ` [PATCH 2/2] x86/pci: Remove unnecessary check in VF value computation Boris Ostrovsky
2014-02-13  9:48   ` Jan Beulich
2014-02-18 10:16     ` Jan Beulich
2014-02-18 15:49       ` Boris Ostrovsky
2014-02-18 16:41         ` Jan Beulich
2014-02-18 16:56           ` Boris Ostrovsky
2014-02-18 17:04             ` Jan Beulich
2014-02-18 17:10               ` Boris Ostrovsky

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.