diff --git a/qdf/inc/qdf_nbuf.h b/qdf/inc/qdf_nbuf.h index f0608aae2023..9b86c1b27aa9 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 407b5d19f7e5..9983823adc5c 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 8216d5b89551..602982126c11 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 e6ef76a7c76c..c5104001b73b 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 37a8325bd3a2..31ff0418d66a 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/src/wmi_unified.c b/wmi/src/wmi_unified.c index 7bc40a42084d..7c7aae68cfe7 100644 --- a/wmi/src/wmi_unified.c +++ b/wmi/src/wmi_unified.c @@ -1231,8 +1231,8 @@ wmi_buf_t wmi_buf_alloc_fl(wmi_unified_t wmi_handle, uint32_t len, 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;