diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_client.c b/drivers/platform/msm/ipa/ipa_v3/ipa_client.c index 9c92fd487e6e..8ca62014e5cf 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_client.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_client.c @@ -1609,6 +1609,7 @@ int ipa3_release_gsi_channel(u32 clnt_hdl) struct ipa3_ep_context *ep; int result = -EFAULT; enum gsi_status gsi_res; + unsigned long flags; IPADBG("entry\n"); if (clnt_hdl >= ipa3_ctx->ipa_num_pipes || @@ -1623,10 +1624,9 @@ int ipa3_release_gsi_channel(u32 clnt_hdl) IPA_ACTIVE_CLIENTS_INC_EP(ipa3_get_client_mapping(clnt_hdl)); /* Set the disconnect in progress flag to avoid calling cb.*/ - spin_lock(&ipa3_ctx->disconnect_lock); + spin_lock_irqsave(&ipa3_ctx->disconnect_lock, flags); atomic_set(&ep->disconnect_in_progress, 1); - spin_unlock(&ipa3_ctx->disconnect_lock); - + spin_unlock_irqrestore(&ipa3_ctx->disconnect_lock, flags); gsi_res = gsi_dealloc_channel(ep->gsi_chan_hdl); if (gsi_res != GSI_STATUS_SUCCESS) { @@ -1646,9 +1646,9 @@ int ipa3_release_gsi_channel(u32 clnt_hdl) if (!ep->keep_ipa_awake) IPA_ACTIVE_CLIENTS_DEC_EP(ipa3_get_client_mapping(clnt_hdl)); - spin_lock(&ipa3_ctx->disconnect_lock); + spin_lock_irqsave(&ipa3_ctx->disconnect_lock, flags); memset(&ipa3_ctx->ep[clnt_hdl], 0, sizeof(struct ipa3_ep_context)); - spin_unlock(&ipa3_ctx->disconnect_lock); + spin_unlock_irqrestore(&ipa3_ctx->disconnect_lock, flags); IPADBG("exit\n"); return 0; diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c b/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c index 8ff6f6b28b6c..0695a368e945 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c @@ -7120,16 +7120,13 @@ int ipa3_alloc_counter_id(struct ipa_ioc_flt_rt_counter_alloc *header) { int i, unused_cnt, unused_max, unused_start_id; struct ipa_ioc_flt_rt_counter_alloc *counter; - - idr_preload(GFP_KERNEL); - spin_lock(&ipa3_ctx->flt_rt_counters.hdl_lock); - counter = kmem_cache_zalloc(ipa3_ctx->fnr_stats_cache, GFP_KERNEL); if (!counter) { IPAERR_RL("failed to alloc fnr stats counter object\n"); - spin_unlock(&ipa3_ctx->flt_rt_counters.hdl_lock); return -ENOMEM; } + idr_preload(GFP_KERNEL); + spin_lock(&ipa3_ctx->flt_rt_counters.hdl_lock); memcpy(counter, header, sizeof(struct ipa_ioc_flt_rt_counter_alloc)); /* allocate hw counters */ counter->hw_counter.start_id = 0;