msm: ipa3: Fix to hold the clock until replenish the descriptors

When CPU load is high IPA buffer replenish WQ scheduling got delayed
because of that not able to replenish the descriptors. Add changes to
hold the clock until replenish the minimum number of descriptors.

Change-Id: Iea79dcaa90d12fc4324522ba2c63dfcdfded2f90
Signed-off-by: Ashok Vuyyuru <avuyyuru@codeaurora.org>
This commit is contained in:
Ashok Vuyyuru 2019-11-27 14:38:56 +05:30 • committed by Gerrit - the friendly Code Review server
commit 5dfa9644c3

View file

@ -2013,7 +2013,6 @@ static void ipa3_replenish_rx_page_recycle(struct ipa3_sys_context *sys)
rx_pkt = sys->repl->cache[curr_wq];
curr_wq = (++curr_wq == sys->repl->capacity) ?
0 : curr_wq;
atomic_set(&sys->repl->head_idx, curr_wq);
}
dma_sync_single_for_device(ipa3_ctx->pdev,
@ -2051,6 +2050,7 @@ static void ipa3_replenish_rx_page_recycle(struct ipa3_sys_context *sys)
if (ret == GSI_STATUS_SUCCESS) {
/* ensure write is done before setting head index */
mb();
atomic_set(&sys->repl->head_idx, curr_wq);
atomic_set(&sys->page_recycle_repl->head_idx, curr);
sys->len = rx_len_cached;
} else {
@ -4970,13 +4970,20 @@ start_poll:
/* call repl_hdlr before napi_reschedule / napi_complete */
if (cnt)
ep->sys->repl_hdlr(ep->sys);
if (cnt < weight) {
/* When not able to replenish enough descriptors pipe wait
* until minimum number descripotrs to replish.
*/
if (cnt < weight && ep->sys->len > IPA_DEFAULT_SYS_YELLOW_WM) {
napi_complete(ep->sys->napi_obj);
ret = ipa3_rx_switch_to_intr_mode(ep->sys);
if (ret == -GSI_STATUS_PENDING_IRQ &&
napi_reschedule(ep->sys->napi_obj))
goto start_poll;
ipa_pm_deferred_deactivate(ep->sys->pm_hdl);
} else {
cnt = weight;
IPADBG("Client = %d not replenished free descripotrs\n",
ep->client);
}
return cnt;
}