qcacmn: Reorganise DP init-deinit path to reuse memory

Avoid memory fragmentation that happens during
attach-detach flow.
- Reuse transmit allocated static pool memory across soc up/down.
 These memories are allocated during soc attach.
- Reuse DP source ring memory, DP soc context, DP pdev context
  across soc up/down.
- Reorganise structure members of DP soc and DP pdev so that
  we can zero out structure members across soc up/down
- Add cdp soc init/deinit and cdp pdev init/deinit that
  will be active across soc up/down

Change-Id: I5732453f617bdc16995fda916b645c41845c3ecb
This commit is contained in:
Anish Nataraj
2018-11-24 22:24:56 +05:30
committed by nshrivas
parent 5eb6276a46
commit e9d4c3bf33
12 changed files with 1096 additions and 302 deletions

View File

@@ -101,9 +101,11 @@ QDF_STATUS dp_tx_desc_pool_alloc(struct dp_soc *soc, uint8_t pool_id,
desc_size = DP_TX_DESC_SIZE(sizeof(*tx_desc_elem));
tx_desc_pool->elem_size = desc_size;
qdf_mem_multi_pages_alloc(soc->osdev,
&tx_desc_pool->desc_pages, desc_size, num_elem,
0, true);
if (!soc->dp_soc_reinit)
qdf_mem_multi_pages_alloc(soc->osdev,
&tx_desc_pool->desc_pages,
desc_size, num_elem,
0, true);
if (!tx_desc_pool->desc_pages.num_pages) {
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
"Multi page alloc fail, tx desc");
@@ -117,7 +119,8 @@ QDF_STATUS dp_tx_desc_pool_alloc(struct dp_soc *soc, uint8_t pool_id,
tx_desc_pool->freelist = (struct dp_tx_desc_s *)
*tx_desc_pool->desc_pages.cacheable_pages;
if (qdf_mem_multi_page_link(soc->osdev,
&tx_desc_pool->desc_pages, desc_size, num_elem, true)) {
&tx_desc_pool->desc_pages,
desc_size, num_elem, true)) {
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
"invalid tx desc allocation - overflow num link");
goto free_tx_desc;
@@ -187,19 +190,23 @@ QDF_STATUS dp_tx_ext_desc_pool_alloc(struct dp_soc *soc, uint8_t pool_id,
struct qdf_mem_dma_page_t *page_info;
struct qdf_mem_multi_page_t *pages;
QDF_STATUS status;
qdf_dma_context_t memctx = 0;
/* Coherent tx extension descriptor alloc */
soc->tx_ext_desc[pool_id].elem_size = HAL_TX_EXT_DESC_WITH_META_DATA;
soc->tx_ext_desc[pool_id].elem_count = num_elem;
qdf_mem_multi_pages_alloc(soc->osdev,
&soc->tx_ext_desc[pool_id].desc_pages,
soc->tx_ext_desc[pool_id].elem_size,
soc->tx_ext_desc[pool_id].elem_count,
qdf_get_dma_mem_context((&soc->tx_ext_desc[pool_id]), memctx),
false);
memctx = qdf_get_dma_mem_context((&soc->tx_ext_desc[pool_id]), memctx);
if (!soc->dp_soc_reinit) {
qdf_mem_multi_pages_alloc(soc->osdev,
&soc->tx_ext_desc[pool_id].
desc_pages,
soc->tx_ext_desc[pool_id].elem_size,
soc->tx_ext_desc[pool_id].elem_count,
memctx, false);
}
if (!soc->tx_ext_desc[pool_id].desc_pages.num_pages) {
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
"ext desc page alloc fail");
"ext desc page alloc fail");
status = QDF_STATUS_E_NOMEM;
goto fail_exit;
}
@@ -213,14 +220,19 @@ QDF_STATUS dp_tx_ext_desc_pool_alloc(struct dp_soc *soc, uint8_t pool_id,
*/
soc->tx_ext_desc[pool_id].link_elem_size =
sizeof(struct dp_tx_ext_desc_elem_s);
qdf_mem_multi_pages_alloc(soc->osdev,
&soc->tx_ext_desc[pool_id].desc_link_pages,
soc->tx_ext_desc[pool_id].link_elem_size,
soc->tx_ext_desc[pool_id].elem_count, 0,
true);
if (!soc->dp_soc_reinit) {
qdf_mem_multi_pages_alloc(soc->osdev,
&soc->tx_ext_desc[pool_id].
desc_link_pages,
soc->tx_ext_desc[pool_id].
link_elem_size,
soc->tx_ext_desc[pool_id].
elem_count,
0, true);
}
if (!soc->tx_ext_desc[pool_id].desc_link_pages.num_pages) {
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
"ext link desc page alloc fail");
"ext link desc page alloc fail");
status = QDF_STATUS_E_NOMEM;
goto free_ext_desc_page;
}
@@ -233,7 +245,7 @@ QDF_STATUS dp_tx_ext_desc_pool_alloc(struct dp_soc *soc, uint8_t pool_id,
soc->tx_ext_desc[pool_id].link_elem_size,
soc->tx_ext_desc[pool_id].elem_count, true)) {
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
"ext link desc page linking fail");
"ext link desc page linking fail");
status = QDF_STATUS_E_FAULT;
goto free_ext_link_desc_page;
}
@@ -329,15 +341,16 @@ QDF_STATUS dp_tx_tso_desc_pool_alloc(struct dp_soc *soc, uint8_t pool_id,
tso_desc_pool = &soc->tx_tso_desc[pool_id];
tso_desc_pool->num_free = 0;
desc_size = DP_TX_DESC_SIZE(sizeof(struct qdf_tso_seg_elem_t));
qdf_mem_multi_pages_alloc(soc->osdev,
&tso_desc_pool->desc_pages,
desc_size,
num_elem, 0, true);
if (!soc->dp_soc_reinit)
qdf_mem_multi_pages_alloc(soc->osdev,
&tso_desc_pool->desc_pages,
desc_size,
num_elem, 0, true);
if (!tso_desc_pool->desc_pages.num_pages) {
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
FL("Alloc Failed %pK pool_id %d"),
soc, pool_id);
FL("Alloc Failed %pK pool_id %d"),
soc, pool_id);
return QDF_STATUS_E_NOMEM;
}
@@ -406,14 +419,15 @@ QDF_STATUS dp_tx_tso_num_seg_pool_alloc(struct dp_soc *soc, uint8_t pool_id,
tso_num_seg_pool = &soc->tx_tso_num_seg[pool_id];
tso_num_seg_pool->num_free = 0;
desc_size = DP_TX_DESC_SIZE(sizeof(struct qdf_tso_num_seg_elem_t));
qdf_mem_multi_pages_alloc(soc->osdev,
&tso_num_seg_pool->desc_pages,
desc_size,
num_elem, 0, true);
if (!soc->dp_soc_reinit)
qdf_mem_multi_pages_alloc(soc->osdev,
&tso_num_seg_pool->desc_pages,
desc_size,
num_elem, 0, true);
if (!tso_num_seg_pool->desc_pages.num_pages) {
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
FL("Alloc Failed %pK pool_id %d"),
soc, pool_id);
FL("Alloc Failed %pK pool_id %d"),
soc, pool_id);
return QDF_STATUS_E_NOMEM;
}