Ver código fonte

qcacmn: Fix synchronisation between process and tasklet contexts

Currently, qdf_spin_lock/qdf_spin_unlock is used to protect
spectral_lock. This can lead to a deadlock when the process
context is holding the lock and gets pre-empted by the tasklet.
To avoid this use qdf_spin_lock_bh/qdf_spin_unlock_bh.

Change-Id: Ibd2be7b7f3faf2dea9d7df8d6468c7a8fda512f2
CRs-Fixed: 3124199
Jhalak Naik 3 anos atrás
pai
commit
2588f440fb
1 arquivos alterados com 14 adições e 14 exclusões
  1. 14 14
      target_if/spectral/target_if_spectral.c

+ 14 - 14
target_if/spectral/target_if_spectral.c

@@ -5969,7 +5969,7 @@ target_if_start_spectral_scan(struct wlan_objmgr_pdev *pdev,
 		spectral->params_valid[smode] = true;
 	}
 
-	qdf_spin_lock(&spectral->spectral_lock);
+	qdf_spin_lock_bh(&spectral->spectral_lock);
 	if (smode == SPECTRAL_SCAN_MODE_AGILE) {
 		QDF_STATUS status;
 		bool is_overlapping;
@@ -5985,7 +5985,7 @@ target_if_start_spectral_scan(struct wlan_objmgr_pdev *pdev,
 			(spectral, ch_width, spectral->params
 			 [SPECTRAL_SCAN_MODE_AGILE].ss_frequency.cfreq2 > 0);
 		if (QDF_IS_STATUS_ERROR(status)) {
-			qdf_spin_unlock(&spectral->spectral_lock);
+			qdf_spin_unlock_bh(&spectral->spectral_lock);
 			spectral_err("Failed to populate channel width");
 			return QDF_STATUS_E_FAILURE;
 		}
@@ -5994,13 +5994,13 @@ target_if_start_spectral_scan(struct wlan_objmgr_pdev *pdev,
 
 		if (!spectral->params[smode].ss_frequency.cfreq1) {
 			*err = SPECTRAL_SCAN_ERR_PARAM_NOT_INITIALIZED;
-			qdf_spin_unlock(&spectral->spectral_lock);
+			qdf_spin_unlock_bh(&spectral->spectral_lock);
 			spectral_err("Agile Spectral cfreq1 is 0");
 			return QDF_STATUS_E_FAILURE;
 		} else if (agile_ch_width == CH_WIDTH_80P80MHZ &&
 			   !spectral->params[smode].ss_frequency.cfreq2) {
 			*err = SPECTRAL_SCAN_ERR_PARAM_NOT_INITIALIZED;
-			qdf_spin_unlock(&spectral->spectral_lock);
+			qdf_spin_unlock_bh(&spectral->spectral_lock);
 			spectral_err("Agile Spectral cfreq2 is 0");
 			return QDF_STATUS_E_FAILURE;
 		}
@@ -6010,13 +6010,13 @@ target_if_start_spectral_scan(struct wlan_objmgr_pdev *pdev,
 				 &spectral->params[smode].ss_frequency,
 				 &is_overlapping);
 		if (QDF_IS_STATUS_ERROR(status)) {
-			qdf_spin_unlock(&spectral->spectral_lock);
+			qdf_spin_unlock_bh(&spectral->spectral_lock);
 			return QDF_STATUS_E_FAILURE;
 		}
 
 		if (is_overlapping) {
 			*err = SPECTRAL_SCAN_ERR_PARAM_INVALID_VALUE;
-			qdf_spin_unlock(&spectral->spectral_lock);
+			qdf_spin_unlock_bh(&spectral->spectral_lock);
 			return QDF_STATUS_E_FAILURE;
 		}
 	}
@@ -6024,7 +6024,7 @@ target_if_start_spectral_scan(struct wlan_objmgr_pdev *pdev,
 	/* Populate detectot list first */
 	ret = target_if_spectral_detector_list_init(spectral);
 	if (QDF_IS_STATUS_ERROR(ret)) {
-		qdf_spin_unlock(&spectral->spectral_lock);
+		qdf_spin_unlock_bh(&spectral->spectral_lock);
 		spectral_err("Failed to initialize detector list");
 		return ret;
 	}
@@ -6034,7 +6034,7 @@ target_if_start_spectral_scan(struct wlan_objmgr_pdev *pdev,
 			spectral->params[SPECTRAL_SCAN_MODE_AGILE].
 			ss_frequency.cfreq2 > 0);
 	if (QDF_IS_STATUS_ERROR(ret)) {
-		qdf_spin_unlock(&spectral->spectral_lock);
+		qdf_spin_unlock_bh(&spectral->spectral_lock);
 		spectral_err("Failed to get channel widths");
 		return ret;
 	}
@@ -6043,7 +6043,7 @@ target_if_start_spectral_scan(struct wlan_objmgr_pdev *pdev,
 				spectral->pdev_obj,
 				&is_session_info_expected);
 	if (QDF_IS_STATUS_ERROR(ret)) {
-		qdf_spin_unlock(&spectral->spectral_lock);
+		qdf_spin_unlock_bh(&spectral->spectral_lock);
 		spectral_err("Failed to check if session info is expected");
 		return ret;
 	}
@@ -6053,7 +6053,7 @@ target_if_start_spectral_scan(struct wlan_objmgr_pdev *pdev,
 		ret = target_if_spectral_populate_session_report_info(spectral,
 								      smode);
 		if (QDF_IS_STATUS_ERROR(ret)) {
-			qdf_spin_unlock(&spectral->spectral_lock);
+			qdf_spin_unlock_bh(&spectral->spectral_lock);
 			spectral_err("Failed to populate per-session report info");
 			return QDF_STATUS_E_FAILURE;
 		}
@@ -6061,7 +6061,7 @@ target_if_start_spectral_scan(struct wlan_objmgr_pdev *pdev,
 		ret = target_if_spectral_populate_session_det_host_info(
 					spectral, smode);
 		if (QDF_IS_STATUS_ERROR(ret)) {
-			qdf_spin_unlock(&spectral->spectral_lock);
+			qdf_spin_unlock_bh(&spectral->spectral_lock);
 			spectral_err("Failed to populate per-session detector info");
 			return QDF_STATUS_E_FAILURE;
 		}
@@ -6072,7 +6072,7 @@ target_if_start_spectral_scan(struct wlan_objmgr_pdev *pdev,
 					      err);
 
 	spectral->sscan_width_configured[smode] = false;
-	qdf_spin_unlock(&spectral->spectral_lock);
+	qdf_spin_unlock_bh(&spectral->spectral_lock);
 
 	return QDF_STATUS_SUCCESS;
 }
@@ -6116,7 +6116,7 @@ target_if_stop_spectral_scan(struct wlan_objmgr_pdev *pdev,
 	}
 	p_sops = GET_TARGET_IF_SPECTRAL_OPS(spectral);
 
-	qdf_spin_lock(&spectral->spectral_lock);
+	qdf_spin_lock_bh(&spectral->spectral_lock);
 	p_sops->stop_spectral_scan(spectral, smode);
 	if (spectral->classify_scan) {
 		/* TODO : Check if this logic is necessary */
@@ -6141,7 +6141,7 @@ target_if_stop_spectral_scan(struct wlan_objmgr_pdev *pdev,
 	spectral->report_info[smode].valid = false;
 	qdf_spin_unlock_bh(&spectral->session_report_info_lock);
 
-	qdf_spin_unlock(&spectral->spectral_lock);
+	qdf_spin_unlock_bh(&spectral->spectral_lock);
 
 	return QDF_STATUS_SUCCESS;
 }