From: Paul E. McKenney Date: Mon, 14 Apr 2025 22:43:47 +0000 (-0700) Subject: ratelimit: Avoid atomic decrement if already rate-limited X-Git-Tag: v6.16-rc1~178^2~7 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=123a1d97b2baf9eba9662a5f65660edc317e0bb8;p=thirdparty%2Fkernel%2Flinux.git ratelimit: Avoid atomic decrement if already rate-limited Currently, if the lock could not be acquired, the code unconditionally does an atomic decrement on ->rs_n_left, even if that atomic operation is guaranteed to return a limit-rate verdict. This incurs needless overhead and also raises the spectre of counter wrap. Therefore, do the atomic decrement only if there is some chance that rates won't be limited. Link: https://lore.kernel.org/all/fbe93a52-365e-47fe-93a4-44a44547d601@paulmck-laptop/ Link: https://lore.kernel.org/all/20250423115409.3425-1-spasswolf@web.de/ Signed-off-by: Paul E. McKenney Reviewed-by: Petr Mladek Cc: Andrew Morton Cc: Kuniyuki Iwashima Cc: Mateusz Guzik Cc: Steven Rostedt Cc: John Ogness Cc: Sergey Senozhatsky --- diff --git a/lib/ratelimit.c b/lib/ratelimit.c index 4e520d029d28f..a7aaebb7a7189 100644 --- a/lib/ratelimit.c +++ b/lib/ratelimit.c @@ -65,8 +65,10 @@ int ___ratelimit(struct ratelimit_state *rs, const char *func) unsigned int rs_flags = READ_ONCE(rs->flags); if (rs_flags & RATELIMIT_INITIALIZED && burst) { - int n_left; + int n_left = atomic_read(&rs->rs_n_left); + if (n_left <= 0) + return 0; n_left = atomic_dec_return(&rs->rs_n_left); if (n_left >= 0) return 1;