From: dmukhin@ford.com
To: Teddy Astie <teddy.astie@vates.tech>
Cc: dmukhin@ford.com, xen-devel@lists.xenproject.org,
andrew.cooper3@citrix.com, anthony.perard@vates.tech,
jbeulich@suse.com, julien@xen.org, michal.orzel@amd.com,
roger.pau@citrix.com, sstabellini@kernel.org
Subject: Re: [PATCH v3 2/4] xen/console: correct leaky-bucket rate limiter
Date: Fri, 17 Jul 2026 19:55:13 -0700 [thread overview]
Message-ID: <alrrESRtt7pkLowv@kraken> (raw)
In-Reply-To: <1784195449.8631fc262581453bbf619ec5b2062170.19f6a5603fd000edb5@vates.tech>
On Thu, Jul 16, 2026 at 11:50:48AM +0200, Teddy Astie wrote:
> Le 15/07/2026 à 22:24, dmukhin@ford.com a écrit :
> > From: Denis Mukhin <dmukhin@ford.com>
> >
> > Use existing printk_ratelimit_ms and printk_ratelimit_burst variables in
> > do_printk_ratelimit() instead of hardcoded values 5000 and 10 respectively.
> >
> > Ensure rate limiter is disabled if either printk_ratelimit_ms or
> > printk_ratelimit_burst is 0. Make sure no unnecessary initialization is done
> > in the corner case.
> >
> > Also, simplify the limiter code by using min().
> >
> > Signed-off-by: Denis Mukhin <dmukhin@ford.com>
> > ---
> > Changes since v2:
> > - fixed typing and 32-bit integer overflow problem
> > ---
> > xen/drivers/char/console.c | 21 +++++++++++++--------
> > 1 file changed, 13 insertions(+), 8 deletions(-)
> >
> > diff --git a/xen/drivers/char/console.c b/xen/drivers/char/console.c
> > index 5d395f882e08..de9f2432445d 100644
> > --- a/xen/drivers/char/console.c
> > +++ b/xen/drivers/char/console.c
> > @@ -1274,21 +1274,26 @@ bool __printk_ratelimit(unsigned int ratelimit_ms,
> > unsigned int ratelimit_burst)
> > {
> > static DEFINE_SPINLOCK(ratelimit_lock);
> > - static unsigned long toks = 10 * 5 * 1000;
> > - static unsigned long last_msg;
> > + static unsigned long long toks, last_msg;
> > static unsigned int missed;
> > + unsigned long long now, limit;
> > unsigned long flags;
> > - unsigned long long now = NOW(); /* ns */
> > - unsigned long ms;
> > + s_time_t ms;
> > - do_div(now, 1000000);
> > - ms = (unsigned long)now;
> > + if ( !ratelimit_burst || !ratelimit_burst )
>
> Do you intend here ( !ratelimit_ms || !ratelimit_burst ) ?
Whoops, thanks for the catch!
>
> > + return true;
> > +
> > + limit = min(ratelimit_burst * ratelimit_ms, UINT_MAX);
>
> That looks no-op (at least at first stance), as UINT_MAX is the largest
> unsigned int value; hence `ratelimit_burst * ratelimit_ms` (both unsigned
> int) can't be larger than it; even if it overflows.
>
> I think we need to cast both ratelimit_ms and ratelimit_burst to unsigned
> long long before doing the multiply, so that the multiply can't overflow
> (not sure exactly how to write it without being too verbose though).
>
> https://godbolt.org/z/sxWaPM3cr
>
> > + if ( !toks )
> > + toks = limit;
> > +
> > + now = NOW(); /* ns */
> > + ms = do_div(now, MILLISECS(1));
> > spin_lock_irqsave(&ratelimit_lock, flags);
> > toks += ms - last_msg;
> > last_msg = ms;
> > - if ( toks > (ratelimit_burst * ratelimit_ms))
> > - toks = ratelimit_burst * ratelimit_ms;
> > + toks = min(toks, limit);
> > if ( toks >= ratelimit_ms )
> > {
> > unsigned int lost = missed;
>
> With the if part fixed and the adjustments in the limit computation (cast to
> unsigned long long before the multiply) :
> Reviewed-by: Teddy Astie <teddy.astie@vates.tech>
>
> Teddy
next prev parent reply other threads:[~2026-07-18 2:55 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-15 20:18 [PATCH v3 0/4] xen/console: updates to rate-limiting dmukhin
2026-07-15 20:18 ` [PATCH v3 1/4] xen/console: use bool as return value from printk_ratelimit() dmukhin
2026-07-16 9:23 ` Teddy Astie
2026-07-15 20:19 ` [PATCH v3 2/4] xen/console: correct leaky-bucket rate limiter dmukhin
2026-07-16 9:50 ` Teddy Astie
2026-07-16 10:26 ` Jan Beulich
2026-07-18 2:55 ` dmukhin [this message]
2026-07-16 15:38 ` Jan Beulich
2026-07-15 20:19 ` [PATCH v3 3/4] xen/console: add build-time rate-limiting controls dmukhin
2026-07-16 9:59 ` Teddy Astie
2026-07-16 15:44 ` Jan Beulich
2026-07-18 2:34 ` dmukhin
2026-07-18 2:54 ` dmukhin
2026-07-15 20:19 ` [PATCH v3 4/4] xen/console: reduce number of printouts in __printk_ratelimit() dmukhin
2026-07-16 10:02 ` Teddy Astie
2026-07-16 15:49 ` Jan Beulich
2026-07-18 2:29 ` dmukhin
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=alrrESRtt7pkLowv@kraken \
--to=dmukhin@ford.com \
--cc=andrew.cooper3@citrix.com \
--cc=anthony.perard@vates.tech \
--cc=jbeulich@suse.com \
--cc=julien@xen.org \
--cc=michal.orzel@amd.com \
--cc=roger.pau@citrix.com \
--cc=sstabellini@kernel.org \
--cc=teddy.astie@vates.tech \
--cc=xen-devel@lists.xenproject.org \
/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.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox