diff options
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 */ |