Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 60440789 authored by Bart Van Assche's avatar Bart Van Assche Committed by Mike Snitzer
Browse files

dm: fix printk() rate limiting code



Using the same rate limiting state for different kinds of messages
is wrong because this can cause a high frequency message to suppress
a report of a low frequency message. Hence use a unique rate limiting
state per message type.

Fixes: 71a16736 ("dm: use local printk ratelimit")
Cc: stable@vger.kernel.org
Signed-off-by: default avatarBart Van Assche <bart.vanassche@wdc.com>
Signed-off-by: default avatarMike Snitzer <snitzer@redhat.com>
parent 68515cc7
Loading
Loading
Loading
Loading
+0 −10
Original line number Original line Diff line number Diff line
@@ -27,16 +27,6 @@


#define DM_MSG_PREFIX "core"
#define DM_MSG_PREFIX "core"


#ifdef CONFIG_PRINTK
/*
 * ratelimit state to be used in DMXXX_LIMIT().
 */
DEFINE_RATELIMIT_STATE(dm_ratelimit_state,
		       DEFAULT_RATELIMIT_INTERVAL,
		       DEFAULT_RATELIMIT_BURST);
EXPORT_SYMBOL(dm_ratelimit_state);
#endif

/*
/*
 * Cookies are numeric values sent with CHANGE and REMOVE
 * Cookies are numeric values sent with CHANGE and REMOVE
 * uevents while resuming, removing or renaming the device.
 * uevents while resuming, removing or renaming the device.
+12 −29
Original line number Original line Diff line number Diff line
@@ -549,46 +549,29 @@ void *dm_vcalloc(unsigned long nmemb, unsigned long elem_size);
 *---------------------------------------------------------------*/
 *---------------------------------------------------------------*/
#define DM_NAME "device-mapper"
#define DM_NAME "device-mapper"


#ifdef CONFIG_PRINTK
#define DM_RATELIMIT(pr_func, fmt, ...)					\
extern struct ratelimit_state dm_ratelimit_state;
do {									\

	static DEFINE_RATELIMIT_STATE(rs, DEFAULT_RATELIMIT_INTERVAL,	\
#define dm_ratelimit()	__ratelimit(&dm_ratelimit_state)
				      DEFAULT_RATELIMIT_BURST);		\
#else
									\
#define dm_ratelimit()	0
	if (__ratelimit(&rs))						\
#endif
		pr_func(DM_FMT(fmt), ##__VA_ARGS__);			\
} while (0)


#define DM_FMT(fmt) DM_NAME ": " DM_MSG_PREFIX ": " fmt "\n"
#define DM_FMT(fmt) DM_NAME ": " DM_MSG_PREFIX ": " fmt "\n"


#define DMCRIT(fmt, ...) pr_crit(DM_FMT(fmt), ##__VA_ARGS__)
#define DMCRIT(fmt, ...) pr_crit(DM_FMT(fmt), ##__VA_ARGS__)


#define DMERR(fmt, ...) pr_err(DM_FMT(fmt), ##__VA_ARGS__)
#define DMERR(fmt, ...) pr_err(DM_FMT(fmt), ##__VA_ARGS__)
#define DMERR_LIMIT(fmt, ...)						\
#define DMERR_LIMIT(fmt, ...) DM_RATELIMIT(pr_err, fmt, ##__VA_ARGS__)
do {									\
	if (dm_ratelimit())						\
		DMERR(fmt, ##__VA_ARGS__);				\
} while (0)

#define DMWARN(fmt, ...) pr_warn(DM_FMT(fmt), ##__VA_ARGS__)
#define DMWARN(fmt, ...) pr_warn(DM_FMT(fmt), ##__VA_ARGS__)
#define DMWARN_LIMIT(fmt, ...)						\
#define DMWARN_LIMIT(fmt, ...) DM_RATELIMIT(pr_warn, fmt, ##__VA_ARGS__)
do {									\
	if (dm_ratelimit())						\
		DMWARN(fmt, ##__VA_ARGS__);				\
} while (0)

#define DMINFO(fmt, ...) pr_info(DM_FMT(fmt), ##__VA_ARGS__)
#define DMINFO(fmt, ...) pr_info(DM_FMT(fmt), ##__VA_ARGS__)
#define DMINFO_LIMIT(fmt, ...)						\
#define DMINFO_LIMIT(fmt, ...) DM_RATELIMIT(pr_info, fmt, ##__VA_ARGS__)
do {									\
	if (dm_ratelimit())						\
		DMINFO(fmt, ##__VA_ARGS__);				\
} while (0)


#ifdef CONFIG_DM_DEBUG
#ifdef CONFIG_DM_DEBUG
#define DMDEBUG(fmt, ...) printk(KERN_DEBUG DM_FMT(fmt), ##__VA_ARGS__)
#define DMDEBUG(fmt, ...) printk(KERN_DEBUG DM_FMT(fmt), ##__VA_ARGS__)
#define DMDEBUG_LIMIT(fmt, ...)						\
#define DMDEBUG_LIMIT(fmt, ...) DM_RATELIMIT(pr_debug, fmt, ##__VA_ARGS__)
do {									\
	if (dm_ratelimit())						\
		DMDEBUG(fmt, ##__VA_ARGS__);				\
} while (0)
#else
#else
#define DMDEBUG(fmt, ...) no_printk(fmt, ##__VA_ARGS__)
#define DMDEBUG(fmt, ...) no_printk(fmt, ##__VA_ARGS__)
#define DMDEBUG_LIMIT(fmt, ...) no_printk(fmt, ##__VA_ARGS__)
#define DMDEBUG_LIMIT(fmt, ...) no_printk(fmt, ##__VA_ARGS__)