From 1506af9867ebaf1083d1e8a79cdd8f291e7c53bc Mon Sep 17 00:00:00 2001 From: Bojun Pan Date: Tue, 13 Aug 2019 23:08:08 -0700 Subject: [PATCH] msm: ipa: Fix the double unmap page recycling cleanup on ssr Fix the issue on ssr where some of the pages get unmapped twice by mistake. Change-Id: I9191fde3d908086b6a6755d1217d6776a0e5d23a Signed-off-by: Bojun Pan --- drivers/platform/msm/ipa/ipa_v3/ipa_dp.c | 26 ++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_dp.c b/drivers/platform/msm/ipa/ipa_v3/ipa_dp.c index 23bae5b7282d..04b9b5a73894 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_dp.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_dp.c @@ -2435,12 +2435,19 @@ static void free_rx_page(void *chan_user_data, void *xfer_user_data) { struct ipa3_rx_pkt_wrapper *rx_pkt = (struct ipa3_rx_pkt_wrapper *) xfer_user_data; + struct ipa3_sys_context *sys = rx_pkt->sys; + int i; + for (i = 0; i < sys->repl->capacity; i++) + if (sys->repl->cache[i] == rx_pkt) + break; dma_unmap_page(ipa3_ctx->pdev, rx_pkt->page_data.dma_addr, rx_pkt->len, DMA_FROM_DEVICE); __free_pages(rx_pkt->page_data.page, IPA_WAN_PAGE_ORDER); kmem_cache_free(ipa3_ctx->rx_pkt_wrapper_cache, rx_pkt); + if (i < sys->repl->capacity) + sys->repl->cache[i] = NULL; } /** @@ -2489,14 +2496,17 @@ static void ipa3_cleanup_rx(struct ipa3_sys_context *sys) } else { for (i = 0; i < sys->repl->capacity; i++) { rx_pkt = sys->repl->cache[i]; - dma_unmap_page(ipa3_ctx->pdev, - rx_pkt->page_data.dma_addr, - rx_pkt->len, - DMA_FROM_DEVICE); - __free_pages(rx_pkt->page_data.page, - IPA_WAN_PAGE_ORDER); - kmem_cache_free(ipa3_ctx->rx_pkt_wrapper_cache, - rx_pkt); + if (rx_pkt) { + dma_unmap_page(ipa3_ctx->pdev, + rx_pkt->page_data.dma_addr, + rx_pkt->len, + DMA_FROM_DEVICE); + __free_pages(rx_pkt->page_data.page, + IPA_WAN_PAGE_ORDER); + kmem_cache_free( + ipa3_ctx->rx_pkt_wrapper_cache, + rx_pkt); + } } } kfree(sys->repl->cache);