aboutsummaryrefslogtreecommitdiffstats
path: root/include/os
diff options
context:
space:
mode:
authorAttila Fülöp <[email protected]>2023-03-07 22:44:11 +0100
committerGitHub <[email protected]>2023-03-07 13:44:11 -0800
commit119138701222d9e999900e11f30b1d0816fc5dd9 (patch)
treebbd60ebe7f2fa5b792093de5a28f577df3946a96 /include/os
parent4628bb9c6059f997dcf9aba9478843aba1596026 (diff)
spl: Add cmn_err_once() to log a message only on the first call
Reviewed-by: Richard Yao <[email protected]> Reviewed-by: Brian Behlendorf <[email protected]> Reviewed-by: Brian Atkinson <[email protected]> Signed-off-by: Attila Fülöp <[email protected]> Closes #14567
Diffstat (limited to 'include/os')
-rw-r--r--include/os/freebsd/spl/sys/cmn_err.h33
-rw-r--r--include/os/linux/spl/sys/cmn_err.h17
2 files changed, 50 insertions, 0 deletions
diff --git a/include/os/freebsd/spl/sys/cmn_err.h b/include/os/freebsd/spl/sys/cmn_err.h
index a8f9a8824..dd3da7da2 100644
--- a/include/os/freebsd/spl/sys/cmn_err.h
+++ b/include/os/freebsd/spl/sys/cmn_err.h
@@ -33,6 +33,7 @@
#if !defined(_ASM)
#include <sys/_stdarg.h>
+#include <sys/atomic.h>
#endif
#ifdef __cplusplus
@@ -73,6 +74,38 @@ extern void vuprintf(const char *, __va_list)
extern void panic(const char *, ...)
__attribute__((format(printf, 1, 2), __noreturn__));
+#define cmn_err_once(ce, ...) \
+{ \
+ static volatile uint32_t printed = 0; \
+ if (atomic_cas_32(&printed, 0, 1) == 0) { \
+ cmn_err(ce, __VA_ARGS__); \
+ } \
+}
+
+#define vcmn_err_once(ce, fmt, ap) \
+{ \
+ static volatile uint32_t printed = 0; \
+ if (atomic_cas_32(&printed, 0, 1) == 0) { \
+ vcmn_err(ce, fmt, ap); \
+ } \
+}
+
+#define zcmn_err_once(zone, ce, ...) \
+{ \
+ static volatile uint32_t printed = 0; \
+ if (atomic_cas_32(&printed, 0, 1) == 0) { \
+ zcmn_err(zone, ce, __VA_ARGS__); \
+ } \
+}
+
+#define vzcmn_err_once(zone, ce, fmt, ap) \
+{ \
+ static volatile uint32_t printed = 0; \
+ if (atomic_cas_32(&printed, 0, 1) == 0) { \
+ vzcmn_err(zone, ce, fmt, ap); \
+ } \
+}
+
#endif /* !_ASM */
#ifdef __cplusplus
diff --git a/include/os/linux/spl/sys/cmn_err.h b/include/os/linux/spl/sys/cmn_err.h
index 161bcf9b3..7ca2a86be 100644
--- a/include/os/linux/spl/sys/cmn_err.h
+++ b/include/os/linux/spl/sys/cmn_err.h
@@ -29,6 +29,7 @@
#else
#include <stdarg.h>
#endif
+#include <sys/atomic.h>
#define CE_CONT 0 /* continuation */
#define CE_NOTE 1 /* notice */
@@ -45,4 +46,20 @@ extern void vpanic(const char *, va_list)
#define fm_panic panic
+#define cmn_err_once(ce, ...) \
+{ \
+ static volatile uint32_t printed = 0; \
+ if (atomic_cas_32(&printed, 0, 1) == 0) { \
+ cmn_err(ce, __VA_ARGS__); \
+ } \
+}
+
+#define vcmn_err_once(ce, fmt, ap) \
+{ \
+ static volatile uint32_t printed = 0; \
+ if (atomic_cas_32(&printed, 0, 1) == 0) { \
+ vcmn_err(ce, fmt, ap); \
+ } \
+}
+
#endif /* SPL_CMN_ERR_H */