From cecce8a9e798fbe8571381b6f9f69fd7a0defa37 Mon Sep 17 00:00:00 2001 From: James Hughes Date: Wed, 18 Apr 2018 13:02:57 +0100 Subject: [PATCH 278/454] Prevent voltage low warnings from filling log Although the correct fix for low voltage warnings is to improve the power supply, the current implementation of the detection can fill the log if the warning happens freqently. This replaces the logging with slightly custom ratelimited logging. Signed-off-by: James Hughes --- drivers/firmware/raspberrypi.c | 40 ++++++++++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) --- a/drivers/firmware/raspberrypi.c +++ b/drivers/firmware/raspberrypi.c @@ -24,6 +24,38 @@ #define UNDERVOLTAGE_BIT BIT(0) + +/* + * This section defines some rate limited logging that prevent + * repeated messages at much lower Hz than the default kernel settings. + * It's usually 5s, this is 5 minutes. + * Burst 3 means you may get three messages 'quickly', before + * the ratelimiting kicks in. + */ +#define LOCAL_RATELIMIT_INTERVAL (5 * 60 * HZ) +#define LOCAL_RATELIMIT_BURST 3 + +#ifdef CONFIG_PRINTK +#define printk_ratelimited_local(fmt, ...) \ +({ \ + static DEFINE_RATELIMIT_STATE(_rs, \ + LOCAL_RATELIMIT_INTERVAL, \ + LOCAL_RATELIMIT_BURST); \ + \ + if (__ratelimit(&_rs)) \ + printk(fmt, ##__VA_ARGS__); \ +}) +#else +#define printk_ratelimited_local(fmt, ...) \ + no_printk(fmt, ##__VA_ARGS__) +#endif + +#define pr_crit_ratelimited_local(fmt, ...) \ + printk_ratelimited_local(KERN_CRIT pr_fmt(fmt), ##__VA_ARGS__) +#define pr_info_ratelimited_local(fmt, ...) \ + printk_ratelimited_local(KERN_INFO pr_fmt(fmt), ##__VA_ARGS__) + + struct rpi_firmware { struct mbox_client cl; struct mbox_chan *chan; /* The property channel. */ @@ -216,9 +248,13 @@ static int rpi_firmware_get_throttled(st if (new_uv != old_uv) { if (new_uv) - pr_crit("Under-voltage detected! (0x%08x)\n", *value); + pr_crit_ratelimited_local( + "Under-voltage detected! (0x%08x)\n", + *value); else - pr_info("Voltage normalised (0x%08x)\n", *value); + pr_info_ratelimited_local( + "Voltage normalised (0x%08x)\n", + *value); } sysfs_notify(&fw->cl.dev->kobj, NULL, "get_throttled");