From 123a1d97b2baf9eba9662a5f65660edc317e0bb8 Mon Sep 17 00:00:00 2001 From: "Paul E. McKenney" Date: Mon, 14 Apr 2025 15:43:47 -0700 Subject: [PATCH] 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 --- lib/ratelimit.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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; -- 2.47.2