Bläddra i källkod

qcacld-3.0: Fix an htt memory leak

qcacld-2.0 to qcacld-3.0 propagation

With ATH_11AC_TXCOMPACT defined, host to target message send-completion
won't be called and messages are stored in htt_htc_pkt_misclist after
sending to HTC layer which will be freed upon htt_detach. This list
doesn't have a size limit and outgrow with more messages.
Add a fix to limit the size of this list which gives enough time for
firmware to process these messages before releasing it.

Change-Id: I6feb2d5700abe81a21dd93303163202616c739f5
CRs-Fixed: 902909
Yun Park 8 år sedan
förälder
incheckning
eea1c9ca84
3 ändrade filer med 33 tillägg och 0 borttagningar
  1. 30 0
      core/dp/htt/htt.c
  2. 2 0
      core/dp/htt/htt_internal.h
  3. 1 0
      core/dp/htt/htt_types.h

+ 30 - 0
core/dp/htt/htt.c

@@ -118,6 +118,34 @@ void htt_htc_pkt_pool_free(struct htt_pdev_t *pdev)
 }
 
 #ifdef ATH_11AC_TXCOMPACT
+
+void
+htt_htc_misc_pkt_list_trim(struct htt_pdev_t *pdev, int level)
+{
+	struct htt_htc_pkt_union *pkt, *next, *prev = NULL;
+	int i = 0;
+	qdf_nbuf_t netbuf;
+
+	HTT_TX_MUTEX_ACQUIRE(&pdev->htt_tx_mutex);
+	pkt = pdev->htt_htc_pkt_misclist;
+	while (pkt) {
+		next = pkt->u.next;
+		/* trim the out grown list*/
+		if (++i > level) {
+			netbuf = (qdf_nbuf_t)(pkt->u.pkt.htc_pkt.pNetBufContext);
+			qdf_nbuf_unmap(pdev->osdev, netbuf, QDF_DMA_TO_DEVICE);
+			qdf_nbuf_free(netbuf);
+			qdf_mem_free(pkt);
+			pkt = NULL;
+			if (prev)
+				prev->u.next = NULL;
+		}
+		prev = pkt;
+		pkt = next;
+	}
+	HTT_TX_MUTEX_RELEASE(&pdev->htt_tx_mutex);
+}
+
 void htt_htc_misc_pkt_list_add(struct htt_pdev_t *pdev, struct htt_htc_pkt *pkt)
 {
 	struct htt_htc_pkt_union *u_pkt = (struct htt_htc_pkt_union *)pkt;
@@ -130,6 +158,8 @@ void htt_htc_misc_pkt_list_add(struct htt_pdev_t *pdev, struct htt_htc_pkt *pkt)
 		pdev->htt_htc_pkt_misclist = u_pkt;
 	}
 	HTT_TX_MUTEX_RELEASE(&pdev->htt_tx_mutex);
+
+	htt_htc_misc_pkt_list_trim(pdev, HTT_HTC_PKT_MISCLIST_SIZE);
 }
 
 void htt_htc_misc_pkt_pool_free(struct htt_pdev_t *pdev)

+ 2 - 0
core/dp/htt/htt_internal.h

@@ -506,6 +506,8 @@ void htt_htc_pkt_free(struct htt_pdev_t *pdev, struct htt_htc_pkt *pkt);
 void htt_htc_pkt_pool_free(struct htt_pdev_t *pdev);
 
 #ifdef ATH_11AC_TXCOMPACT
+void htt_htc_misc_pkt_list_trim(struct htt_pdev_t *pdev, int level);
+
 void
 htt_htc_misc_pkt_list_add(struct htt_pdev_t *pdev, struct htt_htc_pkt *pkt);
 

+ 1 - 0
core/dp/htt/htt_types.h

@@ -48,6 +48,7 @@
 #endif
 #endif /* QCA_TX_HTT2_SUPPORT */
 
+#define HTT_HTC_PKT_MISCLIST_SIZE           32
 
 struct htt_htc_pkt {
 	void *pdev_ctxt;