ratelimit.c 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  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. static unsigned long flags;
  17. /*
  18. * __ratelimit - rate limiting
  19. * @rs: ratelimit_state data
  20. *
  21. * This enforces a rate limit: not more than @rs->ratelimit_burst callbacks
  22. * in every @rs->ratelimit_jiffies
  23. */
  24. int __ratelimit(struct ratelimit_state *rs)
  25. {
  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);