The branch main has been updated by glebius: URL: https://cgit.FreeBSD.org/src/commit/?id=eabb9f600001cc19943965b84d492936a5c59ebd
commit eabb9f600001cc19943965b84d492936a5c59ebd Author: Gleb Smirnoff <gleb...@freebsd.org> AuthorDate: 2025-06-24 22:23:53 +0000 Commit: Gleb Smirnoff <gleb...@freebsd.org> CommitDate: 2025-06-24 22:23:53 +0000 gone_in: enforce printing only once This allows to use this KPI not only in device attach methods, but also for syscalls and code that can be called multiple times at machine runtime. Reviewed by: imp Differential Revision: https://reviews.freebsd.org/D50784 --- sys/sys/systm.h | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/sys/sys/systm.h b/sys/sys/systm.h index 7a6edaef2cb8..c4e0aafac452 100644 --- a/sys/sys/systm.h +++ b/sys/sys/systm.h @@ -576,10 +576,22 @@ void _gone_in_dev(device_t dev, int major, const char *msg, ...) #else #define __gone_ok(m, msg) #endif -#define gone_in(major, msg, ...) __gone_ok(major, msg) \ - _gone_in(major, msg __VA_OPT__(,) __VA_ARGS__) -#define gone_in_dev(dev, major, msg, ...) __gone_ok(major, msg) \ - _gone_in_dev(dev, major, msg __VA_OPT__(,) __VA_ARGS__) +#define gone_in(major, msg, ...) do { \ + static bool __read_mostly __gone_in_ ## __LINE__ = true; \ + __gone_ok(major, msg); \ + if (__predict_false(__gone_in_ ## __LINE__)) { \ + __gone_in_ ## __LINE__ = false; \ + _gone_in(major, msg __VA_OPT__(,) __VA_ARGS__); \ + } \ +} while (0) +#define gone_in_dev(dev, major, msg, ...) do { \ + static bool __read_mostly __gone_in_ ## __LINE__ = true; \ + __gone_ok(major, msg); \ + if (__predict_false(__gone_in_ ## __LINE__)) { \ + __gone_in_ ## __LINE__ = false; \ + _gone_in_dev(dev, major, msg __VA_OPT__(,) __VA_ARGS__);\ + } \ +} while (0) #ifdef INVARIANTS #define __diagused