Browse Source

qcacmn: Fix memory leaks

In some of the erorr cases, allocated mpdu's are not
freed leading to a memory leak.

Changes are done to iterate over mpdu queue and
frees allocated mpdu.

Change-Id: I18d3a57b366b9fa7aa934ac062c7acd1a9065d1b
CRs-Fixed: 3295577
Sushant Butta 2 years ago
parent
commit
dfed04fde0
1 changed files with 27 additions and 16 deletions
  1. 27 16
      dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.c

+ 27 - 16
dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.c

@@ -339,6 +339,28 @@ void dp_rx_mon_pf_tag_to_buf_headroom_2_0(void *nbuf,
 
 #endif
 
+/**
+ * dp_rx_mon_free_mpdu_queue() - Free MPDU queue
+ * @mon_pdev: monitor pdev
+ * @ppdu_info: PPDU info
+ *
+ * Return: Void
+ */
+
+static void dp_rx_mon_free_mpdu_queue(struct dp_mon_pdev *mon_pdev,
+				      struct hal_rx_ppdu_info *ppdu_info)
+{
+	uint8_t user;
+	qdf_nbuf_t mpdu;
+
+	for (user = 0; user < HAL_MAX_UL_MU_USERS; user++) {
+		if (!qdf_nbuf_is_queue_empty(&ppdu_info->mpdu_q[user])) {
+			while ((mpdu = qdf_nbuf_queue_remove(&ppdu_info->mpdu_q[user])) != NULL)
+				dp_mon_free_parent_nbuf(mon_pdev, mpdu);
+		}
+	}
+}
+
 /**
  * dp_rx_mon_free_ppdu_info () - Free PPDU info
  * @pdev: DP pdev
@@ -350,23 +372,10 @@ static void
 dp_rx_mon_free_ppdu_info(struct dp_pdev *pdev,
 			 struct hal_rx_ppdu_info *ppdu_info)
 {
-	uint8_t user;
 	struct dp_mon_pdev *mon_pdev;
 
 	mon_pdev = (struct dp_mon_pdev *)pdev->monitor_pdev;
-	for (user = 0; user < ppdu_info->com_info.num_users; user++) {
-		uint16_t mpdu_count  = ppdu_info->mpdu_count[user];
-		uint16_t mpdu_idx;
-		qdf_nbuf_t mpdu;
-
-		for (mpdu_idx = 0; mpdu_idx < mpdu_count; mpdu_idx++) {
-			mpdu = qdf_nbuf_queue_remove(&ppdu_info->mpdu_q[user]);
-
-			if (!mpdu)
-				continue;
-			dp_mon_free_parent_nbuf(mon_pdev, mpdu);
-		}
-	}
+	dp_rx_mon_free_mpdu_queue(mon_pdev, ppdu_info);
 	__dp_rx_mon_free_ppdu_info(mon_pdev, ppdu_info);
 }
 
@@ -399,7 +408,7 @@ void dp_rx_mon_drain_wq(struct dp_pdev *pdev)
 		TAILQ_REMOVE(&mon_pdev_be->rx_mon_queue,
 			     ppdu_info, ppdu_list_elem);
 
-		__dp_rx_mon_free_ppdu_info(mon_pdev, ppdu_info);
+		dp_rx_mon_free_ppdu_info(pdev, ppdu_info);
 	}
 	qdf_spin_unlock_bh(&mon_pdev_be->rx_mon_wq_lock);
 }
@@ -451,6 +460,7 @@ dp_rx_mon_process_ppdu_info(struct dp_pdev *pdev,
 {
 	struct dp_mon_pdev *mon_pdev = (struct dp_mon_pdev *)pdev->monitor_pdev;
 	uint8_t user;
+	qdf_nbuf_t mpdu;
 
 	if (!ppdu_info)
 		return;
@@ -460,7 +470,6 @@ dp_rx_mon_process_ppdu_info(struct dp_pdev *pdev,
 	for (user = 0; user < ppdu_info->com_info.num_users; user++) {
 		uint16_t mpdu_count  = ppdu_info->mpdu_count[user];
 		uint16_t mpdu_idx;
-		qdf_nbuf_t mpdu;
 		struct hal_rx_mon_mpdu_info *mpdu_meta;
 		QDF_STATUS status;
 
@@ -519,6 +528,8 @@ dp_rx_mon_process_ppdu_info(struct dp_pdev *pdev,
 			}
 		}
 	}
+
+	dp_rx_mon_free_mpdu_queue(mon_pdev, ppdu_info);
 }
 
 /**