[PATCH v0] qed/qed_dev: guard against a possible division by zero

Daniil Tatianin posted 1 patch 2 years, 7 months ago
There is a newer version of this series
drivers/net/ethernet/qlogic/qed/qed_dev.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
[PATCH v0] qed/qed_dev: guard against a possible division by zero
Posted by Daniil Tatianin 2 years, 7 months ago
Previously we would divide total_left_rate by zero if num_vports
happened to be 1 because non_requested_count is calculated as
num_vports - req_count. Guard against this by explicitly checking for
zero when doing the division.

Found by Linux Verification Center (linuxtesting.org) with the SVACE
static analysis tool.

Fixes: bcd197c81f63 ("qed: Add vport WFQ configuration APIs")
Signed-off-by: Daniil Tatianin <d-tatianin@yandex-team.ru>
---
 drivers/net/ethernet/qlogic/qed/qed_dev.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/qlogic/qed/qed_dev.c b/drivers/net/ethernet/qlogic/qed/qed_dev.c
index d61cd32ec3b6..90927f68c459 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_dev.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_dev.c
@@ -5123,7 +5123,7 @@ static int qed_init_wfq_param(struct qed_hwfn *p_hwfn,
 
 	total_left_rate	= min_pf_rate - total_req_min_rate;
 
-	left_rate_per_vp = total_left_rate / non_requested_count;
+	left_rate_per_vp = total_left_rate / (non_requested_count ?: 1);
 	if (left_rate_per_vp <  min_pf_rate / QED_WFQ_UNIT) {
 		DP_VERBOSE(p_hwfn, NETIF_MSG_LINK,
 			   "Non WFQ configured vports rate [%d Mbps] is less than one percent of configured PF min rate[%d Mbps]\n",
-- 
2.25.1
Re: [PATCH v0] qed/qed_dev: guard against a possible division by zero
Posted by Simon Horman 2 years, 7 months ago
On Thu, Feb 09, 2023 at 01:38:13PM +0300, Daniil Tatianin wrote:
> Previously we would divide total_left_rate by zero if num_vports
> happened to be 1 because non_requested_count is calculated as
> num_vports - req_count. Guard against this by explicitly checking for
> zero when doing the division.
> 
> Found by Linux Verification Center (linuxtesting.org) with the SVACE
> static analysis tool.
> 
> Fixes: bcd197c81f63 ("qed: Add vport WFQ configuration APIs")
> Signed-off-by: Daniil Tatianin <d-tatianin@yandex-team.ru>
> ---
>  drivers/net/ethernet/qlogic/qed/qed_dev.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/net/ethernet/qlogic/qed/qed_dev.c b/drivers/net/ethernet/qlogic/qed/qed_dev.c
> index d61cd32ec3b6..90927f68c459 100644
> --- a/drivers/net/ethernet/qlogic/qed/qed_dev.c
> +++ b/drivers/net/ethernet/qlogic/qed/qed_dev.c
> @@ -5123,7 +5123,7 @@ static int qed_init_wfq_param(struct qed_hwfn *p_hwfn,
>  
>  	total_left_rate	= min_pf_rate - total_req_min_rate;
>  
> -	left_rate_per_vp = total_left_rate / non_requested_count;
> +	left_rate_per_vp = total_left_rate / (non_requested_count ?: 1);

I don't know if num_vports can be 1.
But if it is then I agree that the above will be a divide by zero.

I do, however, wonder if it would be better to either:

* Treat this case as invalid and return with -EINVAL if num_vports is 1; or

* Skip both the calculation immediately above and the code
  in the if condition below, which is the only place where
  the calculated value is used, if num_vports is 1.
  I don't think the if clause makes much sense if num_vports is one.

>  	if (left_rate_per_vp <  min_pf_rate / QED_WFQ_UNIT) {
>  		DP_VERBOSE(p_hwfn, NETIF_MSG_LINK,
>  			   "Non WFQ configured vports rate [%d Mbps] is less than one percent of configured PF min rate[%d Mbps]\n",
> -- 
> 2.25.1
>
Re: [PATCH v0] qed/qed_dev: guard against a possible division by zero
Posted by Daniil Tatianin 2 years, 7 months ago

On 2/9/23 2:13 PM, Simon Horman wrote:
> On Thu, Feb 09, 2023 at 01:38:13PM +0300, Daniil Tatianin wrote:
>> Previously we would divide total_left_rate by zero if num_vports
>> happened to be 1 because non_requested_count is calculated as
>> num_vports - req_count. Guard against this by explicitly checking for
>> zero when doing the division.
>>
>> Found by Linux Verification Center (linuxtesting.org) with the SVACE
>> static analysis tool.
>>
>> Fixes: bcd197c81f63 ("qed: Add vport WFQ configuration APIs")
>> Signed-off-by: Daniil Tatianin <d-tatianin@yandex-team.ru>
>> ---
>>   drivers/net/ethernet/qlogic/qed/qed_dev.c | 2 +-
>>   1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/drivers/net/ethernet/qlogic/qed/qed_dev.c b/drivers/net/ethernet/qlogic/qed/qed_dev.c
>> index d61cd32ec3b6..90927f68c459 100644
>> --- a/drivers/net/ethernet/qlogic/qed/qed_dev.c
>> +++ b/drivers/net/ethernet/qlogic/qed/qed_dev.c
>> @@ -5123,7 +5123,7 @@ static int qed_init_wfq_param(struct qed_hwfn *p_hwfn,
>>   
>>   	total_left_rate	= min_pf_rate - total_req_min_rate;
>>   
>> -	left_rate_per_vp = total_left_rate / non_requested_count;
>> +	left_rate_per_vp = total_left_rate / (non_requested_count ?: 1);
> 
> I don't know if num_vports can be 1.
> But if it is then I agree that the above will be a divide by zero.
> 
> I do, however, wonder if it would be better to either:
> 
> * Treat this case as invalid and return with -EINVAL if num_vports is 1; or
I think that's a good idea considering num_vports == 1 is indeed an 
invalid value.
I'd like to hear a maintainer's opinion on this.
> * Skip both the calculation immediately above and the code
>    in the if condition below, which is the only place where
>    the calculated value is used, if num_vports is 1.
>    I don't think the if clause makes much sense if num_vports is one.left_rate_per_vp is also used below the if clause, it is assigned to 
.min_speed in a for loop. Looking at that code division by 1 seems to 
make sense to me in this case.
> 
>>   	if (left_rate_per_vp <  min_pf_rate / QED_WFQ_UNIT) {
>>   		DP_VERBOSE(p_hwfn, NETIF_MSG_LINK,
>>   			   "Non WFQ configured vports rate [%d Mbps] is less than one percent of configured PF min rate[%d Mbps]\n",
>> -- 
>> 2.25.1
>>
RE: [EXT] Re: [PATCH v0] qed/qed_dev: guard against a possible division by zero
Posted by Manish Chopra 2 years, 6 months ago
> -----Original Message-----
> From: Daniil Tatianin <d-tatianin@yandex-team.ru>
> Sent: Tuesday, February 14, 2023 12:53 PM
> To: Simon Horman <simon.horman@corigine.com>
> Cc: Ariel Elior <aelior@marvell.com>; Manish Chopra
> <manishc@marvell.com>; David S. Miller <davem@davemloft.net>; Eric
> Dumazet <edumazet@google.com>; Jakub Kicinski <kuba@kernel.org>; Paolo
> Abeni <pabeni@redhat.com>; Yuval Mintz <Yuval.Mintz@qlogic.com>;
> netdev@vger.kernel.org; linux-kernel@vger.kernel.org
> Subject: [EXT] Re: [PATCH v0] qed/qed_dev: guard against a possible division
> by zero
> 
> External Email
> 
> ----------------------------------------------------------------------
> 
> 
> On 2/9/23 2:13 PM, Simon Horman wrote:
> > On Thu, Feb 09, 2023 at 01:38:13PM +0300, Daniil Tatianin wrote:
> >> Previously we would divide total_left_rate by zero if num_vports
> >> happened to be 1 because non_requested_count is calculated as
> >> num_vports - req_count. Guard against this by explicitly checking for
> >> zero when doing the division.
> >>
> >> Found by Linux Verification Center (linuxtesting.org) with the SVACE
> >> static analysis tool.
> >>
> >> Fixes: bcd197c81f63 ("qed: Add vport WFQ configuration APIs")
> >> Signed-off-by: Daniil Tatianin <d-tatianin@yandex-team.ru>
> >> ---
> >>   drivers/net/ethernet/qlogic/qed/qed_dev.c | 2 +-
> >>   1 file changed, 1 insertion(+), 1 deletion(-)
> >>
> >> diff --git a/drivers/net/ethernet/qlogic/qed/qed_dev.c
> >> b/drivers/net/ethernet/qlogic/qed/qed_dev.c
> >> index d61cd32ec3b6..90927f68c459 100644
> >> --- a/drivers/net/ethernet/qlogic/qed/qed_dev.c
> >> +++ b/drivers/net/ethernet/qlogic/qed/qed_dev.c
> >> @@ -5123,7 +5123,7 @@ static int qed_init_wfq_param(struct qed_hwfn
> >> *p_hwfn,
> >>
> >>   	total_left_rate	= min_pf_rate - total_req_min_rate;
> >>
> >> -	left_rate_per_vp = total_left_rate / non_requested_count;
> >> +	left_rate_per_vp = total_left_rate / (non_requested_count ?: 1);
> >
> > I don't know if num_vports can be 1.
> > But if it is then I agree that the above will be a divide by zero.
> >
> > I do, however, wonder if it would be better to either:
> >
> > * Treat this case as invalid and return with -EINVAL if num_vports is
> > 1; or
> I think that's a good idea considering num_vports == 1 is indeed an invalid
> value.
> I'd like to hear a maintainer's opinion on this.
 
Practically, this flow will only hit with presence of SR-IOV VFs. In that case it's
always expected to have num_vports > 1. 

> > * Skip both the calculation immediately above and the code
> >    in the if condition below, which is the only place where
> >    the calculated value is used, if num_vports is 1.
> >    I don't think the if clause makes much sense if num_vports is
> > one.left_rate_per_vp is also used below the if clause, it is assigned
> > to
> .min_speed in a for loop. Looking at that code division by 1 seems to make
> sense to me in this case.
> >
> >>   	if (left_rate_per_vp <  min_pf_rate / QED_WFQ_UNIT) {
> >>   		DP_VERBOSE(p_hwfn, NETIF_MSG_LINK,
> >>   			   "Non WFQ configured vports rate [%d Mbps] is less
> than one
> >> percent of configured PF min rate[%d Mbps]\n",
> >> --
> >> 2.25.1
> >>
Re: [EXT] Re: [PATCH v0] qed/qed_dev: guard against a possible division by zero
Posted by Daniil Tatianin 2 years, 6 months ago
On 2/16/23 12:20 AM, Manish Chopra wrote:
>> -----Original Message-----
>> From: Daniil Tatianin <d-tatianin@yandex-team.ru>
>> Sent: Tuesday, February 14, 2023 12:53 PM
>> To: Simon Horman <simon.horman@corigine.com>
>> Cc: Ariel Elior <aelior@marvell.com>; Manish Chopra
>> <manishc@marvell.com>; David S. Miller <davem@davemloft.net>; Eric
>> Dumazet <edumazet@google.com>; Jakub Kicinski <kuba@kernel.org>; Paolo
>> Abeni <pabeni@redhat.com>; Yuval Mintz <Yuval.Mintz@qlogic.com>;
>> netdev@vger.kernel.org; linux-kernel@vger.kernel.org
>> Subject: [EXT] Re: [PATCH v0] qed/qed_dev: guard against a possible division
>> by zero
>>
>> External Email
>>
>> ----------------------------------------------------------------------
>>
>>
>> On 2/9/23 2:13 PM, Simon Horman wrote:
>>> On Thu, Feb 09, 2023 at 01:38:13PM +0300, Daniil Tatianin wrote:
>>>> Previously we would divide total_left_rate by zero if num_vports
>>>> happened to be 1 because non_requested_count is calculated as
>>>> num_vports - req_count. Guard against this by explicitly checking for
>>>> zero when doing the division.
>>>>
>>>> Found by Linux Verification Center (linuxtesting.org) with the SVACE
>>>> static analysis tool.
>>>>
>>>> Fixes: bcd197c81f63 ("qed: Add vport WFQ configuration APIs")
>>>> Signed-off-by: Daniil Tatianin <d-tatianin@yandex-team.ru>
>>>> ---
>>>>    drivers/net/ethernet/qlogic/qed/qed_dev.c | 2 +-
>>>>    1 file changed, 1 insertion(+), 1 deletion(-)
>>>>
>>>> diff --git a/drivers/net/ethernet/qlogic/qed/qed_dev.c
>>>> b/drivers/net/ethernet/qlogic/qed/qed_dev.c
>>>> index d61cd32ec3b6..90927f68c459 100644
>>>> --- a/drivers/net/ethernet/qlogic/qed/qed_dev.c
>>>> +++ b/drivers/net/ethernet/qlogic/qed/qed_dev.c
>>>> @@ -5123,7 +5123,7 @@ static int qed_init_wfq_param(struct qed_hwfn
>>>> *p_hwfn,
>>>>
>>>>    	total_left_rate	= min_pf_rate - total_req_min_rate;
>>>>
>>>> -	left_rate_per_vp = total_left_rate / non_requested_count;
>>>> +	left_rate_per_vp = total_left_rate / (non_requested_count ?: 1);
>>>
>>> I don't know if num_vports can be 1.
>>> But if it is then I agree that the above will be a divide by zero.
>>>
>>> I do, however, wonder if it would be better to either:
>>>
>>> * Treat this case as invalid and return with -EINVAL if num_vports is
>>> 1; or
>> I think that's a good idea considering num_vports == 1 is indeed an invalid
>> value.
>> I'd like to hear a maintainer's opinion on this.
>   
> Practically, this flow will only hit with presence of SR-IOV VFs. In that case it's
> always expected to have num_vports > 1.

In that case, should we add a check and return with -EINVAL otherwise?
Thank you!

>>> * Skip both the calculation immediately above and the code
>>>     in the if condition below, which is the only place where
>>>     the calculated value is used, if num_vports is 1.
>>>     I don't think the if clause makes much sense if num_vports is
>>> one.left_rate_per_vp is also used below the if clause, it is assigned
>>> to
>> .min_speed in a for loop. Looking at that code division by 1 seems to make
>> sense to me in this case.
>>>
>>>>    	if (left_rate_per_vp <  min_pf_rate / QED_WFQ_UNIT) {
>>>>    		DP_VERBOSE(p_hwfn, NETIF_MSG_LINK,
>>>>    			   "Non WFQ configured vports rate [%d Mbps] is less
>> than one
>>>> percent of configured PF min rate[%d Mbps]\n",
>>>> --
>>>> 2.25.1
>>>>
Re: [EXT] Re: [PATCH v0] qed/qed_dev: guard against a possible division by zero
Posted by Daniil Tatianin 2 years, 6 months ago
On 2/16/23 9:42 AM, Daniil Tatianin wrote:
> On 2/16/23 12:20 AM, Manish Chopra wrote:
>>> -----Original Message-----
>>> From: Daniil Tatianin <d-tatianin@yandex-team.ru>
>>> Sent: Tuesday, February 14, 2023 12:53 PM
>>> To: Simon Horman <simon.horman@corigine.com>
>>> Cc: Ariel Elior <aelior@marvell.com>; Manish Chopra
>>> <manishc@marvell.com>; David S. Miller <davem@davemloft.net>; Eric
>>> Dumazet <edumazet@google.com>; Jakub Kicinski <kuba@kernel.org>; Paolo
>>> Abeni <pabeni@redhat.com>; Yuval Mintz <Yuval.Mintz@qlogic.com>;
>>> netdev@vger.kernel.org; linux-kernel@vger.kernel.org
>>> Subject: [EXT] Re: [PATCH v0] qed/qed_dev: guard against a possible 
>>> division
>>> by zero
>>>
>>> External Email
>>>
>>> ----------------------------------------------------------------------
>>>
>>>
>>> On 2/9/23 2:13 PM, Simon Horman wrote:
>>>> On Thu, Feb 09, 2023 at 01:38:13PM +0300, Daniil Tatianin wrote:
>>>>> Previously we would divide total_left_rate by zero if num_vports
>>>>> happened to be 1 because non_requested_count is calculated as
>>>>> num_vports - req_count. Guard against this by explicitly checking for
>>>>> zero when doing the division.
>>>>>
>>>>> Found by Linux Verification Center (linuxtesting.org) with the SVACE
>>>>> static analysis tool.
>>>>>
>>>>> Fixes: bcd197c81f63 ("qed: Add vport WFQ configuration APIs")
>>>>> Signed-off-by: Daniil Tatianin <d-tatianin@yandex-team.ru>
>>>>> ---
>>>>>    drivers/net/ethernet/qlogic/qed/qed_dev.c | 2 +-
>>>>>    1 file changed, 1 insertion(+), 1 deletion(-)
>>>>>
>>>>> diff --git a/drivers/net/ethernet/qlogic/qed/qed_dev.c
>>>>> b/drivers/net/ethernet/qlogic/qed/qed_dev.c
>>>>> index d61cd32ec3b6..90927f68c459 100644
>>>>> --- a/drivers/net/ethernet/qlogic/qed/qed_dev.c
>>>>> +++ b/drivers/net/ethernet/qlogic/qed/qed_dev.c
>>>>> @@ -5123,7 +5123,7 @@ static int qed_init_wfq_param(struct qed_hwfn
>>>>> *p_hwfn,
>>>>>
>>>>>        total_left_rate    = min_pf_rate - total_req_min_rate;
>>>>>
>>>>> -    left_rate_per_vp = total_left_rate / non_requested_count;
>>>>> +    left_rate_per_vp = total_left_rate / (non_requested_count ?: 1);
>>>>
>>>> I don't know if num_vports can be 1.
>>>> But if it is then I agree that the above will be a divide by zero.
>>>>
>>>> I do, however, wonder if it would be better to either:
>>>>
>>>> * Treat this case as invalid and return with -EINVAL if num_vports is
>>>> 1; or
>>> I think that's a good idea considering num_vports == 1 is indeed an 
>>> invalid
>>> value.
>>> I'd like to hear a maintainer's opinion on this.
>> Practically, this flow will only hit with presence of SR-IOV VFs. In 
>> that case it's
>> always expected to have num_vports > 1.
> 
> In that case, should we add a check and return with -EINVAL otherwise?
> Thank you!
>

Ping

>>>> * Skip both the calculation immediately above and the code
>>>>     in the if condition below, which is the only place where
>>>>     the calculated value is used, if num_vports is 1.
>>>>     I don't think the if clause makes much sense if num_vports is
>>>> one.left_rate_per_vp is also used below the if clause, it is assigned
>>>> to
>>> .min_speed in a for loop. Looking at that code division by 1 seems to 
>>> make
>>> sense to me in this case.
>>>>
>>>>>        if (left_rate_per_vp <  min_pf_rate / QED_WFQ_UNIT) {
>>>>>            DP_VERBOSE(p_hwfn, NETIF_MSG_LINK,
>>>>>                   "Non WFQ configured vports rate [%d Mbps] is less
>>> than one
>>>>> percent of configured PF min rate[%d Mbps]\n",
>>>>> -- 
>>>>> 2.25.1
>>>>>
RE: [EXT] Re: [PATCH v0] qed/qed_dev: guard against a possible division by zero
Posted by Manish Chopra 2 years, 6 months ago
> -----Original Message-----
> From: Daniil Tatianin <d-tatianin@yandex-team.ru>
> Sent: Friday, March 3, 2023 5:48 PM
> To: Manish Chopra <manishc@marvell.com>; Simon Horman
> <simon.horman@corigine.com>
> Cc: Ariel Elior <aelior@marvell.com>; David S. Miller
> <davem@davemloft.net>; Eric Dumazet <edumazet@google.com>; Jakub
> Kicinski <kuba@kernel.org>; Paolo Abeni <pabeni@redhat.com>; Yuval Mintz
> <Yuval.Mintz@qlogic.com>; netdev@vger.kernel.org; linux-
> kernel@vger.kernel.org
> Subject: Re: [EXT] Re: [PATCH v0] qed/qed_dev: guard against a possible
> division by zero
> 
> On 2/16/23 9:42 AM, Daniil Tatianin wrote:
> > On 2/16/23 12:20 AM, Manish Chopra wrote:
> >>> -----Original Message-----
> >>> From: Daniil Tatianin <d-tatianin@yandex-team.ru>
> >>> Sent: Tuesday, February 14, 2023 12:53 PM
> >>> To: Simon Horman <simon.horman@corigine.com>
> >>> Cc: Ariel Elior <aelior@marvell.com>; Manish Chopra
> >>> <manishc@marvell.com>; David S. Miller <davem@davemloft.net>; Eric
> >>> Dumazet <edumazet@google.com>; Jakub Kicinski <kuba@kernel.org>;
> >>> Paolo Abeni <pabeni@redhat.com>; Yuval Mintz
> >>> <Yuval.Mintz@qlogic.com>; netdev@vger.kernel.org;
> >>> linux-kernel@vger.kernel.org
> >>> Subject: [EXT] Re: [PATCH v0] qed/qed_dev: guard against a possible
> >>> division by zero
> >>>
> >>> External Email
> >>>
> >>> --------------------------------------------------------------------
> >>> --
> >>>
> >>>
> >>> On 2/9/23 2:13 PM, Simon Horman wrote:
> >>>> On Thu, Feb 09, 2023 at 01:38:13PM +0300, Daniil Tatianin wrote:
> >>>>> Previously we would divide total_left_rate by zero if num_vports
> >>>>> happened to be 1 because non_requested_count is calculated as
> >>>>> num_vports - req_count. Guard against this by explicitly checking
> >>>>> for zero when doing the division.
> >>>>>
> >>>>> Found by Linux Verification Center (linuxtesting.org) with the
> >>>>> SVACE static analysis tool.
> >>>>>
> >>>>> Fixes: bcd197c81f63 ("qed: Add vport WFQ configuration APIs")
> >>>>> Signed-off-by: Daniil Tatianin <d-tatianin@yandex-team.ru>
> >>>>> ---
> >>>>>    drivers/net/ethernet/qlogic/qed/qed_dev.c | 2 +-
> >>>>>    1 file changed, 1 insertion(+), 1 deletion(-)
> >>>>>
> >>>>> diff --git a/drivers/net/ethernet/qlogic/qed/qed_dev.c
> >>>>> b/drivers/net/ethernet/qlogic/qed/qed_dev.c
> >>>>> index d61cd32ec3b6..90927f68c459 100644
> >>>>> --- a/drivers/net/ethernet/qlogic/qed/qed_dev.c
> >>>>> +++ b/drivers/net/ethernet/qlogic/qed/qed_dev.c
> >>>>> @@ -5123,7 +5123,7 @@ static int qed_init_wfq_param(struct
> >>>>> qed_hwfn *p_hwfn,
> >>>>>
> >>>>>        total_left_rate    = min_pf_rate - total_req_min_rate;
> >>>>>
> >>>>> -    left_rate_per_vp = total_left_rate / non_requested_count;
> >>>>> +    left_rate_per_vp = total_left_rate / (non_requested_count ?:
> >>>>> +1);
> >>>>
> >>>> I don't know if num_vports can be 1.
> >>>> But if it is then I agree that the above will be a divide by zero.
> >>>>
> >>>> I do, however, wonder if it would be better to either:
> >>>>
> >>>> * Treat this case as invalid and return with -EINVAL if num_vports
> >>>> is 1; or
> >>> I think that's a good idea considering num_vports == 1 is indeed an
> >>> invalid value.
> >>> I'd like to hear a maintainer's opinion on this.
> >> Practically, this flow will only hit with presence of SR-IOV VFs. In
> >> that case it's always expected to have num_vports > 1.
> >
> > In that case, should we add a check and return with -EINVAL otherwise?
> > Thank you!
> >
> 
> Ping
>
It should be fine, please add some log indicating "Unexpected num_vports" before returning error.

Thanks,
Manish
 
> >>>> * Skip both the calculation immediately above and the code
> >>>>     in the if condition below, which is the only place where
> >>>>     the calculated value is used, if num_vports is 1.
> >>>>     I don't think the if clause makes much sense if num_vports is
> >>>> one.left_rate_per_vp is also used below the if clause, it is
> >>>> assigned to
> >>> .min_speed in a for loop. Looking at that code division by 1 seems
> >>> to make sense to me in this case.
> >>>>
> >>>>>        if (left_rate_per_vp <  min_pf_rate / QED_WFQ_UNIT) {
> >>>>>            DP_VERBOSE(p_hwfn, NETIF_MSG_LINK,
> >>>>>                   "Non WFQ configured vports rate [%d Mbps] is
> >>>>> less
> >>> than one
> >>>>> percent of configured PF min rate[%d Mbps]\n",
> >>>>> --
> >>>>> 2.25.1
> >>>>>
Re: [EXT] Re: [PATCH v0] qed/qed_dev: guard against a possible division by zero
Posted by Daniil Tatianin 2 years, 6 months ago
On 3/7/23 8:50 PM, Manish Chopra wrote:
>> -----Original Message-----
>> From: Daniil Tatianin <d-tatianin@yandex-team.ru>
>> Sent: Friday, March 3, 2023 5:48 PM
>> To: Manish Chopra <manishc@marvell.com>; Simon Horman
>> <simon.horman@corigine.com>
>> Cc: Ariel Elior <aelior@marvell.com>; David S. Miller
>> <davem@davemloft.net>; Eric Dumazet <edumazet@google.com>; Jakub
>> Kicinski <kuba@kernel.org>; Paolo Abeni <pabeni@redhat.com>; Yuval Mintz
>> <Yuval.Mintz@qlogic.com>; netdev@vger.kernel.org; linux-
>> kernel@vger.kernel.org
>> Subject: Re: [EXT] Re: [PATCH v0] qed/qed_dev: guard against a possible
>> division by zero
>>
>> On 2/16/23 9:42 AM, Daniil Tatianin wrote:
>>> On 2/16/23 12:20 AM, Manish Chopra wrote:
>>>>> -----Original Message-----
>>>>> From: Daniil Tatianin <d-tatianin@yandex-team.ru>
>>>>> Sent: Tuesday, February 14, 2023 12:53 PM
>>>>> To: Simon Horman <simon.horman@corigine.com>
>>>>> Cc: Ariel Elior <aelior@marvell.com>; Manish Chopra
>>>>> <manishc@marvell.com>; David S. Miller <davem@davemloft.net>; Eric
>>>>> Dumazet <edumazet@google.com>; Jakub Kicinski <kuba@kernel.org>;
>>>>> Paolo Abeni <pabeni@redhat.com>; Yuval Mintz
>>>>> <Yuval.Mintz@qlogic.com>; netdev@vger.kernel.org;
>>>>> linux-kernel@vger.kernel.org
>>>>> Subject: [EXT] Re: [PATCH v0] qed/qed_dev: guard against a possible
>>>>> division by zero
>>>>>
>>>>> External Email
>>>>>
>>>>> --------------------------------------------------------------------
>>>>> --
>>>>>
>>>>>
>>>>> On 2/9/23 2:13 PM, Simon Horman wrote:
>>>>>> On Thu, Feb 09, 2023 at 01:38:13PM +0300, Daniil Tatianin wrote:
>>>>>>> Previously we would divide total_left_rate by zero if num_vports
>>>>>>> happened to be 1 because non_requested_count is calculated as
>>>>>>> num_vports - req_count. Guard against this by explicitly checking
>>>>>>> for zero when doing the division.
>>>>>>>
>>>>>>> Found by Linux Verification Center (linuxtesting.org) with the
>>>>>>> SVACE static analysis tool.
>>>>>>>
>>>>>>> Fixes: bcd197c81f63 ("qed: Add vport WFQ configuration APIs")
>>>>>>> Signed-off-by: Daniil Tatianin <d-tatianin@yandex-team.ru>
>>>>>>> ---
>>>>>>>     drivers/net/ethernet/qlogic/qed/qed_dev.c | 2 +-
>>>>>>>     1 file changed, 1 insertion(+), 1 deletion(-)
>>>>>>>
>>>>>>> diff --git a/drivers/net/ethernet/qlogic/qed/qed_dev.c
>>>>>>> b/drivers/net/ethernet/qlogic/qed/qed_dev.c
>>>>>>> index d61cd32ec3b6..90927f68c459 100644
>>>>>>> --- a/drivers/net/ethernet/qlogic/qed/qed_dev.c
>>>>>>> +++ b/drivers/net/ethernet/qlogic/qed/qed_dev.c
>>>>>>> @@ -5123,7 +5123,7 @@ static int qed_init_wfq_param(struct
>>>>>>> qed_hwfn *p_hwfn,
>>>>>>>
>>>>>>>         total_left_rate    = min_pf_rate - total_req_min_rate;
>>>>>>>
>>>>>>> -    left_rate_per_vp = total_left_rate / non_requested_count;
>>>>>>> +    left_rate_per_vp = total_left_rate / (non_requested_count ?:
>>>>>>> +1);
>>>>>>
>>>>>> I don't know if num_vports can be 1.
>>>>>> But if it is then I agree that the above will be a divide by zero.
>>>>>>
>>>>>> I do, however, wonder if it would be better to either:
>>>>>>
>>>>>> * Treat this case as invalid and return with -EINVAL if num_vports
>>>>>> is 1; or
>>>>> I think that's a good idea considering num_vports == 1 is indeed an
>>>>> invalid value.
>>>>> I'd like to hear a maintainer's opinion on this.
>>>> Practically, this flow will only hit with presence of SR-IOV VFs. In
>>>> that case it's always expected to have num_vports > 1.
>>>
>>> In that case, should we add a check and return with -EINVAL otherwise?
>>> Thank you!
>>>
>>
>> Ping
>>
> It should be fine, please add some log indicating "Unexpected num_vports" before returning error.
> 
> Thanks,
> Manish

Will do. Thank you!

>>>>>> * Skip both the calculation immediately above and the code
>>>>>>      in the if condition below, which is the only place where
>>>>>>      the calculated value is used, if num_vports is 1.
>>>>>>      I don't think the if clause makes much sense if num_vports is
>>>>>> one.left_rate_per_vp is also used below the if clause, it is
>>>>>> assigned to
>>>>> .min_speed in a for loop. Looking at that code division by 1 seems
>>>>> to make sense to me in this case.
>>>>>>
>>>>>>>         if (left_rate_per_vp <  min_pf_rate / QED_WFQ_UNIT) {
>>>>>>>             DP_VERBOSE(p_hwfn, NETIF_MSG_LINK,
>>>>>>>                    "Non WFQ configured vports rate [%d Mbps] is
>>>>>>> less
>>>>> than one
>>>>>>> percent of configured PF min rate[%d Mbps]\n",
>>>>>>> --
>>>>>>> 2.25.1
>>>>>>>