ソースを参照

qcacmn: Adding lock in case of epcs context

Adding lock in case of epcs context to achieve mutual exclusion

Change-Id: Ib3e99b5f39eca01c62d32927942e99958320007a
CRs-Fixed: 3568561
Guru Pratap Sharma 2 年 前
コミット
25d2ff265a

+ 86 - 0
umac/mlo_mgr/inc/wlan_mlo_epcs.h

@@ -127,9 +127,15 @@ struct epcs_peer_authorize_info {
 
 /**
  * struct wlan_epcs_context - EPCS context if MLD
+ * @epcs_dev_lock: epcs dev context lock
  * @authorize_info: Array of Authorization info containing peer mac address
  */
 struct wlan_epcs_context {
+#ifdef WLAN_MLO_USE_SPINLOCK
+	qdf_spinlock_t epcs_dev_lock;
+#else
+	qdf_mutex_t epcs_dev_lock;
+#endif
 	struct epcs_peer_authorize_info
 			authorize_info[EPCS_MAX_AUTHORIZE_MAC_ADDR];
 };
@@ -183,6 +189,86 @@ struct epcs_frm {
 #define epcs_rl_debug(format, args...) \
 		QDF_TRACE_DEBUG_RL(QDF_MODULE_ID_EPCS, format, ## args)
 
+#ifdef WLAN_MLO_USE_SPINLOCK
+/**
+ * epcs_dev_lock_create - Create EPCS device mutex/spinlock
+ * @epcs_ctx: EPCS context
+ *
+ * Creates mutex/spinlock
+ *
+ * Return: void
+ */
+static inline void
+epcs_dev_lock_create(struct wlan_epcs_context *epcs_ctx)
+{
+	qdf_spinlock_create(&epcs_ctx->epcs_dev_lock);
+}
+
+/**
+ * epcs_dev_lock_destroy - Destroy EPCS mutex/spinlock
+ * @epcs_ctx: EPCS context
+ *
+ * Destroy mutex/spinlock
+ *
+ * Return: void
+ */
+static inline void
+epcs_dev_lock_destroy(struct wlan_epcs_context *epcs_ctx)
+{
+	qdf_spinlock_destroy(&epcs_ctx->epcs_dev_lock);
+}
+
+/**
+ * epcs_dev_lock_acquire - acquire EPCS mutex/spinlock
+ * @epcs_ctx: EPCS context
+ *
+ * acquire mutex/spinlock
+ *
+ * return: void
+ */
+static inline
+void epcs_dev_lock_acquire(struct wlan_epcs_context *epcs_ctx)
+{
+	qdf_spin_lock_bh(&epcs_ctx->epcs_dev_lock);
+}
+
+/**
+ * epcs_dev_lock_release - release EPCS dev mutex/spinlock
+ * @epcs_ctx: EPCS context
+ *
+ * release mutex/spinlock
+ *
+ * return: void
+ */
+static inline
+void epcs_dev_lock_release(struct wlan_epcs_context *epcs_ctx)
+{
+	qdf_spin_unlock_bh(&epcs_ctx->epcs_dev_lock);
+}
+#else /* WLAN_MLO_USE_SPINLOCK */
+static inline
+void epcs_dev_lock_create(struct wlan_epcs_context *epcs_ctx)
+{
+	qdf_mutex_create(&epcs_ctx->epcs_dev_lock);
+}
+
+static inline
+void epcs_dev_lock_destroy(struct wlan_epcs_context *epcs_ctx)
+{
+	qdf_mutex_destroy(&epcs_ctx->epcs_dev_lock);
+}
+
+static inline void epcs_dev_lock_acquire(struct wlan_epcs_context *epcs_ctx)
+{
+	qdf_mutex_acquire(&epcs_ctx->epcs_dev_lock);
+}
+
+static inline void epcs_dev_lock_release(struct wlan_epcs_context *epcs_ctx)
+{
+	qdf_mutex_release(&epcs_ctx->epcs_dev_lock);
+}
+#endif
+
 /**
  * wlan_mlo_add_epcs_action_frame() - API to add EPCS action frame
  * @frm: Pointer to a frame to add EPCS information

+ 12 - 0
umac/mlo_mgr/src/wlan_mlo_epcs.c

@@ -80,14 +80,18 @@ wlan_mlo_is_node_epcs_authorized(struct wlan_mlo_peer_context *ml_peer)
 		return QDF_STATUS_E_INVAL;
 	}
 
+	epcs_dev_lock_acquire(epcs_ctx);
 	for (i = 0; i < EPCS_MAX_AUTHORIZE_MAC_ADDR; i++) {
 		if (epcs_ctx->authorize_info[i].valid &&
 		    !qdf_mem_cmp(epcs_ctx->authorize_info[i].peer_mld_mac,
 				 ml_peer->peer_mld_addr.bytes,
 				 QDF_MAC_ADDR_SIZE)) {
+			epcs_dev_lock_release(epcs_ctx);
 			return QDF_STATUS_SUCCESS;
 		}
 	}
+	epcs_dev_lock_release(epcs_ctx);
+
 	return QDF_STATUS_E_INVAL;
 }
 
@@ -515,6 +519,7 @@ wlan_mlo_update_authorize_epcs_mac_addr(struct wlan_objmgr_vdev *vdev,
 
 	epcs_ctx = &vdev->mlo_dev_ctx->epcs_ctx;
 
+	epcs_dev_lock_acquire(epcs_ctx);
 	for (i = 0; i < EPCS_MAX_AUTHORIZE_MAC_ADDR; i++) {
 		/* Finding first available slot */
 		if ((!epcs_ctx->authorize_info[i].valid) && (free_index < 0))
@@ -533,11 +538,13 @@ wlan_mlo_update_authorize_epcs_mac_addr(struct wlan_objmgr_vdev *vdev,
 	if (found_entry) {
 		epcs_debug("Mac add "QDF_MAC_ADDR_FMT" is already authorized",
 			   QDF_MAC_ADDR_REF(peer_mld_mac));
+		epcs_dev_lock_release(epcs_ctx);
 		return QDF_STATUS_E_INVAL;
 	}
 
 	if (free_index < 0) {
 		epcs_debug("EPCS authorize database is full");
+		epcs_dev_lock_release(epcs_ctx);
 		return QDF_STATUS_E_INVAL;
 	}
 
@@ -545,6 +552,7 @@ wlan_mlo_update_authorize_epcs_mac_addr(struct wlan_objmgr_vdev *vdev,
 	qdf_mem_copy(epcs_ctx->authorize_info[free_index]. peer_mld_mac,
 		     peer_mld_mac,
 		     QDF_MAC_ADDR_SIZE);
+	epcs_dev_lock_release(epcs_ctx);
 
 	epcs_debug("EPCS Stored authorize mac addr is"QDF_MAC_ADDR_FMT" at index %d",
 		   QDF_MAC_ADDR_REF(peer_mld_mac), free_index);
@@ -567,6 +575,7 @@ wlan_mlo_update_deauthorize_epcs_mac_addr(struct wlan_objmgr_vdev *vdev,
 
 	epcs_ctx = &vdev->mlo_dev_ctx->epcs_ctx;
 
+	epcs_dev_lock_acquire(epcs_ctx);
 	for (i = 0; i < EPCS_MAX_AUTHORIZE_MAC_ADDR; i++) {
 		if (!qdf_mem_cmp(epcs_ctx->authorize_info[i].peer_mld_mac,
 				 peer_mld_mac,
@@ -579,16 +588,19 @@ wlan_mlo_update_deauthorize_epcs_mac_addr(struct wlan_objmgr_vdev *vdev,
 	if (!found_entry) {
 		epcs_debug("Mac addr "QDF_MAC_ADDR_FMT" not found in authorized database",
 			   QDF_MAC_ADDR_REF(peer_mld_mac));
+		epcs_dev_lock_release(epcs_ctx);
 		return QDF_STATUS_E_INVAL;
 	}
 
 	if (found_entry && !epcs_ctx->authorize_info[i].valid) {
 		epcs_debug("Mac addr "QDF_MAC_ADDR_FMT" is already deauthorized in database",
 			   QDF_MAC_ADDR_REF(peer_mld_mac));
+		epcs_dev_lock_release(epcs_ctx);
 		return QDF_STATUS_E_INVAL;
 	}
 
 	epcs_ctx->authorize_info[i].valid = false;
+	epcs_dev_lock_release(epcs_ctx);
 	epcs_debug("EPCS Stored authorize mac addr is "QDF_MAC_ADDR_FMT" at idx %d is removed",
 		   QDF_MAC_ADDR_REF(peer_mld_mac), i);
 

+ 14 - 0
umac/mlo_mgr/src/wlan_mlo_mgr_main.c

@@ -685,6 +685,7 @@ static inline void mlo_epcs_ctx_init(struct wlan_mlo_dev_context *ml_dev)
 
 	epcs_ctx = &ml_dev->epcs_ctx;
 	qdf_mem_zero(epcs_ctx, sizeof(struct wlan_epcs_context));
+	epcs_dev_lock_create(epcs_ctx);
 }
 
 #ifdef QCA_SUPPORT_PRIMARY_LINK_MIGRATE
@@ -818,6 +819,18 @@ static inline void mlo_t2lm_ctx_deinit(struct wlan_objmgr_vdev *vdev)
 	wlan_mlo_t2lm_timer_deinit(vdev);
 }
 
+/**
+ * mlo_epcs_ctx_deinit() - API to deinitialize the epcs context with the default
+ * values.
+ * @vdev: Pointer to vdev structure
+ *
+ * Return: None
+ */
+static inline void mlo_epcs_ctx_deinit(struct wlan_objmgr_vdev *vdev)
+{
+	epcs_dev_lock_destroy(&vdev->mlo_dev_ctx->epcs_ctx);
+}
+
 #ifdef WLAN_FEATURE_ROAM_OFFLOAD
 static void ml_free_copied_reassoc_rsp(struct wlan_mlo_sta *sta_ctx)
 {
@@ -899,6 +912,7 @@ static QDF_STATUS mlo_dev_ctx_deinit(struct wlan_objmgr_vdev *vdev)
 		mlo_ptqm_migration_deinit(ml_dev);
 		mlo_mgr_link_switch_deinit(ml_dev);
 		mlo_t2lm_ctx_deinit(vdev);
+		mlo_epcs_ctx_deinit(vdev);
 		tsf_recalculation_lock_destroy(ml_dev);
 		mlo_dev_lock_destroy(ml_dev);
 		qdf_mem_free(ml_dev);