ratelimit.c 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  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. * This file is released under the GPLv2.
  7. *
  8. */
  9. #include <linux/kernel.h>
  10. #include <linux/jiffies.h>
  11. #include <linux/module.h>
  12. /*
  13. * __ratelimit - rate limiting
  14. * @ratelimit_jiffies: minimum time in jiffies between two callbacks
  15. * @ratelimit_burst: number of callbacks we do before ratelimiting
  16. *
  17. * This enforces a rate limit: not more than @ratelimit_burst callbacks
  18. * in every ratelimit_jiffies
  19. */
  20. int __ratelimit(int ratelimit_jiffies, int ratelimit_burst)
  21. {
  22. static DEFINE_SPINLOCK(ratelimit_lock);
  23. static unsigned toks = 10 * 5 * HZ;
  24. static unsigned long last_msg;
  25. static int missed;
  26. unsigned long flags;
  27. unsigned long now = jiffies;
  28. spin_lock_irqsave(&ratelimit_lock, flags);
  29. toks += now - last_msg;
  30. last_msg = now;
  31. if (toks > (ratelimit_burst * ratelimit_jiffies))
  32. toks = ratelimit_burst * ratelimit_jiffies;
  33. if (toks >= ratelimit_jiffies) {
  34. int lost = missed;
  35. missed = 0;
  36. toks -= ratelimit_jiffies;
  37. spin_unlock_irqrestore(&ratelimit_lock, flags);
  38. if (lost)
  39. printk(KERN_WARNING "%s: %d messages suppressed\n",
  40. __func__, lost);
  41. return 1;
  42. }
  43. missed++;
  44. spin_unlock_irqrestore(&ratelimit_lock, flags);
  45. return 0;
  46. }
  47. EXPORT_SYMBOL(__ratelimit);