Просмотр исходного кода

Merge "qcacmn: Add logs in qdf_nbuf_alloc()"

Linux Build Service Account 6 лет назад
Родитель
Сommit
a62d430e01

+ 8 - 3
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)

+ 17 - 0
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
 

+ 21 - 2
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);

+ 18 - 0
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

+ 11 - 22
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)) {

+ 12 - 1
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
 
 /**

+ 17 - 0
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

+ 7 - 5
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)
 {