Browse Source

qcacmn: lock on queue

Adding lock for dp_txrx_ppdu_stats_handler given
that insertion and deletion happen in different cores.

Change-Id: Ic0102d615f02cbfed70acc1114a314426466638e
Ruben Columbus 4 years ago
parent
commit
2216aa520b
3 changed files with 12 additions and 0 deletions
  1. 5 0
      dp/wifi3.0/dp_htt.c
  2. 3 0
      dp/wifi3.0/dp_main.c
  3. 4 0
      dp/wifi3.0/dp_types.h

+ 5 - 0
dp/wifi3.0/dp_htt.c

@@ -4184,6 +4184,7 @@ static bool dp_txrx_ppdu_stats_handler(struct dp_soc *soc,
 	    !pdev->mcopy_mode && !pdev->bpr_enable)
 	    !pdev->mcopy_mode && !pdev->bpr_enable)
 		return free_buf;
 		return free_buf;
 
 
+	qdf_spin_lock_bh(&pdev->ppdu_stats_lock);
 	ppdu_info = dp_htt_process_tlv(pdev, htt_t2h_msg);
 	ppdu_info = dp_htt_process_tlv(pdev, htt_t2h_msg);
 
 
 	if (pdev->mgmtctrl_frm_info.mgmt_buf) {
 	if (pdev->mgmtctrl_frm_info.mgmt_buf) {
@@ -4200,6 +4201,8 @@ static bool dp_txrx_ppdu_stats_handler(struct dp_soc *soc,
 	pdev->mgmtctrl_frm_info.mgmt_buf_len = 0;
 	pdev->mgmtctrl_frm_info.mgmt_buf_len = 0;
 	pdev->mgmtctrl_frm_info.ppdu_id = 0;
 	pdev->mgmtctrl_frm_info.ppdu_id = 0;
 
 
+	qdf_spin_unlock_bh(&pdev->ppdu_stats_lock);
+
 	return free_buf;
 	return free_buf;
 }
 }
 #else
 #else
@@ -4363,8 +4366,10 @@ dp_ppdu_stats_ind_handler(struct htt_soc *soc,
 	dp_wdi_event_handler(WDI_EVENT_LITE_T2H, soc->dp_soc,
 	dp_wdi_event_handler(WDI_EVENT_LITE_T2H, soc->dp_soc,
 			     htt_t2h_msg, HTT_INVALID_PEER, WDI_NO_VAL,
 			     htt_t2h_msg, HTT_INVALID_PEER, WDI_NO_VAL,
 			     pdev_id);
 			     pdev_id);
+
 	free_buf = dp_txrx_ppdu_stats_handler(soc->dp_soc, pdev_id,
 	free_buf = dp_txrx_ppdu_stats_handler(soc->dp_soc, pdev_id,
 					      htt_t2h_msg);
 					      htt_t2h_msg);
+
 	return free_buf;
 	return free_buf;
 }
 }
 #else
 #else

+ 3 - 0
dp/wifi3.0/dp_main.c

@@ -4681,6 +4681,7 @@ static void dp_pdev_deinit(struct cdp_pdev *txrx_pdev, int force)
 
 
 	qdf_spinlock_destroy(&pdev->tx_mutex);
 	qdf_spinlock_destroy(&pdev->tx_mutex);
 	qdf_spinlock_destroy(&pdev->vdev_list_lock);
 	qdf_spinlock_destroy(&pdev->vdev_list_lock);
+	qdf_spinlock_destroy(&pdev->ppdu_stats_lock);
 
 
 	if (pdev->invalid_peer)
 	if (pdev->invalid_peer)
 		qdf_mem_free(pdev->invalid_peer);
 		qdf_mem_free(pdev->invalid_peer);
@@ -14336,6 +14337,7 @@ static QDF_STATUS dp_pdev_init(struct cdp_soc_t *txrx_soc,
 
 
 	TAILQ_INIT(&pdev->vdev_list);
 	TAILQ_INIT(&pdev->vdev_list);
 	qdf_spinlock_create(&pdev->vdev_list_lock);
 	qdf_spinlock_create(&pdev->vdev_list_lock);
+	qdf_spinlock_create(&pdev->ppdu_stats_lock);
 	pdev->vdev_count = 0;
 	pdev->vdev_count = 0;
 
 
 	qdf_spinlock_create(&pdev->tx_mutex);
 	qdf_spinlock_create(&pdev->tx_mutex);
@@ -14455,6 +14457,7 @@ fail4:
 	qdf_spinlock_destroy(&pdev->neighbour_peer_mutex);
 	qdf_spinlock_destroy(&pdev->neighbour_peer_mutex);
 	qdf_spinlock_destroy(&pdev->tx_mutex);
 	qdf_spinlock_destroy(&pdev->tx_mutex);
 	qdf_spinlock_destroy(&pdev->vdev_list_lock);
 	qdf_spinlock_destroy(&pdev->vdev_list_lock);
+	qdf_spinlock_destroy(&pdev->ppdu_stats_lock);
 	qdf_mem_free(pdev->invalid_peer);
 	qdf_mem_free(pdev->invalid_peer);
 fail3:
 fail3:
 	dp_pdev_srng_deinit(pdev);
 	dp_pdev_srng_deinit(pdev);

+ 4 - 0
dp/wifi3.0/dp_types.h

@@ -2253,6 +2253,10 @@ struct dp_pdev {
 #ifdef ATH_SUPPORT_NAC_RSSI
 #ifdef ATH_SUPPORT_NAC_RSSI
 	bool nac_rssi_filtering;
 	bool nac_rssi_filtering;
 #endif
 #endif
+
+	/* ppdu_stats lock for queue concurrency between cores*/
+	qdf_spinlock_t ppdu_stats_lock;
+
 	/* list of ppdu tlvs */
 	/* list of ppdu tlvs */
 	TAILQ_HEAD(, ppdu_info) ppdu_info_list;
 	TAILQ_HEAD(, ppdu_info) ppdu_info_list;
 	TAILQ_HEAD(, ppdu_info) sched_comp_ppdu_list;
 	TAILQ_HEAD(, ppdu_info) sched_comp_ppdu_list;