diff mbox series

[net-next] net: ipa: always inline ipa_aggr_granularity_val()

Message ID 20210810160213.2257424-1-elder@linaro.org
State New
Headers show
Series [net-next] net: ipa: always inline ipa_aggr_granularity_val() | expand

Commit Message

Alex Elder Aug. 10, 2021, 4:02 p.m. UTC
It isn't required, but all callers of ipa_aggr_granularity_val()
pass a constant value (IPA_AGGR_GRANULARITY) as the usec argument.
Two of those callers are in ipa_validate_build(), with the result
being passed to BUILD_BUG_ON().

Evidently the "sparc64-linux-gcc" compiler (at least) doesn't always
inline ipa_aggr_granularity_val(), so the result of the function is
not constant at compile time, and that leads to build errors.

Define the function with the __always_inline attribute to avoid the
errors.  And given that the function is inline, we can switch the
WARN_ON() there to be BUILD_BUG_ON().

Fixes: 5bc5588466a1f ("net: ipa: use WARN_ON() rather than assertions")
Reported-by: kernel test robot <lkp@intel.com>
Signed-off-by: Alex Elder <elder@linaro.org>

---

David/Jakub, this fixes a bug in a commit in net-next/master.  -Alex

 drivers/net/ipa/ipa_main.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

-- 
2.27.0

Comments

Leon Romanovsky Aug. 11, 2021, 12:02 p.m. UTC | #1
On Tue, Aug 10, 2021 at 11:02:13AM -0500, Alex Elder wrote:
> It isn't required, but all callers of ipa_aggr_granularity_val()

> pass a constant value (IPA_AGGR_GRANULARITY) as the usec argument.

> Two of those callers are in ipa_validate_build(), with the result

> being passed to BUILD_BUG_ON().

> 

> Evidently the "sparc64-linux-gcc" compiler (at least) doesn't always

> inline ipa_aggr_granularity_val(), so the result of the function is

> not constant at compile time, and that leads to build errors.

> 

> Define the function with the __always_inline attribute to avoid the

> errors.  And given that the function is inline, we can switch the

> WARN_ON() there to be BUILD_BUG_ON().

> 

> Fixes: 5bc5588466a1f ("net: ipa: use WARN_ON() rather than assertions")

> Reported-by: kernel test robot <lkp@intel.com>

> Signed-off-by: Alex Elder <elder@linaro.org>

> ---

> 

> David/Jakub, this fixes a bug in a commit in net-next/master.  -Alex

> 

>  drivers/net/ipa/ipa_main.c | 4 ++--

>  1 file changed, 2 insertions(+), 2 deletions(-)

> 

> diff --git a/drivers/net/ipa/ipa_main.c b/drivers/net/ipa/ipa_main.c

> index 25bbb456e0078..f90b3521e266b 100644

> --- a/drivers/net/ipa/ipa_main.c

> +++ b/drivers/net/ipa/ipa_main.c

> @@ -255,9 +255,9 @@ ipa_hardware_config_qsb(struct ipa *ipa, const struct ipa_data *data)

>   * less than the number of timer ticks in the requested period.  0 is not

>   * a valid granularity value.

>   */

> -static u32 ipa_aggr_granularity_val(u32 usec)

> +static __always_inline u32 ipa_aggr_granularity_val(u32 usec)

>  {

> -	WARN_ON(!usec);

> +	BUILD_BUG_ON(!usec);


So what exactly are you checking here if all callers pass same value?
It is in-kernel API, declared as static inside one module. There is no
need to protect from itself.

Thanks

>  

>  	return DIV_ROUND_CLOSEST(usec * TIMER_FREQUENCY, USEC_PER_SEC) - 1;

>  }

> -- 

> 2.27.0

>
Alex Elder Aug. 11, 2021, 12:06 p.m. UTC | #2
On 8/11/21 7:02 AM, Leon Romanovsky wrote:
> On Tue, Aug 10, 2021 at 11:02:13AM -0500, Alex Elder wrote:

>> It isn't required, but all callers of ipa_aggr_granularity_val()

>> pass a constant value (IPA_AGGR_GRANULARITY) as the usec argument.

>> Two of those callers are in ipa_validate_build(), with the result

>> being passed to BUILD_BUG_ON().

>>

>> Evidently the "sparc64-linux-gcc" compiler (at least) doesn't always

>> inline ipa_aggr_granularity_val(), so the result of the function is

>> not constant at compile time, and that leads to build errors.

>>

>> Define the function with the __always_inline attribute to avoid the

>> errors.  And given that the function is inline, we can switch the

>> WARN_ON() there to be BUILD_BUG_ON().

>>

>> Fixes: 5bc5588466a1f ("net: ipa: use WARN_ON() rather than assertions")

>> Reported-by: kernel test robot <lkp@intel.com>

>> Signed-off-by: Alex Elder <elder@linaro.org>

>> ---

>>

>> David/Jakub, this fixes a bug in a commit in net-next/master.  -Alex

>>

>>  drivers/net/ipa/ipa_main.c | 4 ++--

>>  1 file changed, 2 insertions(+), 2 deletions(-)

>>

>> diff --git a/drivers/net/ipa/ipa_main.c b/drivers/net/ipa/ipa_main.c

>> index 25bbb456e0078..f90b3521e266b 100644

