summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSravan Kumar Kairam <sgoud@codeaurora.org>2018-05-08 18:33:41 +0530
committernshrivas <nshrivas@codeaurora.org>2018-05-14 22:52:36 -0700
commit44cdc249053b79cd40366fb00f45b7baaee5bf3e (patch)
tree473f8d971fb3b6a62c18a49f64887087170bcd6f
parentafd1e95b2e4deb1becac24a9935aa425dce64924 (diff)
qcacld-3.0: Update SMMU mem table for each rx nbuff
Currently SMMU mem map table allocation size is very high and may lead to allocation failure if system memory is fragmented or in low memory cases. Do not allocate SMMU mem table buffer instead update for each rx nbuff. Change-Id: Ib48199387abc942980cef1ef57a00e44c729e95f CRs-Fixed: 2238629
-rw-r--r--core/dp/htt/htt_rx.c48
1 files changed, 7 insertions, 41 deletions
diff --git a/core/dp/htt/htt_rx.c b/core/dp/htt/htt_rx.c
index eb522855796f..e3410315ddf0 100644
--- a/core/dp/htt/htt_rx.c
+++ b/core/dp/htt/htt_rx.c
@@ -488,19 +488,9 @@ static int htt_rx_ring_fill_n(struct htt_pdev_t *pdev, int num)
struct htt_host_rx_desc_base *rx_desc;
int filled = 0;
int debt_served = 0;
- qdf_mem_info_t *mem_map_table = NULL, *mem_info = NULL;
- int num_alloc = 0;
+ qdf_mem_info_t mem_map_table = {0};
idx = *(pdev->rx_ring.alloc_idx.vaddr);
- if (qdf_mem_smmu_s1_enabled(pdev->osdev) && pdev->is_ipa_uc_enabled) {
- mem_map_table = qdf_mem_map_table_alloc(num);
- if (!mem_map_table) {
- qdf_print("%s: Failed to allocate memory for mem map table\n",
- __func__);
- goto update_alloc_idx;
- }
- mem_info = mem_map_table;
- }
moretofill:
while (num > 0) {
@@ -527,7 +517,7 @@ moretofill:
qdf_timer_start(
&pdev->rx_ring.refill_retry_timer,
HTT_RX_RING_REFILL_RETRY_TIME_MS);
- goto free_mem_map_table;
+ goto update_alloc_idx;
}
/* Clear rx_desc attention word before posting to Rx ring */
@@ -564,8 +554,9 @@ moretofill:
#endif
if (status != QDF_STATUS_SUCCESS) {
qdf_nbuf_free(rx_netbuf);
- goto free_mem_map_table;
+ goto update_alloc_idx;
}
+
paddr = qdf_nbuf_get_frag_paddr(rx_netbuf, 0);
paddr_marked = htt_rx_paddr_mark_high_bits(paddr);
if (pdev->cfg.is_full_reorder_offload) {
@@ -582,7 +573,7 @@ moretofill:
QDF_DMA_FROM_DEVICE);
#endif
qdf_nbuf_free(rx_netbuf);
- goto free_mem_map_table;
+ goto update_alloc_idx;
}
htt_rx_dbg_rxbuf_set(pdev, paddr_marked, rx_netbuf);
} else {
@@ -591,10 +582,9 @@ moretofill:
if (qdf_mem_smmu_s1_enabled(pdev->osdev) &&
pdev->is_ipa_uc_enabled) {
- qdf_update_mem_map_table(pdev->osdev, mem_info,
+ qdf_update_mem_map_table(pdev->osdev, &mem_map_table,
paddr, HTT_RX_BUF_SIZE);
- mem_info++;
- num_alloc++;
+ cds_smmu_map_unmap(true, 1, &mem_map_table);
}
pdev->rx_ring.buf.paddrs_ring[idx] = paddr_marked;
@@ -606,36 +596,12 @@ moretofill:
idx &= pdev->rx_ring.size_mask;
}
- if (qdf_mem_smmu_s1_enabled(pdev->osdev) && pdev->is_ipa_uc_enabled) {
- cds_smmu_map_unmap(true, num_alloc, mem_map_table);
- qdf_mem_free(mem_map_table);
- }
-
- num_alloc = 0;
if (debt_served < qdf_atomic_read(&pdev->rx_ring.refill_debt)) {
num = qdf_atomic_read(&pdev->rx_ring.refill_debt);
debt_served += num;
- if (qdf_mem_smmu_s1_enabled(pdev->osdev) &&
- pdev->is_ipa_uc_enabled) {
- mem_map_table = qdf_mem_map_table_alloc(num);
- if (!mem_map_table) {
- qdf_print("%s: Failed to allocate memory for mem map table\n",
- __func__);
- goto update_alloc_idx;
- }
- mem_info = mem_map_table;
- }
goto moretofill;
}
- goto update_alloc_idx;
-
-free_mem_map_table:
- if (qdf_mem_smmu_s1_enabled(pdev->osdev) && pdev->is_ipa_uc_enabled) {
- cds_smmu_map_unmap(true, num_alloc, mem_map_table);
- qdf_mem_free(mem_map_table);
- }
-
update_alloc_idx:
/*
* Make sure alloc index write is reflected correctly before FW polls