diff options
author | ian <ian@FreeBSD.org> | 2015-01-11 20:55:16 +0000 |
---|---|---|
committer | ian <ian@FreeBSD.org> | 2015-01-11 20:55:16 +0000 |
commit | b0834e310346ec43d73c6e2957c9decffa3708b6 (patch) | |
tree | c926adcae4553d747ecd36f237c1bafae2363f74 | |
parent | f0876ef9acc59fc1b770ce9b48b7cea9d7ada279 (diff) | |
download | FreeBSD-src-b0834e310346ec43d73c6e2957c9decffa3708b6.zip FreeBSD-src-b0834e310346ec43d73c6e2957c9decffa3708b6.tar.gz |
Rate-limit error logging to 5 lines per second, so that when an sdcard
goes bad it doesn't lock up the console with continuous output.
-rw-r--r-- | sys/dev/mmc/mmcsd.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/sys/dev/mmc/mmcsd.c b/sys/dev/mmc/mmcsd.c index 75fd36c..3be2158 100644 --- a/sys/dev/mmc/mmcsd.c +++ b/sys/dev/mmc/mmcsd.c @@ -64,6 +64,7 @@ __FBSDID("$FreeBSD$"); #include <sys/malloc.h> #include <sys/module.h> #include <sys/mutex.h> +#include <sys/time.h> #include <geom/geom_disk.h> #include <dev/mmc/mmcbrvar.h> @@ -86,6 +87,8 @@ struct mmcsd_softc { daddr_t eblock, eend; /* Range remaining after the last erase. */ int running; int suspend; + int log_count; + struct timeval log_time; }; static const char *errmsg[] = @@ -99,6 +102,8 @@ static const char *errmsg[] = "NO MEMORY" }; +#define LOG_PPS 5 /* Log no more than 5 errors per second. */ + /* bus entry points */ static int mmcsd_attach(device_t dev); static int mmcsd_detach(device_t dev); @@ -389,8 +394,10 @@ mmcsd_rw(struct mmcsd_softc *sc, struct bio *bp) } MMCBUS_WAIT_FOR_REQUEST(mmcbr, dev, &req); if (req.cmd->error != MMC_ERR_NONE) { - device_printf(dev, "Error indicated: %d %s\n", - req.cmd->error, mmcsd_errmsg(req.cmd->error)); + if (ppsratecheck(&sc->log_time, &sc->log_count, LOG_PPS)) { + device_printf(dev, "Error indicated: %d %s\n", + req.cmd->error, mmcsd_errmsg(req.cmd->error)); + } break; } block += numblocks; |