Version:  2.0.40 2.2.26 2.4.37 3.13 3.14 3.15 3.16 3.17 3.18 3.19 4.0 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 4.10

Linux/lib/ratelimit.c

  1 /*
  2  * ratelimit.c - Do something with rate limit.
  3  *
  4  * Isolated from kernel/printk.c by Dave Young <hidave.darkstar@gmail.com>
  5  *
  6  * 2008-05-01 rewrite the function and use a ratelimit_state data struct as
  7  * parameter. Now every user can use their own standalone ratelimit_state.
  8  *
  9  * This file is released under the GPLv2.
 10  */
 11 
 12 #include <linux/ratelimit.h>
 13 #include <linux/jiffies.h>
 14 #include <linux/export.h>
 15 
 16 /*
 17  * __ratelimit - rate limiting
 18  * @rs: ratelimit_state data
 19  * @func: name of calling function
 20  *
 21  * This enforces a rate limit: not more than @rs->burst callbacks
 22  * in every @rs->interval
 23  *
 24  * RETURNS:
 25  * 0 means callbacks will be suppressed.
 26  * 1 means go ahead and do it.
 27  */
 28 int ___ratelimit(struct ratelimit_state *rs, const char *func)
 29 {
 30         unsigned long flags;
 31         int ret;
 32 
 33         if (!rs->interval)
 34                 return 1;
 35 
 36         /*
 37          * If we contend on this state's lock then almost
 38          * by definition we are too busy to print a message,
 39          * in addition to the one that will be printed by
 40          * the entity that is holding the lock already:
 41          */
 42         if (!raw_spin_trylock_irqsave(&rs->lock, flags))
 43                 return 0;
 44 
 45         if (!rs->begin)
 46                 rs->begin = jiffies;
 47 
 48         if (time_is_before_jiffies(rs->begin + rs->interval)) {
 49                 if (rs->missed) {
 50                         if (!(rs->flags & RATELIMIT_MSG_ON_RELEASE)) {
 51                                 pr_warn("%s: %d callbacks suppressed\n", func, rs->missed);
 52                                 rs->missed = 0;
 53                         }
 54                 }
 55                 rs->begin   = jiffies;
 56                 rs->printed = 0;
 57         }
 58         if (rs->burst && rs->burst > rs->printed) {
 59                 rs->printed++;
 60                 ret = 1;
 61         } else {
 62                 rs->missed++;
 63                 ret = 0;
 64         }
 65         raw_spin_unlock_irqrestore(&rs->lock, flags);
 66 
 67         return ret;
 68 }
 69 EXPORT_SYMBOL(___ratelimit);
 70 

This page was automatically generated by LXR 0.3.1 (source).  •  Linux is a registered trademark of Linus Torvalds  •  Contact us