From: Daniel Stodden Date: Mon, 23 May 2011 02:23:46 +0000 (-0700) Subject: MAR-125: Add driver log rate limits. X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=463c0fc1ed60c7b942093f51ceefda8c352ee4d1;p=people%2Fdstodden%2Fblktap.git MAR-125: Add driver log rate limits. 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 --- diff --git a/drivers/tapdisk-driver.c b/drivers/tapdisk-driver.c index 737bc2e..e9477b1 100644 --- a/drivers/tapdisk-driver.c +++ b/drivers/tapdisk-driver.c @@ -34,6 +34,38 @@ #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); diff --git a/drivers/tapdisk-driver.h b/drivers/tapdisk-driver.h index f8464aa..f286bc9 100644 --- a/drivers/tapdisk-driver.h +++ b/drivers/tapdisk-driver.h @@ -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 diff --git a/drivers/tapdisk-log.h b/drivers/tapdisk-log.h index eeac304..0afc899 100644 --- a/drivers/tapdisk-log.h +++ b/drivers/tapdisk-log.h @@ -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