linux/lib/ratelimit.c
<<
>>
Prefs
   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
  13#include <linux/kernel.h>
  14#include <linux/jiffies.h>
  15#include <linux/module.h>
  16
  17static DEFINE_SPINLOCK(ratelimit_lock);
  18
  19/*
  20 * __ratelimit - rate limiting
  21 * @rs: ratelimit_state data
  22 *
  23 * This enforces a rate limit: not more than @rs->ratelimit_burst callbacks
  24 * in every @rs->ratelimit_jiffies
  25 */
  26int __ratelimit(struct ratelimit_state *rs)
  27{
  28        unsigned long flags;
  29
  30        if (!rs->interval)
  31                return 1;
  32
  33        spin_lock_irqsave(&ratelimit_lock, flags);
  34        if (!rs->begin)
  35                rs->begin = jiffies;
  36
  37        if (time_is_before_jiffies(rs->begin + rs->interval)) {
  38                if (rs->missed)
  39                        printk(KERN_WARNING "%s: %d callbacks suppressed\n",
  40                                __func__, rs->missed);
  41                rs->begin = 0;
  42                rs->printed = 0;
  43                rs->missed = 0;
  44        }
  45        if (rs->burst && rs->burst > rs->printed)
  46                goto print;
  47
  48        rs->missed++;
  49        spin_unlock_irqrestore(&ratelimit_lock, flags);
  50        return 0;
  51
  52print:
  53        rs->printed++;
  54        spin_unlock_irqrestore(&ratelimit_lock, flags);
  55        return 1;
  56}
  57EXPORT_SYMBOL(__ratelimit);
  58