Browse Source

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 năm trước cách đây
mục cha
commit
8c77df3b7a
1 tập tin đã thay đổi với 13 bổ sung13 xóa
  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: