Commit 123a1d97 authored by Paul E. McKenney's avatar Paul E. McKenney
Browse files

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: default avatarPaul E. McKenney <paulmck@kernel.org>
Reviewed-by: default avatarPetr Mladek <pmladek@suse.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Kuniyuki Iwashima <kuniyu@amazon.com>
Cc: Mateusz Guzik <mjguzik@gmail.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: John Ogness <john.ogness@linutronix.de>
Cc: Sergey Senozhatsky <senozhatsky@chromium.org>
parent 21ac6e5e
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -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;