diff --git a/dp/wifi3.0/dp_rx.c b/dp/wifi3.0/dp_rx.c index 9ac5a9cfb7..cc4febdd7b 100644 --- a/dp/wifi3.0/dp_rx.c +++ b/dp/wifi3.0/dp_rx.c @@ -239,7 +239,7 @@ dp_pdev_frag_alloc_and_map(struct dp_soc *dp_soc, QDF_STATUS ret = QDF_STATUS_E_FAILURE; (nbuf_frag_info_t->virt_addr).vaddr = - qdf_frag_alloc(NULL, rx_desc_pool->buf_size); + qdf_frag_alloc(&rx_desc_pool->pf_cache, rx_desc_pool->buf_size); if (!((nbuf_frag_info_t->virt_addr).vaddr)) { dp_err("Frag alloc failed"); @@ -3234,6 +3234,8 @@ void dp_rx_enable_mon_dest_frag(struct rx_desc_pool *rx_desc_pool, rx_desc_pool->rx_mon_dest_frag_enable = is_mon_dest_desc; if (is_mon_dest_desc) dp_alert("Feature DP_RX_MON_MEM_FRAG for mon_dest is enabled"); + else + qdf_frag_cache_drain(&rx_desc_pool->pf_cache); } #else void dp_rx_enable_mon_dest_frag(struct rx_desc_pool *rx_desc_pool, diff --git a/dp/wifi3.0/dp_rx_desc.c b/dp/wifi3.0/dp_rx_desc.c index 0a201b92ae..bbc253ba27 100644 --- a/dp/wifi3.0/dp_rx_desc.c +++ b/dp/wifi3.0/dp_rx_desc.c @@ -267,6 +267,7 @@ void dp_rx_desc_pool_deinit(struct dp_soc *soc, /* Deinitialize rx mon desr frag flag */ rx_desc_pool->rx_mon_dest_frag_enable = false; + qdf_frag_cache_drain(&rx_desc_pool->pf_cache); soc->arch_ops.dp_rx_desc_pool_deinit(soc, rx_desc_pool, pool_id); @@ -463,6 +464,7 @@ void dp_rx_desc_pool_deinit(struct dp_soc *soc, /* Deinitialize rx mon dest frag flag */ rx_desc_pool->rx_mon_dest_frag_enable = false; + qdf_frag_cache_drain(&rx_desc_pool->pf_cache); soc->arch_ops.dp_rx_desc_pool_deinit(soc, rx_desc_pool, pool_id); diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index 399f815d44..b1851c7a69 100644 --- a/dp/wifi3.0/dp_types.h +++ b/dp/wifi3.0/dp_types.h @@ -565,6 +565,7 @@ enum dp_ctxt_type { * @buf_size: Buffer size * @buf_alignment: Buffer alignment * @rx_mon_dest_frag_enable: Enable frag processing for mon dest buffer + * @pf_cache: page frag cache * @desc_type: type of desc this pool serves */ struct rx_desc_pool { @@ -581,6 +582,7 @@ struct rx_desc_pool { uint16_t buf_size; uint8_t buf_alignment; bool rx_mon_dest_frag_enable; + qdf_frag_cache_t pf_cache; enum qdf_dp_desc_type desc_type; }; diff --git a/qdf/linux/src/qdf_nbuf_frag.c b/qdf/linux/src/qdf_nbuf_frag.c index b1ddea93ec..36360ec323 100644 --- a/qdf/linux/src/qdf_nbuf_frag.c +++ b/qdf/linux/src/qdf_nbuf_frag.c @@ -829,6 +829,9 @@ void __qdf_frag_cache_drain(qdf_frag_cache_t *pf_cache) { struct page *page; + if (!pf_cache->va) + return; + page = virt_to_page(pf_cache->va); __page_frag_cache_drain(page, pf_cache->pagecnt_bias); memset(pf_cache, 0, sizeof(*pf_cache));