qcacld-3.0: Fix deadlock in hdd_adapter_lock usage

hdd_adapter_lock is acquired from MC thread and hif_napi soft IRQ
context so it should be acquired using spin_lock_bh such that when
MC thread is holding the lock soft IRQ can't pre-empt it and lead
to deadlock

Change-Id: Iee4a4905bf7cc09cba9bd26f416d505eb47a5c96
CRs-Fixed: 981886
This commit is contained in:
Rajeev Kumar 2016-02-25 12:24:32 -08:00 • committed by Gerrit - the friendly Code Review server
commit dd4dd08b2c

View file

@ -3272,10 +3272,10 @@ QDF_STATUS hdd_get_front_adapter(hdd_context_t *hdd_ctx,
hdd_adapter_list_node_t **padapterNode)
{
QDF_STATUS status;
qdf_spin_lock(&hdd_ctx->hdd_adapter_lock);
qdf_spin_lock_bh(&hdd_ctx->hdd_adapter_lock);
status = qdf_list_peek_front(&hdd_ctx->hddAdapters,
(qdf_list_node_t **) padapterNode);
qdf_spin_unlock(&hdd_ctx->hdd_adapter_lock);
qdf_spin_unlock_bh(&hdd_ctx->hdd_adapter_lock);
return status;
}
@ -3284,12 +3284,12 @@ QDF_STATUS hdd_get_next_adapter(hdd_context_t *hdd_ctx,
hdd_adapter_list_node_t **pNextAdapterNode)
{
QDF_STATUS status;
qdf_spin_lock(&hdd_ctx->hdd_adapter_lock);
qdf_spin_lock_bh(&hdd_ctx->hdd_adapter_lock);
status = qdf_list_peek_next(&hdd_ctx->hddAdapters,
(qdf_list_node_t *) adapterNode,
(qdf_list_node_t **) pNextAdapterNode);
qdf_spin_unlock(&hdd_ctx->hdd_adapter_lock);
qdf_spin_unlock_bh(&hdd_ctx->hdd_adapter_lock);
return status;
}
@ -3297,10 +3297,10 @@ QDF_STATUS hdd_remove_adapter(hdd_context_t *hdd_ctx,
hdd_adapter_list_node_t *adapterNode)
{
QDF_STATUS status;
qdf_spin_lock(&hdd_ctx->hdd_adapter_lock);
qdf_spin_lock_bh(&hdd_ctx->hdd_adapter_lock);
status = qdf_list_remove_node(&hdd_ctx->hddAdapters,
&adapterNode->node);
qdf_spin_unlock(&hdd_ctx->hdd_adapter_lock);
qdf_spin_unlock_bh(&hdd_ctx->hdd_adapter_lock);
return status;
}
@ -3308,10 +3308,10 @@ QDF_STATUS hdd_remove_front_adapter(hdd_context_t *hdd_ctx,
hdd_adapter_list_node_t **padapterNode)
{
QDF_STATUS status;
qdf_spin_lock(&hdd_ctx->hdd_adapter_lock);
qdf_spin_lock_bh(&hdd_ctx->hdd_adapter_lock);
status = qdf_list_remove_front(&hdd_ctx->hddAdapters,
(qdf_list_node_t **) padapterNode);
qdf_spin_unlock(&hdd_ctx->hdd_adapter_lock);
qdf_spin_unlock_bh(&hdd_ctx->hdd_adapter_lock);
return status;
}
@ -3319,10 +3319,10 @@ QDF_STATUS hdd_add_adapter_back(hdd_context_t *hdd_ctx,
hdd_adapter_list_node_t *adapterNode)
{
QDF_STATUS status;
qdf_spin_lock(&hdd_ctx->hdd_adapter_lock);
qdf_spin_lock_bh(&hdd_ctx->hdd_adapter_lock);
status = qdf_list_insert_back(&hdd_ctx->hddAdapters,
(qdf_list_node_t *) adapterNode);
qdf_spin_unlock(&hdd_ctx->hdd_adapter_lock);
qdf_spin_unlock_bh(&hdd_ctx->hdd_adapter_lock);
return status;
}
@ -3330,10 +3330,10 @@ QDF_STATUS hdd_add_adapter_front(hdd_context_t *hdd_ctx,
hdd_adapter_list_node_t *adapterNode)
{
QDF_STATUS status;
qdf_spin_lock(&hdd_ctx->hdd_adapter_lock);
qdf_spin_lock_bh(&hdd_ctx->hdd_adapter_lock);
status = qdf_list_insert_front(&hdd_ctx->hddAdapters,
(qdf_list_node_t *) adapterNode);
qdf_spin_unlock(&hdd_ctx->hdd_adapter_lock);
qdf_spin_unlock_bh(&hdd_ctx->hdd_adapter_lock);
return status;
}