diff options
author | Attila Fülöp <[email protected]> | 2023-03-07 22:44:11 +0100 |
---|---|---|
committer | GitHub <[email protected]> | 2023-03-07 13:44:11 -0800 |
commit | 119138701222d9e999900e11f30b1d0816fc5dd9 (patch) | |
tree | bbd60ebe7f2fa5b792093de5a28f577df3946a96 /include/os | |
parent | 4628bb9c6059f997dcf9aba9478843aba1596026 (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.h | 33 | ||||
-rw-r--r-- | include/os/linux/spl/sys/cmn_err.h | 17 |
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 */ |