ratelimit.c 1.3 KB

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