diff --git a/qdf/linux/src/i_qdf_trace.h b/qdf/linux/src/i_qdf_trace.h index 2033ebe9e2..aa3ac261ed 100644 --- a/qdf/linux/src/i_qdf_trace.h +++ b/qdf/linux/src/i_qdf_trace.h @@ -117,13 +117,48 @@ static inline void qdf_trace_msg(QDF_MODULE_ID module, QDF_TRACE_LEVEL level, #endif #ifdef PANIC_ON_BUG +#ifdef CONFIG_SLUB_DEBUG +/** + * QDF_DEBUG_PANIC() - Causes a panic if PANIC_ON_BUG option is enabled + * + * Note: Calling panic can cause a compiler to assume any following code is + * unreachable. Because these panics may or may not be enabled by the build + * configuration, this can cause developers some pain. Consider: + * + * bool bit; + * + * if (ptr) + * bit = ptr->returns_bool(); + * else + * panic(); + * + * // do stuff with @bit + * + * return bit; + * + * In this case, @bit is potentially uninitialized when we return! However, the + * compiler can correctly assume this case is impossible when PANIC_ON_BUG is + * enabled. Because developers typically enable this feature, the "maybe + * uninitialized" warning will not be emitted, and the bug remains uncaught + * until someone tries to make a build without PANIC_ON_BUG. + * + * A simple workaround for this, is to put the definition of QDF_DEBUG_PANIC in + * another compilation unit, which prevents the compiler from assuming + * subsequent code is unreachable. For CONFIG_SLUB_DEBUG, do this to catch more + * bugs. Otherwise, use the typical inlined approach. + * + * Return: None + */ +void QDF_DEBUG_PANIC(void); +#else static inline void QDF_DEBUG_PANIC(void) { BUG(); } +#endif /* CONFIG_SLUB_DEBUG */ #else static inline void QDF_DEBUG_PANIC(void) { } -#endif +#endif /* PANIC_ON_BUG */ #define QDF_BUG(_condition) \ do { \ diff --git a/qdf/linux/src/qdf_trace.c b/qdf/linux/src/qdf_trace.c index a40c662e23..7fd00f35ae 100644 --- a/qdf/linux/src/qdf_trace.c +++ b/qdf/linux/src/qdf_trace.c @@ -2920,3 +2920,14 @@ int qdf_get_pidx(void) return qdf_pidx; } EXPORT_SYMBOL(qdf_get_pidx); + +#ifdef PANIC_ON_BUG +#ifdef CONFIG_SLUB_DEBUG +void QDF_DEBUG_PANIC(void) +{ + BUG(); +} +EXPORT_SYMBOL(QDF_DEBUG_PANIC); +#endif /* CONFIG_SLUB_DEBUG */ +#endif /* PANIC_ON_BUG */ +