Commit 35f4e5e6 authored by Nikolay Borisov's avatar Nikolay Borisov Committed by David Sterba

btrfs: Add ratelimit to btrfs printing

This patch adds ratelimiting to all messages which are not using the _rl
version of the various printing APIs in btrfs. This is designed to be
used as a safety net, since a flood messages might cause the softlockup
detector to trigger. To reduce interference between different classes of
messages use a separate ratelimit state for every class of message.
Signed-off-by: default avatarNikolay Borisov <kernel@kyup.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent 5a488b9d
...@@ -184,6 +184,22 @@ static const char * const logtypes[] = { ...@@ -184,6 +184,22 @@ static const char * const logtypes[] = {
"debug", "debug",
}; };
/*
* Use one ratelimit state per log level so that a flood of less important
* messages doesn't cause more important ones to be dropped.
*/
static struct ratelimit_state printk_limits[] = {
RATELIMIT_STATE_INIT(printk_limits[0], DEFAULT_RATELIMIT_INTERVAL, 100),
RATELIMIT_STATE_INIT(printk_limits[1], DEFAULT_RATELIMIT_INTERVAL, 100),
RATELIMIT_STATE_INIT(printk_limits[2], DEFAULT_RATELIMIT_INTERVAL, 100),
RATELIMIT_STATE_INIT(printk_limits[3], DEFAULT_RATELIMIT_INTERVAL, 100),
RATELIMIT_STATE_INIT(printk_limits[4], DEFAULT_RATELIMIT_INTERVAL, 100),
RATELIMIT_STATE_INIT(printk_limits[5], DEFAULT_RATELIMIT_INTERVAL, 100),
RATELIMIT_STATE_INIT(printk_limits[6], DEFAULT_RATELIMIT_INTERVAL, 100),
RATELIMIT_STATE_INIT(printk_limits[7], DEFAULT_RATELIMIT_INTERVAL, 100),
};
void btrfs_printk(const struct btrfs_fs_info *fs_info, const char *fmt, ...) void btrfs_printk(const struct btrfs_fs_info *fs_info, const char *fmt, ...)
{ {
struct super_block *sb = fs_info->sb; struct super_block *sb = fs_info->sb;
...@@ -192,6 +208,7 @@ void btrfs_printk(const struct btrfs_fs_info *fs_info, const char *fmt, ...) ...@@ -192,6 +208,7 @@ void btrfs_printk(const struct btrfs_fs_info *fs_info, const char *fmt, ...)
va_list args; va_list args;
const char *type = logtypes[4]; const char *type = logtypes[4];
int kern_level; int kern_level;
struct ratelimit_state *ratelimit;
va_start(args, fmt); va_start(args, fmt);
...@@ -202,12 +219,17 @@ void btrfs_printk(const struct btrfs_fs_info *fs_info, const char *fmt, ...) ...@@ -202,12 +219,17 @@ void btrfs_printk(const struct btrfs_fs_info *fs_info, const char *fmt, ...)
lvl[size] = '\0'; lvl[size] = '\0';
fmt += size; fmt += size;
type = logtypes[kern_level - '0']; type = logtypes[kern_level - '0'];
} else ratelimit = &printk_limits[kern_level - '0'];
} else {
*lvl = '\0'; *lvl = '\0';
/* Default to debug output */
ratelimit = &printk_limits[7];
}
vaf.fmt = fmt; vaf.fmt = fmt;
vaf.va = &args; vaf.va = &args;
if (__ratelimit(ratelimit))
printk("%sBTRFS %s (device %s): %pV\n", lvl, type, sb->s_id, &vaf); printk("%sBTRFS %s (device %s): %pV\n", lvl, type, sb->s_id, &vaf);
va_end(args); va_end(args);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment