Преглед на файлове

qcacld-3.0: Fix memory leak when SSR is triggered

qcacld-2.0 to qcacld-3.0 propagation.

Packets are not freed from cache buffer and causes memory
leak in SSR case. Flush cache RX frame queue to avoid this memory leak.

Change-Id: Idd9edde6fdb3b9ff3ecbe7d8139f9a66468b70af
CRs-Fixed: 1051019
Poddar, Siddarth преди 8 години
родител
ревизия
1ab0a3db60
променени са 3 файла, в които са добавени 26 реда и са изтрити 0 реда
  1. 7 0
      core/cds/inc/cds_api.h
  2. 16 0
      core/cds/src/cds_api.c
  3. 3 0
      core/hdd/src/wlan_hdd_power.c

+ 7 - 0
core/cds/inc/cds_api.h

@@ -206,6 +206,13 @@ QDF_STATUS cds_enable(v_CONTEXT_t cds_context);
 
 QDF_STATUS cds_disable(v_CONTEXT_t cds_context);
 
+/**
+ * cds_flush_cache_rx_queue() - flush cache rx queue frame
+ *
+ * Return: None
+ */
+void cds_flush_cache_rx_queue(void);
+
 QDF_STATUS cds_close(v_CONTEXT_t cds_context);
 
 QDF_STATUS cds_shutdown(v_CONTEXT_t cds_context);

+ 16 - 0
core/cds/src/cds_api.c

@@ -817,6 +817,22 @@ QDF_STATUS cds_close(v_CONTEXT_t cds_context)
 	return QDF_STATUS_SUCCESS;
 }
 
+void cds_flush_cache_rx_queue(void)
+{
+	uint8_t sta_id;
+	struct ol_txrx_peer_t *peer;
+	struct ol_txrx_pdev_t *pdev = cds_get_context(QDF_MODULE_ID_TXRX);
+
+	for (sta_id = 0; sta_id < WLAN_MAX_STA_COUNT; sta_id++) {
+		peer = ol_txrx_peer_find_by_local_id(pdev, sta_id);
+		if (!peer)
+			continue;
+		ol_txrx_flush_rx_frames(peer, 1);
+	}
+	return;
+}
+
+
 /**
  * cds_get_context() - get context data area
  *

+ 3 - 0
core/hdd/src/wlan_hdd_power.c

@@ -1448,6 +1448,9 @@ QDF_STATUS hdd_wlan_shutdown(void)
 	hdd_cleanup_scan_queue(pHddCtx);
 	hdd_reset_all_adapters(pHddCtx);
 
+	/* Flush cached rx frame queue */
+	cds_flush_cache_rx_queue();
+
 	/* De-register the HDD callbacks */
 	hdd_deregister_cb(pHddCtx);
 	hdd_ipa_uc_ssr_deinit();