>> --- a/drivers/net/ipa/ipa_main.c

>> +++ b/drivers/net/ipa/ipa_main.c

>> @@ -255,9 +255,9 @@ ipa_hardware_config_qsb(struct ipa *ipa, const struct ipa_data *data)

>>   * less than the number of timer ticks in the requested period.  0 is not

>>   * a valid granularity value.

>>   */

>> -static u32 ipa_aggr_granularity_val(u32 usec)

>> +static __always_inline u32 ipa_aggr_granularity_val(u32 usec)

>>  {

>> -	WARN_ON(!usec);

>> +	BUILD_BUG_ON(!usec);

> 

> So what exactly are you checking here if all callers pass same value?

> It is in-kernel API, declared as static inside one module. There is no

> need to protect from itself.


Yeah that's a good point.  It can just as well be removed.
I think the check was added before I knew it was only going
to be used with a single constant value.  That said, the
point was to check at runtime a required constraint.

I'll post version 2 that simply removes it.  Thanks.

					-Alex

> 

> Thanks

> 

>>  

>>  	return DIV_ROUND_CLOSEST(usec * TIMER_FREQUENCY, USEC_PER_SEC) - 1;

>>  }

>> -- 

>> 2.27.0

>>
Leon Romanovsky Aug. 11, 2021, 12:12 p.m. UTC | #3
On Wed, Aug 11, 2021 at 07:06:01AM -0500, Alex Elder wrote:
> On 8/11/21 7:02 AM, Leon Romanovsky wrote:

> > On Tue, Aug 10, 2021 at 11:02:13AM -0500, Alex Elder wrote:

> >> It isn't required, but all callers of ipa_aggr_granularity_val()

> >> pass a constant value (IPA_AGGR_GRANULARITY) as the usec argument.

> >> Two of those callers are in ipa_validate_build(), with the result

> >> being passed to BUILD_BUG_ON().

> >>

> >> Evidently the "sparc64-linux-gcc" compiler (at least) doesn't always

> >> inline ipa_aggr_granularity_val(), so the result of the function is

> >> not constant at compile time, and that leads to build errors.

> >>

> >> Define the function with the __always_inline attribute to avoid the

> >> errors.  And given that the function is inline, we can switch the

> >> WARN_ON() there to be BUILD_BUG_ON().

> >>

> >> Fixes: 5bc5588466a1f ("net: ipa: use WARN_ON() rather than assertions")

> >> Reported-by: kernel test robot <lkp@intel.com>

> >> Signed-off-by: Alex Elder <elder@linaro.org>

> >> ---

> >>

> >> David/Jakub, this fixes a bug in a commit in net-next/master.  -Alex

> >>

> >>  drivers/net/ipa/ipa_main.c | 4 ++--

> >>  1 file changed, 2 insertions(+), 2 deletions(-)

> >>

> >> diff --git a/drivers/net/ipa/ipa_main.c b/drivers/net/ipa/ipa_main.c

> >> index 25bbb456e0078..f90b3521e266b 100644

> >> --- a/drivers/net/ipa/ipa_main.c

> >> +++ b/drivers/net/ipa/ipa_main.c

> >> @@ -255,9 +255,9 @@ ipa_hardware_config_qsb(struct ipa *ipa, const struct ipa_data *data)

> >>   * less than the number of timer ticks in the requested period.  0 is not

> >>   * a valid granularity value.

> >>   */

> >> -static u32 ipa_aggr_granularity_val(u32 usec)

> >> +static __always_inline u32 ipa_aggr_granularity_val(u32 usec)

> >>  {

> >> -	WARN_ON(!usec);

> >> +	BUILD_BUG_ON(!usec);

> > 

> > So what exactly are you checking here if all callers pass same value?

> > It is in-kernel API, declared as static inside one module. There is no

> > need to protect from itself.

> 

> Yeah that's a good point.  It can just as well be removed.

> I think the check was added before I knew it was only going

> to be used with a single constant value.  That said, the

> point was to check at runtime a required constraint.

> 

> I'll post version 2 that simply removes it.  Thanks.


Thanks
> 

> 					-Alex

> 

> > 

> > Thanks

> > 

> >>  

> >>  	return DIV_ROUND_CLOSEST(usec * TIMER_FREQUENCY, USEC_PER_SEC) - 1;

> >>  }

> >> -- 

> >> 2.27.0

> >>

>
diff mbox series

Patch

diff --git a/drivers/net/ipa/ipa_main.c b/drivers/net/ipa/ipa_main.c
index 25bbb456e0078..f90b3521e266b 100644
--- a/drivers/net/ipa/ipa_main.c
+++ b/drivers/net/ipa/ipa_main.c
@@ -255,9 +255,9 @@  ipa_hardware_config_qsb(struct ipa *ipa, const struct ipa_data *data)
  * less than the number of timer ticks in the requested period.  0 is not
  * a valid granularity value.
  */
-static u32 ipa_aggr_granularity_val(u32 usec)
+static __always_inline u32 ipa_aggr_granularity_val(u32 usec)
 {
-	WARN_ON(!usec);
+	BUILD_BUG_ON(!usec);
 
 	return DIV_ROUND_CLOSEST(usec * TIMER_FREQUENCY, USEC_PER_SEC) - 1;
 }