* [bbr3] Suspicious use of bbr_param
@ 2024-12-24 21:04 Oleksandr Natalenko
2024-12-25 12:40 ` Holger Hoffstätte
0 siblings, 1 reply; 2+ messages in thread
From: Oleksandr Natalenko @ 2024-12-24 21:04 UTC (permalink / raw)
To: Neal Cardwell; +Cc: netdev, linux-kernel
[-- Attachment #1: Type: text/plain, Size: 3071 bytes --]
Hello Neal.
One of my users reports [1] that BBRv3 from [2] cannot be built with LLVM=1 and WERROR=y because of the following warnings:
net/ipv4/tcp_bbr.c:1079:48: warning: use of logical '&&' with constant operand [-Wconstant-logical-operand]
1079 | if (!bbr->ecn_eligible && bbr_can_use_ecn(sk) &&
| ^
1080 | bbr_param(sk, ecn_factor) &&
| ~~~~~~~~~~~~~~~~~~~~~~~~~
net/ipv4/tcp_bbr.c:1079:48: note: use '&' for a bitwise operation
1079 | if (!bbr->ecn_eligible && bbr_can_use_ecn(sk) &&
| ^~
| &
net/ipv4/tcp_bbr.c:1079:48: note: remove constant to silence this warning
1079 | if (!bbr->ecn_eligible && bbr_can_use_ecn(sk) &&
| ^~
1080 | bbr_param(sk, ecn_factor) &&
| ~~~~~~~~~~~~~~~~~~~~~~~~~
net/ipv4/tcp_bbr.c:1187:24: warning: use of logical '&&' with constant operand [-Wconstant-logical-operand]
1187 | bbr->ecn_eligible && bbr_param(sk, ecn_thresh)) {
| ^ ~~~~~~~~~~~~~~~~~~~~~~~~~
net/ipv4/tcp_bbr.c:1187:24: note: use '&' for a bitwise operation
1187 | bbr->ecn_eligible && bbr_param(sk, ecn_thresh)) {
| ^~
| &
net/ipv4/tcp_bbr.c:1187:24: note: remove constant to silence this warning
1187 | bbr->ecn_eligible && bbr_param(sk, ecn_thresh)) {
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
net/ipv4/tcp_bbr.c:1385:24: warning: use of logical '&&' with constant operand [-Wconstant-logical-operand]
1385 | if (bbr->ecn_in_round && bbr_param(sk, ecn_factor)) {
| ^ ~~~~~~~~~~~~~~~~~~~~~~~~~
net/ipv4/tcp_bbr.c:1385:24: note: use '&' for a bitwise operation
1385 | if (bbr->ecn_in_round && bbr_param(sk, ecn_factor)) {
| ^~
| &
net/ipv4/tcp_bbr.c:1385:24: note: remove constant to silence this warning
1385 | if (bbr->ecn_in_round && bbr_param(sk, ecn_factor)) {
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
3 warnings generated.
The usage of bbr_param() with ecn_thresh and ecn_factor here does indeed look suspicious. In both cases, the bbr_param() macro gets evaluated to `static const u32` values, and those get &&'ed in the if statements. The consts are positive, so they do not have any impact in the conditional expressions. FWIW, the sk argument is dropped by the macro altogether, so I'm not sure what was the intention here.
Interestingly, unlike Clang, GCC stays silent.
Could you please comment on this?
Appreciate your time, and looking forward to your reply.
Thank you.
[1] https://codeberg.org/pf-kernel/linux/issues/11
[2] https://github.com/google/bbr
--
Oleksandr Natalenko, MSE
[-- Attachment #2: This is a digitally signed message part. --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [bbr3] Suspicious use of bbr_param
2024-12-24 21:04 [bbr3] Suspicious use of bbr_param Oleksandr Natalenko
@ 2024-12-25 12:40 ` Holger Hoffstätte
0 siblings, 0 replies; 2+ messages in thread
From: Holger Hoffstätte @ 2024-12-25 12:40 UTC (permalink / raw)
To: Oleksandr Natalenko, Neal Cardwell; +Cc: netdev, linux-kernel
On 2024-12-24 22:04, Oleksandr Natalenko wrote:
> Hello Neal.
>
> One of my users reports [1] that BBRv3 from [2] cannot be built with LLVM=1 and WERROR=y because of the following warnings:
>
> net/ipv4/tcp_bbr.c:1079:48: warning: use of logical '&&' with constant operand [-Wconstant-logical-operand]
> 1079 | if (!bbr->ecn_eligible && bbr_can_use_ecn(sk) &&
> | ^
> 1080 | bbr_param(sk, ecn_factor) &&
> | ~~~~~~~~~~~~~~~~~~~~~~~~~
> net/ipv4/tcp_bbr.c:1079:48: note: use '&' for a bitwise operation
> 1079 | if (!bbr->ecn_eligible && bbr_can_use_ecn(sk) &&
> | ^~
> | &
> net/ipv4/tcp_bbr.c:1079:48: note: remove constant to silence this warning
> 1079 | if (!bbr->ecn_eligible && bbr_can_use_ecn(sk) &&
> | ^~
> 1080 | bbr_param(sk, ecn_factor) &&
> | ~~~~~~~~~~~~~~~~~~~~~~~~~
> net/ipv4/tcp_bbr.c:1187:24: warning: use of logical '&&' with constant operand [-Wconstant-logical-operand]
> 1187 | bbr->ecn_eligible && bbr_param(sk, ecn_thresh)) {
> | ^ ~~~~~~~~~~~~~~~~~~~~~~~~~
> net/ipv4/tcp_bbr.c:1187:24: note: use '&' for a bitwise operation
> 1187 | bbr->ecn_eligible && bbr_param(sk, ecn_thresh)) {
> | ^~
> | &
> net/ipv4/tcp_bbr.c:1187:24: note: remove constant to silence this warning
> 1187 | bbr->ecn_eligible && bbr_param(sk, ecn_thresh)) {
> | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
> net/ipv4/tcp_bbr.c:1385:24: warning: use of logical '&&' with constant operand [-Wconstant-logical-operand]
> 1385 | if (bbr->ecn_in_round && bbr_param(sk, ecn_factor)) {
> | ^ ~~~~~~~~~~~~~~~~~~~~~~~~~
> net/ipv4/tcp_bbr.c:1385:24: note: use '&' for a bitwise operation
> 1385 | if (bbr->ecn_in_round && bbr_param(sk, ecn_factor)) {
> | ^~
> | &
> net/ipv4/tcp_bbr.c:1385:24: note: remove constant to silence this warning
> 1385 | if (bbr->ecn_in_round && bbr_param(sk, ecn_factor)) {
> | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
> 3 warnings generated.
>
> The usage of bbr_param() with ecn_thresh and ecn_factor here does indeed look suspicious. In both cases, the bbr_param() macro gets evaluated to `static const u32` values, and those get &&'ed in the if statements. The consts are positive, so they do not have any impact in the conditional expressions. FWIW, the sk argument is dropped by the macro altogether, so I'm not sure what was the intention here.
>
> Interestingly, unlike Clang, GCC stays silent.
This looks a lot like https://github.com/llvm/llvm-project/issues/75199
Judging by the number of related issues and PRs this seems to be a known problem,
and to me it looks like clang's complaint is "technically correct" while going
against "common in reality" usage.
Many projects seem to use -Wno-constant-logical-operand to work around this.
cheers
Holger
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2024-12-25 12:50 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-12-24 21:04 [bbr3] Suspicious use of bbr_param Oleksandr Natalenko
2024-12-25 12:40 ` Holger Hoffstätte
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox