diff options
| author | Kabilan Kannan <kabilank@codeaurora.org> | 2016-11-12 22:25:14 -0800 |
|---|---|---|
| committer | Kabilan Kannan <kabilank@codeaurora.org> | 2016-11-13 19:14:52 -0800 |
| commit | 8a80d2c792a6ec05c131576a7b5103b0abdc2b2d (patch) | |
| tree | c9b7bc7868c6159a2c6d7d6d94515fdf8e3b260c | |
| parent | e849e5f1bd3643d1e09233dc74897f6ba0fa2d8b (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.c | 19 | ||||
| -rw-r--r-- | core/cds/src/cds_concurrency.c | 14 |
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, |
