Sfoglia il codice sorgente

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
Arif Hussain 6 anni fa
parent
commit
6e9fa6a725

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

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