msm: ipa: fix to clean up memory

In case of pipe setup failure, make sure to free up the DMA
mappings along with freeing up memory.

In case of tag process, make sure to free up the dummy
memory allocated for ULSO WA.

Change-Id: I70a2ef484c7e2a9ac871dfce95bf63c9f3dc9755
Signed-off-by: Chaitanya Pratapa <quic_cpratapa@quicinc.com>
This commit is contained in:
Chaitanya Pratapa
2021-10-26 12:21:10 -07:00
committed by Gerrit - the friendly Code Review server
parent 64d1ea146e
commit 1c90691b31
4 changed files with 20 additions and 3 deletions

View File

@@ -1560,7 +1560,8 @@ static ssize_t ipa3_read_stats(struct file *file, char __user *ubuf,
"num_buff_above_thresh_for_def_pipe_notified=%u\n" "num_buff_above_thresh_for_def_pipe_notified=%u\n"
"num_buff_below_thresh_for_def_pipe_notified=%u\n" "num_buff_below_thresh_for_def_pipe_notified=%u\n"
"num_buff_above_thresh_for_coal_pipe_notified=%u\n" "num_buff_above_thresh_for_coal_pipe_notified=%u\n"
"num_buff_below_thresh_for_coal_pipe_notified=%u\n", "num_buff_below_thresh_for_coal_pipe_notified=%u\n"
"pipe_setup_fail_cnt=%u\n",
ipa3_ctx->stats.tx_sw_pkts, ipa3_ctx->stats.tx_sw_pkts,
ipa3_ctx->stats.tx_hw_pkts, ipa3_ctx->stats.tx_hw_pkts,
ipa3_ctx->stats.tx_non_linear, ipa3_ctx->stats.tx_non_linear,
@@ -1586,7 +1587,9 @@ static ssize_t ipa3_read_stats(struct file *file, char __user *ubuf,
atomic_read(&ipa3_ctx->stats.num_buff_above_thresh_for_def_pipe_notified), atomic_read(&ipa3_ctx->stats.num_buff_above_thresh_for_def_pipe_notified),
atomic_read(&ipa3_ctx->stats.num_buff_below_thresh_for_def_pipe_notified), atomic_read(&ipa3_ctx->stats.num_buff_below_thresh_for_def_pipe_notified),
atomic_read(&ipa3_ctx->stats.num_buff_above_thresh_for_coal_pipe_notified), atomic_read(&ipa3_ctx->stats.num_buff_above_thresh_for_coal_pipe_notified),
atomic_read(&ipa3_ctx->stats.num_buff_below_thresh_for_coal_pipe_notified)); atomic_read(&ipa3_ctx->stats.num_buff_below_thresh_for_coal_pipe_notified),
ipa3_ctx->stats.pipe_setup_fail_cnt
);
cnt += nbytes; cnt += nbytes;
for (i = 0; i < IPAHAL_PKT_STATUS_EXCEPTION_MAX; i++) { for (i = 0; i < IPAHAL_PKT_STATUS_EXCEPTION_MAX; i++) {

View File

@@ -1589,6 +1589,9 @@ int ipa3_setup_sys_pipe(struct ipa_sys_connect_params *sys_in, u32 *clnt_hdl)
fail_gen3: fail_gen3:
ipa3_disable_data_path(ipa_ep_idx); ipa3_disable_data_path(ipa_ep_idx);
fail_repl: fail_repl:
if (IPA_CLIENT_IS_CONS(ep->client) && !ep->sys->common_buff_pool)
ipa3_cleanup_rx(ep->sys);
ep->sys->repl_hdlr = ipa3_replenish_rx_cache; ep->sys->repl_hdlr = ipa3_replenish_rx_cache;
if (ep->sys->repl && !ep->sys->common_buff_pool) { if (ep->sys->repl && !ep->sys->common_buff_pool) {
kfree(ep->sys->repl); kfree(ep->sys->repl);
@@ -1620,6 +1623,7 @@ fail_wq:
fail_and_disable_clocks: fail_and_disable_clocks:
IPA_ACTIVE_CLIENTS_DEC_EP(sys_in->client); IPA_ACTIVE_CLIENTS_DEC_EP(sys_in->client);
fail_gen: fail_gen:
IPA_STATS_INC_CNT(ipa3_ctx->stats.pipe_setup_fail_cnt);
return result; return result;
} }

View File

@@ -1550,6 +1550,7 @@ struct ipa3_stats {
u32 tx_non_linear; u32 tx_non_linear;
u32 rx_page_drop_cnt; u32 rx_page_drop_cnt;
u64 lower_order; u64 lower_order;
u32 pipe_setup_fail_cnt;
struct ipa3_page_recycle_stats page_recycle_stats[3]; struct ipa3_page_recycle_stats page_recycle_stats[3];
u64 page_recycle_cnt[3][IPA_PAGE_POLL_THRESHOLD_MAX]; u64 page_recycle_cnt[3][IPA_PAGE_POLL_THRESHOLD_MAX];
atomic_t num_buff_above_thresh_for_def_pipe_notified; atomic_t num_buff_above_thresh_for_def_pipe_notified;

View File

@@ -9821,6 +9821,10 @@ retry_alloc:
WARN_ON(1); WARN_ON(1);
if (atomic_dec_return(&comp->cnt) == 0) if (atomic_dec_return(&comp->cnt) == 0)
kfree(comp); kfree(comp);
if (cmd.base) {
dma_free_coherent(ipa3_ctx->pdev, cmd.size,
cmd.base, cmd.phys_base);
}
return -ETIME; return -ETIME;
} }
@@ -9828,6 +9832,11 @@ retry_alloc:
if (atomic_dec_return(&comp->cnt) == 0) if (atomic_dec_return(&comp->cnt) == 0)
kfree(comp); kfree(comp);
if (cmd.base) {
dma_free_coherent(ipa3_ctx->pdev, cmd.size,
cmd.base, cmd.phys_base);
}
/* /*
* sleep for short period to ensure IPA wrote all packets to * sleep for short period to ensure IPA wrote all packets to
* the transport * the transport
@@ -9855,7 +9864,7 @@ fail_free_desc:
tag_desc[i].callback(tag_desc[i].user1, tag_desc[i].callback(tag_desc[i].user1,
tag_desc[i].user2); tag_desc[i].user2);
if (cmd.base) { if (cmd.base) {
dma_free_coherent(ipa3_ctx->uc_pdev, cmd.size, dma_free_coherent(ipa3_ctx->pdev, cmd.size,
cmd.base, cmd.phys_base); cmd.base, cmd.phys_base);
} }
fail_free_tag_desc: fail_free_tag_desc: