From: David Gibson <david@gibson.dropbear.id.au>
To: Stefano Brivio <sbrivio@redhat.com>
Cc: passt-dev@passt.top
Subject: Re: [PATCH] tcp: Avoid comparison of expressions with different signedness in RTT_SET()
Date: Fri, 6 Mar 2026 23:05:38 +1100 [thread overview]
Message-ID: <aarDEtDUnzOO_HnJ@zatzit> (raw)
In-Reply-To: <20260306080122.22ff92e4@elisabeth>
[-- Attachment #1: Type: text/plain, Size: 3346 bytes --]
On Fri, Mar 06, 2026 at 08:02:26AM +0100, Stefano Brivio wrote:
> On Thu, 5 Mar 2026 13:32:08 +1100
> David Gibson <david@gibson.dropbear.id.au> wrote:
>
> > On Wed, Mar 04, 2026 at 05:32:32PM +0100, Stefano Brivio wrote:
> > > With gcc 14.2, building against musl 1.2.5 (slightly outdated Alpine
> > > on x86_64):
> > >
> > > tcp.c: In function 'tcp_update_seqack_wnd':
> > > util.h:40:39: warning: comparison of integer expressions of different signedness: 'unsigned int' and 'int' [-Wsign-compare]
> > > 40 | #define MIN(x, y) (((x) < (y)) ? (x) : (y))
> > > | ^
> > > tcp_conn.h:63:26: note: in expansion of macro 'MIN'
> > > 63 | (conn->rtt_exp = MIN(RTT_EXP_MAX, ilog2(MAX(1, rtt / RTT_STORE_MIN))))
> > > | ^~~
> > > tcp.c:1234:17: note: in expansion of macro 'RTT_SET'
> > > 1234 | RTT_SET(conn, tinfo->tcpi_rtt);
> > > | ^~~~~~~
> > > util.h:40:54: warning: operand of '?:' changes signedness from 'int' to 'unsigned int' due to unsignedness of other operand [-Wsign-compare]
> > > 40 | #define MIN(x, y) (((x) < (y)) ? (x) : (y))
> > > | ^~~
> > > tcp_conn.h:63:26: note: in expansion of macro 'MIN'
> > > 63 | (conn->rtt_exp = MIN(RTT_EXP_MAX, ilog2(MAX(1, rtt / RTT_STORE_MIN))))
> > > | ^~~
> > > tcp.c:1234:17: note: in expansion of macro 'RTT_SET'
> > > 1234 | RTT_SET(conn, tinfo->tcpi_rtt);
> > > | ^~~~~~~
> > >
> > > for some reason, that's not reported by gcc with glibc.
> > >
> > > Cast the result of ilog2() to unsigned before using it, as it's always
> > > positive the way we're using it. Should this ever break this for
> > > whatever unlikely reason, RTT_EXP_MAX is the fallback value we want to
> > > use anyway.
> > >
> > > Fixes: 000601ba86da ("tcp: Adaptive interval based on RTT for socket-side acknowledgement checks")
> > > Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
> >
> > This is correct, so
> >
> > Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
> >
> > It's kind of inelegant, though - ilog2() only returns a signed to
> > report an error case, which we avoid with the MAX inside the argument.
> > That's not a super obvious connection. I guess we could do:
> >
> > (unsigned)MAX(0, ilog2(rtt / RTT_STORE_MIN))
> >
> > which should be equivalent and makes it slightly more obvious that the
> > cast is safe. Not sure if it's really an improvement, though.
>
> Right, yes, at this point I guess it's clearer. Changed to that in v2.
Ok.
> > This is the only user of ilog2(), so we could also consider replacing
> > it with a version that explicitly clamps its argument to >= 1 and
> > returns unsigned.
>
> I thought about doing that, but on the other hand we would have a
> rather arithmetic function returning an obviously wrong value for some
> arguments, which doesn't sound great either.
Yeah, fair point.
--
David Gibson (he or they) | I'll have my music baroque, and my code
david AT gibson.dropbear.id.au | minimalist, thank you, not the other way
| around.
http://www.ozlabs.org/~dgibson
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
prev parent reply other threads:[~2026-03-06 12:08 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-04 16:32 Stefano Brivio
2026-03-05 2:32 ` David Gibson
2026-03-06 7:02 ` Stefano Brivio
2026-03-06 12:05 ` David Gibson [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=aarDEtDUnzOO_HnJ@zatzit \
--to=david@gibson.dropbear.id.au \
--cc=passt-dev@passt.top \
--cc=sbrivio@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://passt.top/passt
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for IMAP folder(s).