[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] console: make printk_ratelimit_{burst,ms} const



On Mon, Aug 04, 2025 at 09:10:34AM +0200, Jan Beulich wrote:
> On 01.08.2025 20:58, dmkhn@xxxxxxxxx wrote:
> > On Fri, Aug 01, 2025 at 09:30:34AM +0200, Jan Beulich wrote:
> >> Them not being altered by any means, their __read_mostly attribute is
> >> actually counter-productive: It causes the compiler to instantiate the
> >> variables, when already with just the attributes dropped the compiler
> >> can constant-propagate the values into the sole use site. Make the
> >> situation yet more explicit by adding const.
> >>
> >> Also switch the variables away from being plain int, and have the
> >> parameters of __printk_ratelimit() follow suit. While there also
> >> similarly adjust the type of "missed" and "lost", and - while touching
> >> the adjacent line - increase lost_str[] to accommodate any unsigned
> >> 32-bit number.
> >>
> >> Fixes: a8b1845a7845 ("Miscellaneous data placement adjustments")
> >> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
> >> ---
> >> In principle {__,}printk_ratelimit() may also want to have their return
> >> type changed to bool, but I think doing so would go too far here: This
> >> would have knock-on effects elsewhere, and it would want considering to
> >> actually flip polarity.
> >>
> >> Despite the Fixes: tag I wouldn't consider this for backport.
> >>
> >> --- a/xen/drivers/char/console.c
> >> +++ b/xen/drivers/char/console.c
> >> @@ -1268,12 +1268,12 @@ void console_end_sync(void)
> >>   * This enforces a rate limit: not more than one kernel message
> >>   * every printk_ratelimit_ms (millisecs).
> >>   */
> >> -int __printk_ratelimit(int ratelimit_ms, int ratelimit_burst)
> >> +int __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 int missed;
> >> +    static unsigned int missed;
> >>      unsigned long flags;
> >>      unsigned long long now = NOW(); /* ns */
> >>      unsigned long ms;
> >> @@ -1288,14 +1288,16 @@ int __printk_ratelimit(int ratelimit_ms,
> >>          toks = ratelimit_burst * ratelimit_ms;
> >>      if ( toks >= ratelimit_ms )
> >>      {
> >> -        int lost = missed;
> >> +        unsigned int lost = missed;
> >> +
> >>          missed = 0;
> >>          toks -= ratelimit_ms;
> >>          spin_unlock(&ratelimit_lock);
> >>          if ( lost )
> >>          {
> >> -            char lost_str[8];
> >> -            snprintf(lost_str, sizeof(lost_str), "%d", lost);
> >> +            char lost_str[10];
> >> +
> >> +            snprintf(lost_str, sizeof(lost_str), "%u", lost);
> >
> > Since this code is touched, I would also simplify the entire `if ( lost )`
> > block (I have it done in another experiment):
> >
> >             char lost_str[64];
> >             size_t lost_len = snprintf(lost_str, sizeof(lost_str),
> >                                        "printk: %d messages suppressed.\n",
> >                                        lost_str);
> >
> >             /* console_lock may already be acquired by printk(). */
> >             rspin_lock(&console_lock);
> >             printk_start_of_line(CONSOLE_PREFIX, cflags);
> >             __putstr(lost_str, lost_len);
> >             ...
> >
> > What do you think?
> 
> Maybe, but definitely not right in this patch.

Sure, please consider

Reviewed-by: Denis Mukhin <dmukhin@xxxxxxxx> 




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.