mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-11 15:40:50 +00:00
979f693def
I'd like to use printk_ratelimit() in atomic context, but that's not possible right now due to the spinlock usage this commit introduced more than a year ago: 717115e: printk ratelimiting rewrite As a first step push the lock into the ratelimit state structure. This allows us to deal with locking failures to be considered as an event related to that state being too busy. Also clean up the code a bit (without changing functionality): - tidy up the definitions - clean up the code flow This also shrinks the code a tiny bit: text data bss dec hex filename 264 0 4 268 10c ratelimit.o.before 255 0 0 255 ff ratelimit.o.after ( Whole-kernel data size got a bit larger, because we have two ratelimit-state data structures right now. ) Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: David S. Miller <davem@davemloft.net> LKML-Reference: <new-submission> Signed-off-by: Ingo Molnar <mingo@elte.hu>
31 lines
663 B
C
31 lines
663 B
C
#ifndef _LINUX_RATELIMIT_H
|
|
#define _LINUX_RATELIMIT_H
|
|
|
|
#include <linux/param.h>
|
|
#include <linux/spinlock_types.h>
|
|
|
|
#define DEFAULT_RATELIMIT_INTERVAL (5 * HZ)
|
|
#define DEFAULT_RATELIMIT_BURST 10
|
|
|
|
struct ratelimit_state {
|
|
spinlock_t lock; /* protect the state */
|
|
|
|
int interval;
|
|
int burst;
|
|
int printed;
|
|
int missed;
|
|
unsigned long begin;
|
|
};
|
|
|
|
#define DEFINE_RATELIMIT_STATE(name, interval_init, burst_init) \
|
|
\
|
|
struct ratelimit_state name = { \
|
|
.lock = __SPIN_LOCK_UNLOCKED(name.lock), \
|
|
.interval = interval_init, \
|
|
.burst = burst_init, \
|
|
}
|
|
|
|
extern int __ratelimit(struct ratelimit_state *rs);
|
|
|
|
#endif /* _LINUX_RATELIMIT_H */
|