diff --git a/qdf/inc/qdf_nbuf.h b/qdf/inc/qdf_nbuf.h index f0608aae20..9b86c1b27a 100644 --- a/qdf/inc/qdf_nbuf.h +++ b/qdf/inc/qdf_nbuf.h @@ -741,6 +741,8 @@ void qdf_nbuf_unmap_nbytes_single_debug(qdf_device_t osdev, #else /* NBUF_MEMORY_DEBUG */ +static inline void qdf_nbuf_map_check_for_leaks(void) {} + static inline QDF_STATUS qdf_nbuf_map(qdf_device_t osdev, qdf_nbuf_t buf, qdf_dma_dir_t dir) { @@ -1321,11 +1323,14 @@ static inline void qdf_net_buf_debug_release_skb(qdf_nbuf_t net_buf) /* Nbuf allocation rouines */ +#define qdf_nbuf_alloc(osdev, size, reserve, align, prio) \ + qdf_nbuf_alloc_fl(osdev, size, reserve, align, prio, \ + __func__, __LINE__) static inline qdf_nbuf_t -qdf_nbuf_alloc(qdf_device_t osdev, - qdf_size_t size, int reserve, int align, int prio) +qdf_nbuf_alloc_fl(qdf_device_t osdev, qdf_size_t size, int reserve, int align, + int prio, const char *func, uint32_t line) { - return __qdf_nbuf_alloc(osdev, size, reserve, align, prio); + return __qdf_nbuf_alloc(osdev, size, reserve, align, prio, func, line); } static inline void qdf_nbuf_free(qdf_nbuf_t buf) diff --git a/qdf/inc/qdf_types.h b/qdf/inc/qdf_types.h index 407b5d19f7..9983823adc 100644 --- a/qdf/inc/qdf_types.h +++ b/qdf/inc/qdf_types.h @@ -637,6 +637,23 @@ void qdf_vtrace_msg(QDF_MODULE_ID module, QDF_TRACE_LEVEL level, #define qdf_nofl_debug(params...) \ QDF_TRACE_DEBUG_NO_FL(QDF_MODULE_ID_QDF, ## params) +#define qdf_rl_alert(params...) QDF_TRACE_FATAL_RL(QDF_MODULE_ID_QDF, ## params) +#define qdf_rl_err(params...) QDF_TRACE_ERROR_RL(QDF_MODULE_ID_QDF, ## params) +#define qdf_rl_warn(params...) QDF_TRACE_WARN_RL(QDF_MODULE_ID_QDF, ## params) +#define qdf_rl_info(params...) QDF_TRACE_INFO_RL(QDF_MODULE_ID_QDF, ## params) +#define qdf_rl_debug(params...) QDF_TRACE_DEBUG_RL(QDF_MODULE_ID_QDF, ## params) + +#define qdf_rl_nofl_alert(params...) \ + QDF_TRACE_FATAL_RL_NO_FL(QDF_MODULE_ID_QDF, ## params) +#define qdf_rl_nofl_err(params...) \ + QDF_TRACE_ERROR_RL_NO_FL(QDF_MODULE_ID_QDF, ## params) +#define qdf_rl_nofl_warn(params...) \ + QDF_TRACE_WARN_RL_NO_FL(QDF_MODULE_ID_QDF, ## params) +#define qdf_rl_nofl_info(params...) \ + QDF_TRACE_INFO_RL_NO_FL(QDF_MODULE_ID_QDF, ## params) +#define qdf_rl_nofl_debug(params...) \ + QDF_TRACE_DEBUG_RL_NO_FL(QDF_MODULE_ID_QDF, ## params) + #define qdf_vprint __qdf_vprint #define qdf_snprint __qdf_snprint diff --git a/qdf/linux/src/i_qdf_nbuf.h b/qdf/linux/src/i_qdf_nbuf.h index 8216d5b895..602982126c 100644 --- a/qdf/linux/src/i_qdf_nbuf.h +++ b/qdf/linux/src/i_qdf_nbuf.h @@ -596,8 +596,27 @@ void __qdf_nbuf_num_frags_init(struct sk_buff *skb) /* * prototypes. Implemented in qdf_nbuf.c */ -__qdf_nbuf_t __qdf_nbuf_alloc(__qdf_device_t osdev, size_t size, int reserve, - int align, int prio); + +/** + * __qdf_nbuf_alloc() - Allocate nbuf + * @osdev: Device handle + * @size: Netbuf requested size + * @reserve: headroom to start with + * @align: Align + * @prio: Priority + * @func: Function name of the call site + * @line: line number of the call site + * + * This allocates an nbuf aligns if needed and reserves some space in the front, + * since the reserve is done after alignment the reserve value if being + * unaligned will result in an unaligned address. + * + * Return: nbuf or %NULL if no memory + */ +__qdf_nbuf_t +__qdf_nbuf_alloc(__qdf_device_t osdev, size_t size, int reserve, int align, + int prio, const char *func, uint32_t line); + void __qdf_nbuf_free(struct sk_buff *skb); QDF_STATUS __qdf_nbuf_map(__qdf_device_t osdev, struct sk_buff *skb, qdf_dma_dir_t dir); diff --git a/qdf/linux/src/i_qdf_trace.h b/qdf/linux/src/i_qdf_trace.h index e6ef76a7c7..c5104001b7 100644 --- a/qdf/linux/src/i_qdf_trace.h +++ b/qdf/linux/src/i_qdf_trace.h @@ -106,6 +106,9 @@ #define __QDF_TRACE_RL(log_level, module_id, format, args...) \ __QDF_TRACE_RATE_LIMITED(module_id, log_level, FL(format), ## args) +#define __QDF_TRACE_RL_NO_FL(log_level, module_id, format, args...) \ + __QDF_TRACE_RATE_LIMITED(module_id, log_level, format, ## args) + static inline void __qdf_trace_noop(QDF_MODULE_ID module, char *format, ...) { } #ifdef WLAN_LOG_FATAL @@ -115,10 +118,13 @@ static inline void __qdf_trace_noop(QDF_MODULE_ID module, char *format, ...) { } __QDF_TRACE_NO_FL(QDF_TRACE_LEVEL_FATAL, ## params) #define QDF_TRACE_FATAL_RL(params...) \ __QDF_TRACE_RL(QDF_TRACE_LEVEL_FATAL, ## params) +#define QDF_TRACE_FATAL_RL_NO_FL(params...) \ + __QDF_TRACE_RL_NO_FL(QDF_TRACE_LEVEL_FATAL, ## params) #else #define QDF_TRACE_FATAL(params...) __qdf_trace_noop(params) #define QDF_TRACE_FATAL_NO_FL(params...) __qdf_trace_noop(params) #define QDF_TRACE_FATAL_RL(params...) __qdf_trace_noop(params) +#define QDF_TRACE_FATAL_RL_NO_FL(params...) __qdf_trace_noop(params) #endif #ifdef WLAN_LOG_ERROR @@ -128,10 +134,13 @@ static inline void __qdf_trace_noop(QDF_MODULE_ID module, char *format, ...) { } __QDF_TRACE_NO_FL(QDF_TRACE_LEVEL_ERROR, ## params) #define QDF_TRACE_ERROR_RL(params...) \ __QDF_TRACE_RL(QDF_TRACE_LEVEL_ERROR, ## params) +#define QDF_TRACE_ERROR_RL_NO_FL(params...) \ + __QDF_TRACE_RL_NO_FL(QDF_TRACE_LEVEL_ERROR, ## params) #else #define QDF_TRACE_ERROR(params...) __qdf_trace_noop(params) #define QDF_TRACE_ERROR_NO_FL(params...) __qdf_trace_noop(params) #define QDF_TRACE_ERROR_RL(params...) __qdf_trace_noop(params) +#define QDF_TRACE_ERROR_RL_NO_FL(params...) __qdf_trace_noop(params) #endif #ifdef WLAN_LOG_WARN @@ -141,10 +150,13 @@ static inline void __qdf_trace_noop(QDF_MODULE_ID module, char *format, ...) { } __QDF_TRACE_NO_FL(QDF_TRACE_LEVEL_WARN, ## params) #define QDF_TRACE_WARN_RL(params...) \ __QDF_TRACE_RL(QDF_TRACE_LEVEL_WARN, ## params) +#define QDF_TRACE_WARN_RL_NO_FL(params...) \ + __QDF_TRACE_RL_NO_FL(QDF_TRACE_LEVEL_WARN, ## params) #else #define QDF_TRACE_WARN(params...) __qdf_trace_noop(params) #define QDF_TRACE_WARN_NO_FL(params...) __qdf_trace_noop(params) #define QDF_TRACE_WARN_RL(params...) __qdf_trace_noop(params) +#define QDF_TRACE_WARN_RL_NO_FL(params...) __qdf_trace_noop(params) #endif #ifdef WLAN_LOG_INFO @@ -154,10 +166,13 @@ static inline void __qdf_trace_noop(QDF_MODULE_ID module, char *format, ...) { } __QDF_TRACE_NO_FL(QDF_TRACE_LEVEL_INFO, ## params) #define QDF_TRACE_INFO_RL(params...) \ __QDF_TRACE_RL(QDF_TRACE_LEVEL_INFO, ## params) +#define QDF_TRACE_INFO_RL_NO_FL(params...) \ + __QDF_TRACE_RL_NO_FL(QDF_TRACE_LEVEL_INFO, ## params) #else #define QDF_TRACE_INFO(params...) __qdf_trace_noop(params) #define QDF_TRACE_INFO_NO_FL(params...) __qdf_trace_noop(params) #define QDF_TRACE_INFO_RL(params...) __qdf_trace_noop(params) +#define QDF_TRACE_INFO_RL_NO_FL(params...) __qdf_trace_noop(params) #endif #ifdef WLAN_LOG_DEBUG @@ -167,10 +182,13 @@ static inline void __qdf_trace_noop(QDF_MODULE_ID module, char *format, ...) { } __QDF_TRACE_NO_FL(QDF_TRACE_LEVEL_DEBUG, ## params) #define QDF_TRACE_DEBUG_RL(params...) \ __QDF_TRACE_RL(QDF_TRACE_LEVEL_DEBUG, ## params) +#define QDF_TRACE_DEBUG_RL_NO_FL(params...) \ + __QDF_TRACE_RL_NO_FL(QDF_TRACE_LEVEL_DEBUG, ## params) #else #define QDF_TRACE_DEBUG(params...) __qdf_trace_noop(params) #define QDF_TRACE_DEBUG_NO_FL(params...) __qdf_trace_noop(params) #define QDF_TRACE_DEBUG_RL(params...) __qdf_trace_noop(params) +#define QDF_TRACE_DEBUG_RL_NO_FL(params...) __qdf_trace_noop(params) #endif #ifdef WLAN_LOG_ENTER diff --git a/qdf/linux/src/qdf_nbuf.c b/qdf/linux/src/qdf_nbuf.c index 37a8325bd3..31ff0418d6 100644 --- a/qdf/linux/src/qdf_nbuf.c +++ b/qdf/linux/src/qdf_nbuf.c @@ -354,24 +354,10 @@ void __qdf_nbuf_count_dec(__qdf_nbuf_t nbuf) qdf_export_symbol(__qdf_nbuf_count_dec); #endif - -/** - * __qdf_nbuf_alloc() - Allocate nbuf - * @hdl: Device handle - * @size: Netbuf requested size - * @reserve: headroom to start with - * @align: Align - * @prio: Priority - * - * This allocates an nbuf aligns if needed and reserves some space in the front, - * since the reserve is done after alignment the reserve value if being - * unaligned will result in an unaligned address. - * - * Return: nbuf or %NULL if no memory - */ #if defined(QCA_WIFI_QCA8074) && defined (BUILD_X86) struct sk_buff *__qdf_nbuf_alloc(qdf_device_t osdev, size_t size, int reserve, - int align, int prio) + int align, int prio, const char *func, + uint32_t line) { struct sk_buff *skb; unsigned long offset; @@ -389,7 +375,8 @@ realloc: skb = pld_nbuf_pre_alloc(size); if (!skb) { - pr_info("ERROR:NBUF alloc failed\n"); + qdf_nofl_err("NBUF alloc failed %zuB @ %s:%d", + size, func, line); return NULL; } @@ -401,7 +388,8 @@ skb_alloc: if (virt_to_phys(qdf_nbuf_data(skb)) < 0x50000040) { lowmem_alloc_tries++; if (lowmem_alloc_tries > 100) { - qdf_err("Failed"); + qdf_nofl_err("NBUF alloc failed %zuB @ %s:%d", + size, func, line); return NULL; } else { /* Not freeing to make sure it @@ -441,7 +429,8 @@ skb_alloc: } #else struct sk_buff *__qdf_nbuf_alloc(qdf_device_t osdev, size_t size, int reserve, - int align, int prio) + int align, int prio, const char *func, + uint32_t line) { struct sk_buff *skb; unsigned long offset; @@ -471,8 +460,8 @@ struct sk_buff *__qdf_nbuf_alloc(qdf_device_t osdev, size_t size, int reserve, skb = pld_nbuf_pre_alloc(size); if (!skb) { - pr_err_ratelimited("ERROR:NBUF alloc failed, size = %zu\n", - size); + qdf_rl_nofl_err("NBUF alloc failed %zuB @ %s:%d", + size, func, line); __qdf_nbuf_start_replenish_timer(); return NULL; } else { @@ -2619,7 +2608,7 @@ qdf_nbuf_t qdf_nbuf_alloc_debug(qdf_device_t osdev, qdf_size_t size, { qdf_nbuf_t nbuf; - nbuf = __qdf_nbuf_alloc(osdev, size, reserve, align, prio); + nbuf = __qdf_nbuf_alloc(osdev, size, reserve, align, prio, file, line); /* Store SKB in internal QDF tracking table */ if (qdf_likely(nbuf)) { diff --git a/wmi/inc/wmi_unified_api.h b/wmi/inc/wmi_unified_api.h index a4274ac17d..c30e8231d0 100644 --- a/wmi/inc/wmi_unified_api.h +++ b/wmi/inc/wmi_unified_api.h @@ -201,7 +201,18 @@ wmi_buf_t wmi_buf_alloc_debug(wmi_unified_t wmi_handle, uint32_t len, uint8_t *file_name, uint32_t line_num); #else -wmi_buf_t wmi_buf_alloc(wmi_unified_t wmi_handle, uint32_t len); +/** + * wmi_buf_alloc() - generic function to allocate WMI buffer + * @wmi_handle: handle to WMI. + * @len: length of the buffer + * + * Return: return wmi_buf_t or null if memory alloc fails + */ +#define wmi_buf_alloc(wmi_handle, len) \ + wmi_buf_alloc_fl(wmi_handle, len, __func__, __LINE__) + +wmi_buf_t wmi_buf_alloc_fl(wmi_unified_t wmi_handle, uint32_t len, + const char *func, uint32_t line); #endif /** diff --git a/wmi/inc/wmi_unified_priv.h b/wmi/inc/wmi_unified_priv.h index 858b9a449f..c25d927402 100644 --- a/wmi/inc/wmi_unified_priv.h +++ b/wmi/inc/wmi_unified_priv.h @@ -66,6 +66,23 @@ #define WMI_MGMT_EVENT_DEBUG_MAX_ENTRY (256) #endif +#define wmi_alert(params...) QDF_TRACE_FATAL(QDF_MODULE_ID_WMI, ## params) +#define wmi_err(params...) QDF_TRACE_ERROR(QDF_MODULE_ID_WMI, ## params) +#define wmi_warn(params...) QDF_TRACE_WARN(QDF_MODULE_ID_WMI, ## params) +#define wmi_info(params...) QDF_TRACE_INFO(QDF_MODULE_ID_WMI, ## params) +#define wmi_debug(params...) QDF_TRACE_DEBUG(QDF_MODULE_ID_WMI, ## params) + +#define wmi_nofl_alert(params...) \ + QDF_TRACE_FATAL_NO_FL(QDF_MODULE_ID_WMI, ## params) +#define wmi_nofl_err(params...) \ + QDF_TRACE_ERROR_NO_FL(QDF_MODULE_ID_WMI, ## params) +#define wmi_nofl_warn(params...) \ + QDF_TRACE_WARN_NO_FL(QDF_MODULE_ID_WMI, ## params) +#define wmi_nofl_info(params...) \ + QDF_TRACE_INFO_NO_FL(QDF_MODULE_ID_WMI, ## params) +#define wmi_nofl_debug(params...) \ + QDF_TRACE_DEBUG_NO_FL(QDF_MODULE_ID_WMI, ## params) + /** * struct wmi_command_debug - WMI command log buffer data type * @ command - Store WMI Command id diff --git a/wmi/src/wmi_unified.c b/wmi/src/wmi_unified.c index 9127620077..7c7aae68cf 100644 --- a/wmi/src/wmi_unified.c +++ b/wmi/src/wmi_unified.c @@ -1220,17 +1220,19 @@ void wmi_buf_free(wmi_buf_t net_buf) } qdf_export_symbol(wmi_buf_free); #else -wmi_buf_t wmi_buf_alloc(wmi_unified_t wmi_handle, uint32_t len) +wmi_buf_t wmi_buf_alloc_fl(wmi_unified_t wmi_handle, uint32_t len, + const char *func, uint32_t line) { wmi_buf_t wmi_buf; if (roundup(len + WMI_MIN_HEAD_ROOM, 4) > wmi_handle->max_msg_len) { - QDF_ASSERT(0); + wmi_nofl_err("%s:%d, Invalid len:%d", func, line, len); + QDF_DEBUG_PANIC(); return NULL; } - wmi_buf = qdf_nbuf_alloc(NULL, roundup(len + WMI_MIN_HEAD_ROOM, 4), - WMI_MIN_HEAD_ROOM, 4, false); + wmi_buf = qdf_nbuf_alloc_fl(NULL, roundup(len + WMI_MIN_HEAD_ROOM, 4), + WMI_MIN_HEAD_ROOM, 4, false, func, line); if (!wmi_buf) return NULL; @@ -1243,7 +1245,7 @@ wmi_buf_t wmi_buf_alloc(wmi_unified_t wmi_handle, uint32_t len) qdf_nbuf_set_pktlen(wmi_buf, len); return wmi_buf; } -qdf_export_symbol(wmi_buf_alloc); +qdf_export_symbol(wmi_buf_alloc_fl); void wmi_buf_free(wmi_buf_t net_buf) {