summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKabilan Kannan <kabilank@codeaurora.org>2016-11-12 22:25:14 -0800
committerKabilan Kannan <kabilank@codeaurora.org>2016-11-13 19:14:52 -0800
commit8a80d2c792a6ec05c131576a7b5103b0abdc2b2d (patch)
treec9b7bc7868c6159a2c6d7d6d94515fdf8e3b260c
parente849e5f1bd3643d1e09233dc74897f6ba0fa2d8b (diff)
qcacld-3.0: Fix the mutex assert in concurrency module
The mutex qdf_conc_list_lock is accessed, before it is initialized and it triggers the system assert. Initialize the mutex in cds open function to avoid invalid mutex access. Change-Id: Iec13a101ba2cc4a332d486b08f0c0562f648edfa CRs-Fixed: 1089357
-rw-r--r--core/cds/src/cds_api.c19
-rw-r--r--core/cds/src/cds_concurrency.c14
2 files changed, 18 insertions, 15 deletions
diff --git a/core/cds/src/cds_api.c b/core/cds/src/cds_api.c
index 1eaf73bd3ab4..ff84def298ec 100644
--- a/core/cds/src/cds_api.c
+++ b/core/cds/src/cds_api.c
@@ -245,6 +245,14 @@ QDF_STATUS cds_open(void)
QDF_ASSERT(0);
goto err_msg_queue;
}
+
+ if (!QDF_IS_STATUS_SUCCESS(qdf_mutex_create(
+ &cds_ctx->qdf_conc_list_lock))) {
+ cds_err("Failed to init qdf_conc_list_lock");
+ QDF_ASSERT(0);
+ goto err_msg_queue;
+ }
+
/* Now Open the CDS Scheduler */
if (pHddCtx->driver_status == DRIVER_MODULES_UNINITIALIZED ||
@@ -258,7 +266,7 @@ QDF_STATUS cds_open(void)
QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_FATAL,
"%s: Failed to open CDS Scheduler", __func__);
QDF_ASSERT(0);
- goto err_msg_queue;
+ goto err_concurrency_lock;
}
}
@@ -415,6 +423,9 @@ err_bmi_close:
err_sched_close:
cds_sched_close(gp_cds_context);
+err_concurrency_lock:
+ qdf_mutex_destroy(&cds_ctx->qdf_conc_list_lock);
+
err_msg_queue:
cds_mq_deinit(&gp_cds_context->freeVosMq);
@@ -849,6 +860,12 @@ QDF_STATUS cds_close(v_CONTEXT_t cds_context)
QDF_ASSERT(QDF_IS_STATUS_SUCCESS(qdf_status));
}
+ if (!QDF_IS_STATUS_SUCCESS(qdf_mutex_destroy(
+ &gp_cds_context->qdf_conc_list_lock))) {
+ cds_err("Failed to destroy qdf_conc_list_lock");
+ QDF_ASSERT(QDF_IS_STATUS_SUCCESS(qdf_status));
+ }
+
cds_shutdown_notifier_purge();
cds_deinit_log_completion();
diff --git a/core/cds/src/cds_concurrency.c b/core/cds/src/cds_concurrency.c
index b222415f825b..0940968ed4cb 100644
--- a/core/cds/src/cds_concurrency.c
+++ b/core/cds/src/cds_concurrency.c
@@ -4080,13 +4080,6 @@ QDF_STATUS cds_deinit_policy_mgr(void)
QDF_ASSERT(0);
}
- if (!QDF_IS_STATUS_SUCCESS(qdf_mutex_destroy(
- &cds_ctx->qdf_conc_list_lock))) {
- cds_err("Failed to destroy qdf_conc_list_lock");
- status = QDF_STATUS_E_FAILURE;
- QDF_ASSERT(0);
- }
-
if (QDF_TIMER_STATE_RUNNING ==
qdf_mc_timer_get_current_state(
&cds_ctx->dbs_opportunistic_timer)) {
@@ -4143,13 +4136,6 @@ QDF_STATUS cds_init_policy_mgr(struct cds_sme_cbacks *sme_cbacks)
/* init conc_connection_list */
qdf_mem_zero(conc_connection_list, sizeof(conc_connection_list));
- if (!QDF_IS_STATUS_SUCCESS(qdf_mutex_create(
- &cds_ctx->qdf_conc_list_lock))) {
- cds_err("Failed to init qdf_conc_list_lock");
- /* Lets us not proceed further */
- return QDF_STATUS_E_FAILURE;
- }
-
sme_register_hw_mode_trans_cb(hdd_ctx->hHal,
cds_hw_mode_transition_cb);
status = qdf_mc_timer_init(&cds_ctx->dbs_opportunistic_timer,