Quellcode durchsuchen

qcacld-3.0: Change event_lock for HDD IPA resources with ipa_lock

qcacld-2.0 to qcacld-3.0 propagation

HDD IPA event_lock was originally introduced to protect IPA resources
between HDD_IPA events, but this also used to protect HDD IPA internal
struct now. So, this could cause an unexpected deadlock by guarding
too wide resources.
This change is to separate a lock for IPA resources.

Change-Id: Ie9b676e5d4775e54bddf141b841e0f0daeb22731
CRs-fixed: 934723
Yun Park vor 9 Jahren
Ursprung
Commit
e59b3915fa
1 geänderte Dateien mit 17 neuen und 14 gelöschten Zeilen
  1. 17 14
      core/hdd/src/wlan_hdd_ipa.c

+ 17 - 14
core/hdd/src/wlan_hdd_ipa.c

@@ -413,6 +413,7 @@ struct hdd_ipa_priv {
 	unsigned int rt_buf_fill_index;
 	cdf_mc_timer_t rt_debug_fill_timer;
 	cdf_mutex_t rt_debug_lock;
+	cdf_mutex_t ipa_lock;
 };
 
 #define HDD_IPA_WLAN_CLD_HDR_LEN        sizeof(struct hdd_ipa_cld_hdr)
@@ -857,7 +858,7 @@ void hdd_ipa_uc_stat_query(hdd_context_t *pHddCtx,
 		return;
 	}
 
-	cdf_mutex_acquire(&hdd_ipa->event_lock);
+	cdf_mutex_acquire(&hdd_ipa->ipa_lock);
 	if ((HDD_IPA_UC_NUM_WDI_PIPE == hdd_ipa->activated_fw_pipe) &&
 		(false == hdd_ipa->resource_loading)) {
 		*ipa_tx_diff = hdd_ipa->ipa_tx_packets_diff;
@@ -865,7 +866,7 @@ void hdd_ipa_uc_stat_query(hdd_context_t *pHddCtx,
 		HDD_IPA_LOG(LOG1, "STAT Query TX DIFF %d, RX DIFF %d",
 			    *ipa_tx_diff, *ipa_rx_diff);
 	}
-	cdf_mutex_release(&hdd_ipa->event_lock);
+	cdf_mutex_release(&hdd_ipa->ipa_lock);
 	return;
 }
 
@@ -893,7 +894,7 @@ void hdd_ipa_uc_stat_request(hdd_adapter_t *adapter, uint8_t reason)
 	}
 
 	HDD_IPA_LOG(LOG1, "STAT REQ Reason %d", reason);
-	cdf_mutex_acquire(&hdd_ipa->event_lock);
+	cdf_mutex_acquire(&hdd_ipa->ipa_lock);
 	if ((HDD_IPA_UC_NUM_WDI_PIPE == hdd_ipa->activated_fw_pipe) &&
 		(false == hdd_ipa->resource_loading)) {
 		hdd_ipa->stat_req_reason = reason;
@@ -902,7 +903,7 @@ void hdd_ipa_uc_stat_request(hdd_adapter_t *adapter, uint8_t reason)
 			(int)WMA_VDEV_TXRX_GET_IPA_UC_FW_STATS_CMDID,
 			0, VDEV_CMD);
 	}
-	cdf_mutex_release(&hdd_ipa->event_lock);
+	cdf_mutex_release(&hdd_ipa->ipa_lock);
 }
 
 /**
@@ -1147,12 +1148,12 @@ hdd_ipa_uc_rm_notify_handler(void *context, enum ipa_rm_event event)
 	case IPA_RM_RESOURCE_GRANTED:
 		/* Differed RM Granted */
 		hdd_ipa_uc_enable_pipes(hdd_ipa);
-		cdf_mutex_acquire(&hdd_ipa->event_lock);
+		cdf_mutex_acquire(&hdd_ipa->ipa_lock);
 		if ((false == hdd_ipa->resource_unloading) &&
 			(!hdd_ipa->activated_fw_pipe)) {
 			hdd_ipa_uc_enable_pipes(hdd_ipa);
 		}
