]> xenbits.xensource.com Git - people/dstodden/blktap.git/commitdiff
MAR-125: Add driver log rate limits.
authorDaniel Stodden <daniel.stodden@citrix.com>
Mon, 23 May 2011 02:23:46 +0000 (19:23 -0700)
committerDaniel Stodden <daniel.stodden@citrix.com>
Mon, 23 May 2011 02:23:46 +0000 (19:23 -0700)
Allocates one td-loglimit instance per driver instance. Present burst
size is 16 messages, over an interval of 90 seconds. To be shared by
both driver code and the VBD.

Signed-off-by: Daniel Stodden <daniel.stodden@citrix.com>
drivers/tapdisk-driver.c
drivers/tapdisk-driver.h
drivers/tapdisk-log.h

index 737bc2e5ce70078f4327c0f051c8f36a59f6b7b9..e9477b1748bfe30022be1b0e80d18296766719ae 100644 (file)
 #include "tapdisk-disktype.h"
 #include "tapdisk-stats.h"
 
+static void
+tapdisk_driver_log_flush(td_driver_t *driver, const char *__caller)
+{
+       td_loglimit_t *rl = &driver->loglimit;
+
+       if (rl->dropped) {
+               tlog_syslog(LOG_WARNING,
+                           "%s: %s: %d messages suppressed",
+                           driver->name, __caller, rl->dropped);
+               rl->dropped = 0;
+       }
+}
+
+int
+tapdisk_driver_log_pass(td_driver_t *driver, const char *__caller)
+{
+       td_loglimit_t *rl = &driver->loglimit;
+       int dropping = rl->dropped;
+
+       if (tapdisk_loglimit_pass(rl)) {
+               tapdisk_driver_log_flush(driver, __caller);
+               return 1;
+       }
+
+       if (!dropping)
+               tlog_syslog(LOG_WARNING,
+                           "%s: %s: too many errors, dropped.",
+                           driver->name, __caller);
+
+       return 0;
+}
+
 td_driver_t *
 tapdisk_driver_allocate(int type, const char *name, td_flag_t flags)
 {
@@ -63,6 +95,10 @@ tapdisk_driver_allocate(int type, const char *name, td_flag_t flags)
        if (td_flag_test(flags, TD_OPEN_RDONLY))
                td_flag_set(driver->state, TD_DRIVER_RDONLY);
 
+       tapdisk_loglimit_init(&driver->loglimit,
+                             16 /* msgs */,
+                             90 * 1000 /* ms */);
+
        return driver;
 
 fail:
@@ -85,6 +121,8 @@ tapdisk_driver_free(td_driver_t *driver)
                EPRINTF("freeing open driver %s (state 0x%08x)\n",
                        driver->name, driver->state);
 
+       tapdisk_driver_log_flush(driver, __func__);
+
        free(driver->name);
        free(driver->data);
        free(driver);
index f8464aace769719e32989f0da96e0841d089699b..f286bc9c5cec4ad07a83db154967c0348dc2f5f1 100644 (file)
@@ -31,6 +31,7 @@
 #include "tapdisk.h"
 #include "scheduler.h"
 #include "tapdisk-queue.h"
+#include "tapdisk-loglimit.h"
 
 #define TD_DRIVER_OPEN               0x0001
 #define TD_DRIVER_RDONLY             0x0002
@@ -49,6 +50,7 @@ struct td_driver_handle {
        void                        *data;
        const struct tap_disk       *ops;
 
+       td_loglimit_t                loglimit;
        struct list_head             next;
 };
 
@@ -61,4 +63,6 @@ void tapdisk_driver_debug(td_driver_t *);
 
 void tapdisk_driver_stats(td_driver_t *, td_stats_t *);
 
+int tapdisk_driver_log_pass(td_driver_t *, const char *caller);
+
 #endif
index eeac30494f748312776784bb9fa5424f98e29219..0afc899b703d266afac415d7ebf9903a00a70da6 100644 (file)
@@ -60,4 +60,9 @@ void __tlog_error(const char *fmt, ...) __printf(1, 2);
        __tlog_error("ERROR: errno %d at %s: " _f,      \
                     _err, __func__, ##_a)
 
+#define tlog_drv_error(_drv, _err, _f, _a ...) do {    \
+       if (tapdisk_driver_log_pass(_drv, __func__))    \
+               tlog_error(_err, _f, ##_a);             \
+} while (0)
+
 #endif