summaryrefslogtreecommitdiff
path: root/include/linux
diff options
context:
space:
mode:
authorPaul E. McKenney <paulmck@kernel.org>2025-03-14 19:07:13 +0300
committerPaul E. McKenney <paulmck@kernel.org>2025-05-09 02:13:26 +0300
commit78bf44de47b3cec72ee8ddc14161d5b3212f25e0 (patch)
treef33255e578260c722fbec02d12b8714303fd6c28 /include/linux
parentc6f7f1b2c0ff46b9069a8fbc7d167c9ead66dfce (diff)
downloadlinux-78bf44de47b3cec72ee8ddc14161d5b3212f25e0.tar.xz
ratelimit: Convert the ->missed field to atomic_t
The ratelimit_state structure's ->missed field is sometimes incremented locklessly, and it would be good to avoid lost counts. This is also needed to count the number of misses due to trylock failure. Therefore, convert the ratelimit_state structure's ->missed field to atomic_t. 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 <paulmck@kernel.org> Reviewed-by: Petr 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>
Diffstat (limited to 'include/linux')
-rw-r--r--include/linux/ratelimit.h9
-rw-r--r--include/linux/ratelimit_types.h2
2 files changed, 4 insertions, 7 deletions
diff --git a/include/linux/ratelimit.h b/include/linux/ratelimit.h
index 8400c5356c18..c78b92b3e5cd 100644
--- a/include/linux/ratelimit.h
+++ b/include/linux/ratelimit.h
@@ -24,20 +24,17 @@ static inline void ratelimit_default_init(struct ratelimit_state *rs)
static inline void ratelimit_state_inc_miss(struct ratelimit_state *rs)
{
- rs->missed++;
+ atomic_inc(&rs->missed);
}
static inline int ratelimit_state_get_miss(struct ratelimit_state *rs)
{
- return rs->missed;
+ return atomic_read(&rs->missed);
}
static inline int ratelimit_state_reset_miss(struct ratelimit_state *rs)
{
- int ret = rs->missed;
-
- rs->missed = 0;
- return ret;
+ return atomic_xchg_relaxed(&rs->missed, 0);
}
static inline void ratelimit_state_reset_interval(struct ratelimit_state *rs, int interval_init)
diff --git a/include/linux/ratelimit_types.h b/include/linux/ratelimit_types.h
index 765232ce0b5e..d21fe82b67f6 100644
--- a/include/linux/ratelimit_types.h
+++ b/include/linux/ratelimit_types.h
@@ -18,7 +18,7 @@ struct ratelimit_state {
int interval;
int burst;
int printed;
- int missed;
+ atomic_t missed;
unsigned int flags;
unsigned long begin;
};