-		cdf_mutex_release(&hdd_ipa->event_lock);
+		cdf_mutex_release(&hdd_ipa->ipa_lock);
 		if (hdd_ipa->pending_cons_req) {
 			ipa_rm_notify_completion(IPA_RM_RESOURCE_GRANTED,
 						 IPA_RM_RESOURCE_WLAN_CONS);
@@ -1288,18 +1289,18 @@ static void hdd_ipa_uc_op_cb(struct op_msg_type *op_msg, void *usr_ctxt)
 
 	if ((HDD_IPA_UC_OPCODE_TX_RESUME == msg->op_code) ||
 	    (HDD_IPA_UC_OPCODE_RX_RESUME == msg->op_code)) {
-		cdf_mutex_acquire(&hdd_ipa->event_lock);
+		cdf_mutex_acquire(&hdd_ipa->ipa_lock);
 		hdd_ipa->activated_fw_pipe++;
 		if (HDD_IPA_UC_NUM_WDI_PIPE == hdd_ipa->activated_fw_pipe) {
 			hdd_ipa->resource_loading = false;
 			hdd_ipa_uc_proc_pending_event(hdd_ipa);
 		}
-		cdf_mutex_release(&hdd_ipa->event_lock);
+		cdf_mutex_release(&hdd_ipa->ipa_lock);
 	}
 
 	if ((HDD_IPA_UC_OPCODE_TX_SUSPEND == msg->op_code) ||
 	    (HDD_IPA_UC_OPCODE_RX_SUSPEND == msg->op_code)) {
-		cdf_mutex_acquire(&hdd_ipa->event_lock);
+		cdf_mutex_acquire(&hdd_ipa->ipa_lock);
 		hdd_ipa->activated_fw_pipe--;
 		if (!hdd_ipa->activated_fw_pipe) {
 			hdd_ipa_uc_disable_pipes(hdd_ipa);
@@ -1314,7 +1315,7 @@ static void hdd_ipa_uc_op_cb(struct op_msg_type *op_msg, void *usr_ctxt)
 				hdd_ipa_uc_proc_pending_event(hdd_ipa);
 			}
 		}
-		cdf_mutex_release(&hdd_ipa->event_lock);
+		cdf_mutex_release(&hdd_ipa->ipa_lock);
 	}
 
 	if ((HDD_IPA_UC_OPCODE_STATS == msg->op_code) &&
@@ -1498,7 +1499,7 @@ static void hdd_ipa_uc_op_cb(struct op_msg_type *op_msg, void *usr_ctxt)
 		/* STATs from FW */
 		uc_fw_stat = (struct ipa_uc_fw_stats *)
 			((uint8_t *)op_msg + sizeof(struct op_msg_type));
-		cdf_mutex_acquire(&hdd_ipa->event_lock);
+		cdf_mutex_acquire(&hdd_ipa->ipa_lock);
 		hdd_ipa->ipa_tx_packets_diff = HDD_BW_GET_DIFF(
 			uc_fw_stat->tx_pkts_completed,
 			hdd_ipa->ipa_p_tx_packets);
@@ -1513,7 +1514,7 @@ static void hdd_ipa_uc_op_cb(struct op_msg_type *op_msg, void *usr_ctxt)
 			(uc_fw_stat->rx_num_ind_drop_no_space +
 			uc_fw_stat->rx_num_ind_drop_no_buf +
 			uc_fw_stat->rx_num_pkts_indicated);
-		cdf_mutex_release(&hdd_ipa->event_lock);
+		cdf_mutex_release(&hdd_ipa->ipa_lock);
 	} else {
 		HDD_IPA_LOG(LOGE, "INVALID REASON %d",
 			    hdd_ipa->stat_req_reason);
@@ -1667,6 +1668,7 @@ static CDF_STATUS hdd_ipa_uc_ol_init(hdd_context_t *hdd_ctx)
 
 	cdf_list_init(&ipa_ctxt->pending_event, 1000);
 	cdf_mutex_init(&ipa_ctxt->event_lock);
+	cdf_mutex_init(&ipa_ctxt->ipa_lock);
 
 	/* TX PIPE */
 	pipe_in.sys.ipa_ep_cfg.nat.nat_en = IPA_BYPASS_NAT;
@@ -1820,12 +1822,12 @@ int hdd_ipa_uc_ssr_deinit(void)
 	 */
 	hdd_ipa_uc_disable_pipes(hdd_ipa);
 
-	cdf_wake_lock_acquire(&hdd_ipa->event_lock);
+	cdf_wake_lock_acquire(&hdd_ipa->ipa_lock);
 	for (idx = 0; idx < WLAN_MAX_STA_COUNT; idx++) {
 		hdd_ipa->assoc_stas_map[idx].is_reserved = false;
 		hdd_ipa->assoc_stas_map[idx].sta_id = 0xFF;
 	}
-	cdf_wake_lock_release(&hdd_ipa->event_lock);
+	cdf_wake_lock_release(&hdd_ipa->ipa_lock);
 
 	/* Full IPA driver cleanup not required since wlan driver is now
 	 * unloaded and reloaded after SSR.
@@ -3964,6 +3966,7 @@ CDF_STATUS hdd_ipa_cleanup(hdd_context_t *hdd_ctx)
 			    "%s: Disconnect RX PIPE", __func__);
 		ipa_disconnect_wdi_pipe(hdd_ipa->rx_pipe_handle);
 		cdf_mutex_destroy(&hdd_ipa->event_lock);
+		cdf_mutex_destroy(&hdd_ipa->ipa_lock);
 		cdf_list_destroy(&hdd_ipa->pending_event);
 
 #ifdef WLAN_OPEN_SOURCE