浏览代码

qcacld-3.0: reduce spinlock time in htt_rx_hash_deinit

12ms is too long to hold a spinlock bh.

Change-Id: Ie57c94c20f81dd060185728901b1d14119609825
CRs-Fixed: 1100552
Houston Hoffman 8 年之前
父节点
当前提交
54f465a80b
共有 1 个文件被更改,包括 8 次插入6 次删除
  1. 8 6
      core/dp/htt/htt_rx.c

+ 8 - 6
core/dp/htt/htt_rx.c

@@ -124,17 +124,21 @@ static void htt_rx_hash_deinit(struct htt_pdev_t *pdev)
 
 	uint32_t i;
 	struct htt_rx_hash_entry *hash_entry;
+	struct htt_rx_hash_bucket **hash_table;
 	struct htt_list_node *list_iter = NULL;
 
 	if (NULL == pdev->rx_ring.hash_table)
 		return;
 
 	qdf_spin_lock_bh(&(pdev->rx_ring.rx_hash_lock));
+	hash_table = pdev->rx_ring.hash_table;
+	pdev->rx_ring.hash_table = NULL;
+	qdf_spin_unlock_bh(&(pdev->rx_ring.rx_hash_lock));
 
 	for (i = 0; i < RX_NUM_HASH_BUCKETS; i++) {
 		/* Free the hash entries in hash bucket i */
-		list_iter = pdev->rx_ring.hash_table[i]->listhead.next;
-		while (list_iter != &pdev->rx_ring.hash_table[i]->listhead) {
+		list_iter = hash_table[i]->listhead.next;
+		while (list_iter != &hash_table[i]->listhead) {
 			hash_entry =
 				(struct htt_rx_hash_entry *)((char *)list_iter -
 							     pdev->rx_ring.
@@ -156,13 +160,11 @@ static void htt_rx_hash_deinit(struct htt_pdev_t *pdev)
 				qdf_mem_free(hash_entry);
 		}
 
-		qdf_mem_free(pdev->rx_ring.hash_table[i]);
+		qdf_mem_free(hash_table[i]);
 
 	}
-	qdf_mem_free(pdev->rx_ring.hash_table);
-	pdev->rx_ring.hash_table = NULL;
+	qdf_mem_free(hash_table);
 
-	qdf_spin_unlock_bh(&(pdev->rx_ring.rx_hash_lock));
 	qdf_spinlock_destroy(&(pdev->rx_ring.rx_hash_lock));
 
 }