소스 검색

qcacmn: Fix synchronisation between process context and tasklet

Spectral parameter state information is accessed in both
process context and tasklet context. Currently
qdf_spin_lock/qdf_spin_unlock is used to protect these data structures.
This can lead to deadlock in the scenario where the process holding the
lock gets preempted by the tasklet. To avoid this use
qdf_spin_lock_bh/qdf_spin_unlock_bh.

CRs-Fixed: 2776902
Change-Id: I6d188e55d5066241b5f38a655f4a587c9edb0b8b
Edayilliam Jayadev 4 년 전
부모
커밋
8c77df3b7a
1개의 변경된 파일13개의 추가작업 그리고 13개의 파일을 삭제
  1. 13 13
      target_if/spectral/target_if_spectral.c

+ 13 - 13
target_if/spectral/target_if_spectral.c

@@ -558,7 +558,7 @@ target_if_spectral_info_read(
 		return -EINVAL;
 	}
 
-	qdf_spin_lock(&info->osps_lock);
+	qdf_spin_lock_bh(&info->osps_lock);
 
 	if (is_cacheable) {
 		if (info->osps_cache.osc_is_valid) {
@@ -601,7 +601,7 @@ target_if_spectral_info_read(
 				/* We can't reach this point */
 				break;
 			}
-			qdf_spin_unlock(&info->osps_lock);
+			qdf_spin_unlock_bh(&info->osps_lock);
 			return 0;
 		}
 	}
@@ -615,7 +615,7 @@ target_if_spectral_info_read(
 	init_def_retval =
 			target_if_spectral_info_init_defaults(spectral, smode);
 	if (init_def_retval != QDF_STATUS_SUCCESS) {
-		qdf_spin_unlock(&info->osps_lock);
+		qdf_spin_unlock_bh(&info->osps_lock);
 		if (init_def_retval == QDF_STATUS_E_NOENT)
 			return -ENOENT;
 		else
@@ -660,7 +660,7 @@ target_if_spectral_info_read(
 		break;
 	}
 
-	qdf_spin_unlock(&info->osps_lock);
+	qdf_spin_unlock_bh(&info->osps_lock);
 
 	return 0;
 }
@@ -789,7 +789,7 @@ target_if_spectral_info_write(
 
 		pval = (uint8_t *)input;
 
-		qdf_spin_lock(&info->osps_lock);
+		qdf_spin_lock_bh(&info->osps_lock);
 		ret = target_if_send_vdev_spectral_enable_cmd(spectral, smode,
 							      1, *pval, 0, 0);
 
@@ -801,7 +801,7 @@ target_if_spectral_info_write(
 		if (ret < 0) {
 			spectral_err("target_if_send_vdev_spectral_enable_cmd failed with error=%d",
 				     ret);
-			qdf_spin_unlock(&info->osps_lock);
+			qdf_spin_unlock_bh(&info->osps_lock);
 			return ret;
 		}
 
@@ -810,7 +810,7 @@ target_if_spectral_info_write(
 		/* The cache is now valid */
 		info->osps_cache.osc_is_valid = 1;
 
-		qdf_spin_unlock(&info->osps_lock);
+		qdf_spin_unlock_bh(&info->osps_lock);
 		break;
 
 	case TARGET_IF_SPECTRAL_INFO_ENABLED:
@@ -819,7 +819,7 @@ target_if_spectral_info_write(
 
 		pval = (uint8_t *)input;
 
-		qdf_spin_lock(&info->osps_lock);
+		qdf_spin_lock_bh(&info->osps_lock);
 		ret = target_if_send_vdev_spectral_enable_cmd(spectral, smode,
 							      0, 0, 1, *pval);
 
@@ -831,7 +831,7 @@ target_if_spectral_info_write(
 		if (ret < 0) {
 			spectral_err("target_if_send_vdev_spectral_enable_cmd failed with error=%d",
 				     ret);
-			qdf_spin_unlock(&info->osps_lock);
+			qdf_spin_unlock_bh(&info->osps_lock);
 			return ret;
 		}
 
@@ -840,7 +840,7 @@ target_if_spectral_info_write(
 		/* The cache is now valid */
 		info->osps_cache.osc_is_valid = 1;
 
-		qdf_spin_unlock(&info->osps_lock);
+		qdf_spin_unlock_bh(&info->osps_lock);
 		break;
 
 	case TARGET_IF_SPECTRAL_INFO_PARAMS:
@@ -849,7 +849,7 @@ target_if_spectral_info_write(
 
 		param = (struct spectral_config *)input;
 
-		qdf_spin_lock(&info->osps_lock);
+		qdf_spin_lock_bh(&info->osps_lock);
 		ret = target_if_send_vdev_spectral_configure_cmd(spectral,
 								 smode, param);
 
@@ -861,7 +861,7 @@ target_if_spectral_info_write(
 		if (ret < 0) {
 			spectral_err("target_if_send_vdev_spectral_configure_cmd failed with error=%d",
 				     ret);
-			qdf_spin_unlock(&info->osps_lock);
+			qdf_spin_unlock_bh(&info->osps_lock);
 			return ret;
 		}
 
@@ -871,7 +871,7 @@ target_if_spectral_info_write(
 		/* The cache is now valid */
 		info->osps_cache.osc_is_valid = 1;
 
-		qdf_spin_unlock(&info->osps_lock);
+		qdf_spin_unlock_bh(&info->osps_lock);
 		break;
 
 	default: