From: Stefano Brivio <sbrivio@redhat.com>
To: David Gibson <david@gibson.dropbear.id.au>
Cc: passt-dev@passt.top
Subject: Re: [PATCH] tcp: Avoid comparison of expressions with different signedness in RTT_SET()
Date: Fri, 06 Mar 2026 08:02:26 +0100 (CET) [thread overview]
Message-ID: <20260306080122.22ff92e4@elisabeth> (raw)
In-Reply-To: <aajrKNIz0WUuxISb@zatzit>
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.
> 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.
--
Stefano
next prev parent reply other threads:[~2026-03-06 7:02 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 [this message]
2026-03-06 12:05 ` David Gibson
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=20260306080122.22ff92e4@elisabeth \
--to=sbrivio@redhat.com \
--cc=david@gibson.dropbear.id.au \
--cc=passt-dev@passt.top \
/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).