qcacmn: Fix memory leak in rx tid setup
Take care to handle failure case resource leakage in TID setup. Change-Id: I83fbe2c5edcf0c7554d8e64eba8987fbc15502c2
This commit is contained in:
@@ -1674,6 +1674,7 @@ int dp_rx_tid_setup_wifi3(struct dp_peer *peer, int tid,
|
|||||||
int hal_pn_type;
|
int hal_pn_type;
|
||||||
void *hw_qdesc_vaddr;
|
void *hw_qdesc_vaddr;
|
||||||
uint32_t alloc_tries = 0;
|
uint32_t alloc_tries = 0;
|
||||||
|
int err = QDF_STATUS_SUCCESS;
|
||||||
|
|
||||||
if (peer->delete_in_progress ||
|
if (peer->delete_in_progress ||
|
||||||
!qdf_atomic_read(&peer->is_default_route_set))
|
!qdf_atomic_read(&peer->is_default_route_set))
|
||||||
@@ -1788,24 +1789,45 @@ try_desc_alloc:
|
|||||||
|
|
||||||
if (dp_reo_desc_addr_chk(rx_tid->hw_qdesc_paddr) !=
|
if (dp_reo_desc_addr_chk(rx_tid->hw_qdesc_paddr) !=
|
||||||
QDF_STATUS_SUCCESS) {
|
QDF_STATUS_SUCCESS) {
|
||||||
if (alloc_tries++ < 10)
|
if (alloc_tries++ < 10) {
|
||||||
|
qdf_mem_free(rx_tid->hw_qdesc_vaddr_unaligned);
|
||||||
|
rx_tid->hw_qdesc_vaddr_unaligned = NULL;
|
||||||
goto try_desc_alloc;
|
goto try_desc_alloc;
|
||||||
else {
|
} else {
|
||||||
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
|
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
|
||||||
"%s: Rx tid HW desc alloc failed (lowmem): tid %d",
|
"%s: Rx tid HW desc alloc failed (lowmem): tid %d",
|
||||||
__func__, tid);
|
__func__, tid);
|
||||||
return QDF_STATUS_E_NOMEM;
|
err = QDF_STATUS_E_NOMEM;
|
||||||
|
goto error;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (soc->cdp_soc.ol_ops->peer_rx_reorder_queue_setup) {
|
if (soc->cdp_soc.ol_ops->peer_rx_reorder_queue_setup) {
|
||||||
soc->cdp_soc.ol_ops->peer_rx_reorder_queue_setup(
|
if (soc->cdp_soc.ol_ops->peer_rx_reorder_queue_setup(
|
||||||
vdev->pdev->ctrl_pdev,
|
vdev->pdev->ctrl_pdev, peer->vdev->vdev_id,
|
||||||
peer->vdev->vdev_id, peer->mac_addr.raw,
|
peer->mac_addr.raw, rx_tid->hw_qdesc_paddr, tid, tid,
|
||||||
rx_tid->hw_qdesc_paddr, tid, tid, 1, ba_window_size);
|
1, ba_window_size)) {
|
||||||
|
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
|
||||||
|
"%s: Failed to send reo queue setup to FW - tid %d\n",
|
||||||
|
__func__, tid);
|
||||||
|
err = QDF_STATUS_E_FAILURE;
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
error:
|
||||||
|
if (NULL != rx_tid->hw_qdesc_vaddr_unaligned) {
|
||||||
|
if (dp_reo_desc_addr_chk(rx_tid->hw_qdesc_paddr) ==
|
||||||
|
QDF_STATUS_SUCCESS)
|
||||||
|
qdf_mem_unmap_nbytes_single(
|
||||||
|
soc->osdev,
|
||||||
|
rx_tid->hw_qdesc_paddr,
|
||||||
|
QDF_DMA_BIDIRECTIONAL,
|
||||||
|
rx_tid->hw_qdesc_alloc_size);
|
||||||
|
qdf_mem_free(rx_tid->hw_qdesc_vaddr_unaligned);
|
||||||
|
rx_tid->hw_qdesc_vaddr_unaligned = NULL;
|
||||||
|
}
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Reference in New Issue
Block a user