isdn/gigaset: ratelimit CAPI message dumps
[pandora-kernel.git] / drivers / isdn / gigaset / capi.c
index 6d5ceee..5b80ef7 100644 (file)
@@ -14,6 +14,7 @@
 #include "gigaset.h"
 #include <linux/proc_fs.h>
 #include <linux/seq_file.h>
+#include <linux/ratelimit.h>
 #include <linux/isdn/capilli.h>
 #include <linux/isdn/capicmd.h>
 #include <linux/isdn/capiutil.h>
@@ -223,10 +224,14 @@ get_appl(struct gigaset_capi_ctr *iif, u16 appl)
 static inline void dump_cmsg(enum debuglevel level, const char *tag, _cmsg *p)
 {
 #ifdef CONFIG_GIGASET_DEBUG
+       /* dump at most 20 messages in 20 secs */
+       static DEFINE_RATELIMIT_STATE(msg_dump_ratelimit, 20 * HZ, 20);
        _cdebbuf *cdb;
 
        if (!(gigaset_debuglevel & level))
                return;
+       if (!___ratelimit(&msg_dump_ratelimit, tag))
+               return;
 
        cdb = capi_cmsg2str(p);
        if (cdb) {
@@ -2058,12 +2063,6 @@ static void do_reset_b3_req(struct gigaset_capi_ctr *iif,
                  CapiResetProcedureNotSupportedByCurrentProtocol);
 }
 
-/*
- * dump unsupported/ignored messages at most twice per minute,
- * some apps send those very frequently
- */
-static unsigned long ignored_msg_dump_time;
-
 /*
  * unsupported CAPI message handler
  */
@@ -2073,8 +2072,7 @@ static void do_unsupported(struct gigaset_capi_ctr *iif,
 {
        /* decode message */
        capi_message2cmsg(&iif->acmsg, skb->data);
-       if (printk_timed_ratelimit(&ignored_msg_dump_time, 30 * 1000))
-               dump_cmsg(DEBUG_CMD, __func__, &iif->acmsg);
+       dump_cmsg(DEBUG_CMD, __func__, &iif->acmsg);
        send_conf(iif, ap, skb, CapiMessageNotSupportedInCurrentState);
 }
 
@@ -2085,11 +2083,9 @@ static void do_nothing(struct gigaset_capi_ctr *iif,
                       struct gigaset_capi_appl *ap,
                       struct sk_buff *skb)
 {
-       if (printk_timed_ratelimit(&ignored_msg_dump_time, 30 * 1000)) {
-               /* decode message */
-               capi_message2cmsg(&iif->acmsg, skb->data);
-               dump_cmsg(DEBUG_CMD, __func__, &iif->acmsg);
-       }
+       /* decode message */
+       capi_message2cmsg(&iif->acmsg, skb->data);
+       dump_cmsg(DEBUG_CMD, __func__, &iif->acmsg);
        dev_kfree_skb_any(skb);
 }