Blame view

lib/ratelimit.c 1.26 KB
5f97a5a87   Dave Young   isolate ratelimit...
1
2
3
4
5
  /*
   * ratelimit.c - Do something with rate limit.
   *
   * Isolated from kernel/printk.c by Dave Young <hidave.darkstar@gmail.com>
   *
717115e1a   Dave Young   printk ratelimiti...
6
7
8
   * 2008-05-01 rewrite the function and use a ratelimit_state data struct as
   * parameter. Now every user can use their own standalone ratelimit_state.
   *
5f97a5a87   Dave Young   isolate ratelimit...
9
10
11
12
13
14
15
   * This file is released under the GPLv2.
   *
   */
  
  #include <linux/kernel.h>
  #include <linux/jiffies.h>
  #include <linux/module.h>
717115e1a   Dave Young   printk ratelimiti...
16
  static DEFINE_SPINLOCK(ratelimit_lock);
717115e1a   Dave Young   printk ratelimiti...
17

5f97a5a87   Dave Young   isolate ratelimit...
18
19
  /*
   * __ratelimit - rate limiting
717115e1a   Dave Young   printk ratelimiti...
20
   * @rs: ratelimit_state data
5f97a5a87   Dave Young   isolate ratelimit...
21
   *
717115e1a   Dave Young   printk ratelimiti...
22
23
   * This enforces a rate limit: not more than @rs->ratelimit_burst callbacks
   * in every @rs->ratelimit_jiffies
5f97a5a87   Dave Young   isolate ratelimit...
24
   */
717115e1a   Dave Young   printk ratelimiti...
25
  int __ratelimit(struct ratelimit_state *rs)
5f97a5a87   Dave Young   isolate ratelimit...
26
  {
4d9c377c8   Alexey Dobriyan   __ratelimit() cpu...
27
  	unsigned long flags;
717115e1a   Dave Young   printk ratelimiti...
28
29
  	if (!rs->interval)
  		return 1;
5f97a5a87   Dave Young   isolate ratelimit...
30
31
  
  	spin_lock_irqsave(&ratelimit_lock, flags);
717115e1a   Dave Young   printk ratelimiti...
32
33
  	if (!rs->begin)
  		rs->begin = jiffies;
5f97a5a87   Dave Young   isolate ratelimit...
34

717115e1a   Dave Young   printk ratelimiti...
35
36
37
38
39
40
41
42
  	if (time_is_before_jiffies(rs->begin + rs->interval)) {
  		if (rs->missed)
  			printk(KERN_WARNING "%s: %d callbacks suppressed
  ",
  				__func__, rs->missed);
  		rs->begin = 0;
  		rs->printed = 0;
  		rs->missed = 0;
5f97a5a87   Dave Young   isolate ratelimit...
43
  	}
717115e1a   Dave Young   printk ratelimiti...
44
45
46
47
  	if (rs->burst && rs->burst > rs->printed)
  		goto print;
  
  	rs->missed++;
5f97a5a87   Dave Young   isolate ratelimit...
48
49
  	spin_unlock_irqrestore(&ratelimit_lock, flags);
  	return 0;
717115e1a   Dave Young   printk ratelimiti...
50
51
52
53
54
  
  print:
  	rs->printed++;
  	spin_unlock_irqrestore(&ratelimit_lock, flags);
  	return 1;
5f97a5a87   Dave Young   isolate ratelimit...
55
56
  }
  EXPORT_SYMBOL(__ratelimit);