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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.