From 58189eb0bd70bc5018b2e3577035d3e82a72a74c Mon Sep 17 00:00:00 2001 From: Arif Hussain Date: Thu, 19 Jul 2018 14:15:36 -0700 Subject: [PATCH 1/2] qcacmn: Add logs in wmi_buf_alloc() In wmi_buf_alloc() function, pass function name and line number of caller and log the same in case of failure, this approach helps to remove error logs in caller function there by reducing text segment. Also add wmi_nofl_* macros. Change-Id: Ib1ac8bf2bbcefa7f0015aff2733d3dc4773b185d CRs-Fixed: 2281983 --- wmi/inc/wmi_unified_api.h | 13 ++++++++++++- wmi/inc/wmi_unified_priv.h | 17 +++++++++++++++++ wmi/src/wmi_unified.c | 8 +++++--- 3 files changed, 34 insertions(+), 4 deletions(-) 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..7bc40a4208 100644 --- a/wmi/src/wmi_unified.c +++ b/wmi/src/wmi_unified.c @@ -1220,12 +1220,14 @@ 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; } @@ -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) { From 6e9fa6a7253ac65084382c5242d9f30100ba5861 Mon Sep 17 00:00:00 2001 From: Arif Hussain Date: Fri, 20 Jul 2018 12:58:31 -0700 Subject: [PATCH 2/2] qcacmn: Add logs in qdf_nbuf_alloc() In qdf_nbuf_alloc() function, pass function name and line number of caller and log the same in case of failure, this approach helps to remove error logs in caller function there by reducing text segment. Also add qdf_rl and qdf_rl_nofl_* macros. Change-Id: Ib8ce83335807cfbd2d83d1f165d6bec1dc1e4c94 CRs-Fixed: 2281983 --- qdf/inc/qdf_nbuf.h | 11 ++++++++--- qdf/inc/qdf_types.h | 17 +++++++++++++++++ qdf/linux/src/i_qdf_nbuf.h | 23 +++++++++++++++++++++-- qdf/linux/src/i_qdf_trace.h | 18 ++++++++++++++++++ qdf/linux/src/qdf_nbuf.c | 33 +++++++++++---------------------- wmi/src/wmi_unified.c | 4 ++-- 6 files changed, 77 insertions(+), 29 deletions(-) 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/src/wmi_unified.c b/wmi/src/wmi_unified.c index 7bc40a4208..7c7aae68cf 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;