qcacmn: Changes for delay and jitter stats

Delay and jitter stats are placed in struct dp_txrx_peer.
Make changes accordingly for allocation, fetching and clearing
operations of these stats.

Change-Id: Ic9b9e48467741072806000f4d1b3aa8e5c65d508
CRs-Fixed: 3092123
This commit is contained in:
Harsh Kumar Bijlani
2021-12-23 17:25:36 +05:30
committed by Madan Koyyalamudi
parent eee813ad02
commit 27e9e64532
4 changed files with 181 additions and 39 deletions

View File

@@ -6813,11 +6813,13 @@ void dp_peer_hw_txrx_stats_init(struct dp_soc *soc,
static QDF_STATUS dp_txrx_peer_detach(struct dp_soc *soc, struct dp_peer *peer) static QDF_STATUS dp_txrx_peer_detach(struct dp_soc *soc, struct dp_peer *peer)
{ {
struct dp_txrx_peer *txrx_peer; struct dp_txrx_peer *txrx_peer;
struct dp_pdev *pdev;
/* dp_txrx_peer exists for mld peer and legacy peer */ /* dp_txrx_peer exists for mld peer and legacy peer */
if (peer->txrx_peer) { if (peer->txrx_peer) {
txrx_peer = peer->txrx_peer; txrx_peer = peer->txrx_peer;
peer->txrx_peer = NULL; peer->txrx_peer = NULL;
pdev = txrx_peer->vdev->pdev;
dp_peer_defrag_rx_tids_deinit(txrx_peer); dp_peer_defrag_rx_tids_deinit(txrx_peer);
/* /*
@@ -6825,6 +6827,7 @@ static QDF_STATUS dp_txrx_peer_detach(struct dp_soc *soc, struct dp_peer *peer)
*/ */
dp_peer_delay_stats_ctx_dealloc(soc, txrx_peer); dp_peer_delay_stats_ctx_dealloc(soc, txrx_peer);
dp_peer_rx_bufq_resources_deinit(txrx_peer); dp_peer_rx_bufq_resources_deinit(txrx_peer);
dp_peer_jitter_stats_ctx_dealloc(pdev, txrx_peer);
qdf_mem_free(txrx_peer); qdf_mem_free(txrx_peer);
} }
@@ -6835,6 +6838,7 @@ static QDF_STATUS dp_txrx_peer_detach(struct dp_soc *soc, struct dp_peer *peer)
static QDF_STATUS dp_txrx_peer_attach(struct dp_soc *soc, struct dp_peer *peer) static QDF_STATUS dp_txrx_peer_attach(struct dp_soc *soc, struct dp_peer *peer)
{ {
struct dp_txrx_peer *txrx_peer; struct dp_txrx_peer *txrx_peer;
struct dp_pdev *pdev;
txrx_peer = (struct dp_txrx_peer *)qdf_mem_malloc(sizeof(*txrx_peer)); txrx_peer = (struct dp_txrx_peer *)qdf_mem_malloc(sizeof(*txrx_peer));
@@ -6844,6 +6848,7 @@ static QDF_STATUS dp_txrx_peer_attach(struct dp_soc *soc, struct dp_peer *peer)
txrx_peer->peer_id = HTT_INVALID_PEER; txrx_peer->peer_id = HTT_INVALID_PEER;
/* initialize the peer_id */ /* initialize the peer_id */
txrx_peer->vdev = peer->vdev; txrx_peer->vdev = peer->vdev;
pdev = peer->vdev->pdev;
DP_STATS_INIT(txrx_peer); DP_STATS_INIT(txrx_peer);
@@ -6857,7 +6862,16 @@ static QDF_STATUS dp_txrx_peer_attach(struct dp_soc *soc, struct dp_peer *peer)
*/ */
if (dp_peer_delay_stats_ctx_alloc(soc, txrx_peer) != if (dp_peer_delay_stats_ctx_alloc(soc, txrx_peer) !=
QDF_STATUS_SUCCESS) QDF_STATUS_SUCCESS)
dp_warn("peer ext_stats ctx alloc failed"); dp_warn("peer delay_stats ctx alloc failed");
/*
* Alloctate memory for jitter stats. Fall through in
* case of failure as its not an implicit requirement to have
* this object for regular statistics updates.
*/
if (dp_peer_jitter_stats_ctx_alloc(pdev, txrx_peer) !=
QDF_STATUS_SUCCESS)
dp_warn("peer jitter_stats ctx alloc failed");
dp_set_peer_isolation(txrx_peer, false); dp_set_peer_isolation(txrx_peer, false);
@@ -6880,6 +6894,8 @@ void dp_txrx_peer_stats_clr(struct dp_txrx_peer *txrx_peer)
txrx_peer->to_stack.bytes = 0; txrx_peer->to_stack.bytes = 0;
DP_STATS_CLR(txrx_peer); DP_STATS_CLR(txrx_peer);
dp_peer_delay_stats_ctx_clr(txrx_peer);
dp_peer_jitter_stats_ctx_clr(txrx_peer);
} }
/* /*
@@ -8815,23 +8831,6 @@ void dp_print_napi_stats(struct dp_soc *soc)
hif_print_napi_stats(soc->hif_handle); hif_print_napi_stats(soc->hif_handle);
} }
#ifdef QCA_PEER_EXT_STATS
/**
* dp_txrx_host_peer_delay_stats_clr: Reinitialize the txrx peer delay stats
*
*/
static inline void dp_txrx_host_peer_delay_stats_clr(struct dp_peer *peer)
{
if (peer->txrx_peer->delay_stats)
qdf_mem_zero(peer->txrx_peer->delay_stats,
sizeof(struct dp_peer_delay_stats));
}
#else
static inline void dp_txrx_host_peer_delay_stats_clr(struct dp_peer *peer)
{
}
#endif
/** /**
* dp_txrx_host_peer_stats_clr): Reinitialize the txrx peer stats * dp_txrx_host_peer_stats_clr): Reinitialize the txrx peer stats
* @soc: Datapath soc * @soc: Datapath soc

View File

@@ -4716,6 +4716,95 @@ void dp_peer_delay_stats_ctx_dealloc(struct dp_soc *soc,
qdf_mem_free(txrx_peer->delay_stats); qdf_mem_free(txrx_peer->delay_stats);
txrx_peer->delay_stats = NULL; txrx_peer->delay_stats = NULL;
} }
/**
* dp_peer_delay_stats_ctx_clr() - Clear delay stats context of peer
*
* @txrx_peer: dp_txrx_peer handle
*
* Return: void
*/
void dp_peer_delay_stats_ctx_clr(struct dp_txrx_peer *txrx_peer)
{
if (txrx_peer->delay_stats)
qdf_mem_zero(txrx_peer->delay_stats,
sizeof(struct dp_peer_delay_stats));
}
#endif
#ifdef WLAN_PEER_JITTER
/**
* dp_peer_jitter_stats_ctx_alloc() - Allocate jitter stats context for peer
*
* @soc: Datapath pdev handle
* @txrx_peer: dp_txrx_peer handle
*
* Return: QDF_STATUS
*/
QDF_STATUS dp_peer_jitter_stats_ctx_alloc(struct dp_pdev *pdev,
struct dp_txrx_peer *txrx_peer)
{
if (!pdev || !txrx_peer) {
dp_warn("Null pdev or peer");
return QDF_STATUS_E_INVAL;
}
/*
* Allocate memory for jitter stats only when
* operating in offload enabled mode.
*/
if (!wlan_cfg_get_dp_pdev_nss_enabled(pdev->wlan_cfg_ctx))
return QDF_STATUS_SUCCESS;
txrx_peer->jitter_stats =
qdf_mem_malloc(sizeof(struct cdp_peer_tid_stats) * DP_MAX_TIDS);
if (!txrx_peer->jitter_stats) {
dp_warn("Jitter stats obj alloc failed!!");
return QDF_STATUS_E_NOMEM;
}
return QDF_STATUS_SUCCESS;
}
/**
* dp_peer_jitter_stats_ctx_dealloc() - Deallocate jitter stats context
*
* @pdev: Datapath pdev handle
* @txrx_peer: dp_txrx_peer handle
*
* Return: void
*/
void dp_peer_jitter_stats_ctx_dealloc(struct dp_pdev *pdev,
struct dp_txrx_peer *txrx_peer)
{
if (!pdev || !txrx_peer) {
dp_warn("Null pdev or peer");
return;
}
/* Check for offload mode */
if (!wlan_cfg_get_dp_pdev_nss_enabled(pdev->wlan_cfg_ctx))
return;
if (txrx_peer->jitter_stats) {
qdf_mem_free(txrx_peer->jitter_stats);
txrx_peer->jitter_stats = NULL;
}
}
/**
* dp_peer_jitter_stats_ctx_clr() - Clear jitter stats context of peer
*
* @txrx_peer: dp_txrx_peer handle
*
* Return: void
*/
void dp_peer_jitter_stats_ctx_clr(struct dp_txrx_peer *txrx_peer)
{
if (txrx_peer->jitter_stats)
qdf_mem_zero(txrx_peer->jitter_stats,
sizeof(struct cdp_peer_tid_stats) * DP_MAX_TIDS);
}
#endif #endif
QDF_STATUS QDF_STATUS

View File

@@ -890,6 +890,7 @@ QDF_STATUS dp_peer_delay_stats_ctx_alloc(struct dp_soc *soc,
struct dp_txrx_peer *txrx_peer); struct dp_txrx_peer *txrx_peer);
void dp_peer_delay_stats_ctx_dealloc(struct dp_soc *soc, void dp_peer_delay_stats_ctx_dealloc(struct dp_soc *soc,
struct dp_txrx_peer *txrx_peer); struct dp_txrx_peer *txrx_peer);
void dp_peer_delay_stats_ctx_clr(struct dp_txrx_peer *txrx_peer);
#else #else
static inline static inline
QDF_STATUS dp_peer_delay_stats_ctx_alloc(struct dp_soc *soc, QDF_STATUS dp_peer_delay_stats_ctx_alloc(struct dp_soc *soc,
@@ -903,6 +904,39 @@ void dp_peer_delay_stats_ctx_dealloc(struct dp_soc *soc,
struct dp_txrx_peer *txrx_peer) struct dp_txrx_peer *txrx_peer)
{ {
} }
static inline
void dp_peer_delay_stats_ctx_clr(struct dp_txrx_peer *txrx_peer)
{
}
#endif
#ifdef WLAN_PEER_JITTER
QDF_STATUS dp_peer_jitter_stats_ctx_alloc(struct dp_pdev *pdev,
struct dp_txrx_peer *txrx_peer);
void dp_peer_jitter_stats_ctx_dealloc(struct dp_pdev *pdev,
struct dp_txrx_peer *txrx_peer);
void dp_peer_jitter_stats_ctx_clr(struct dp_txrx_peer *txrx_peer);
#else
static inline
QDF_STATUS dp_peer_jitter_stats_ctx_alloc(struct dp_pdev *pdev,
struct dp_txrx_peer *txrx_peer)
{
return QDF_STATUS_SUCCESS;
}
static inline
void dp_peer_jitter_stats_ctx_dealloc(struct dp_pdev *pdev,
struct dp_txrx_peer *txrx_peer)
{
}
static inline
void dp_peer_jitter_stats_ctx_clr(struct dp_txrx_peer *txrx_peer)
{
}
#endif #endif
struct dp_peer *dp_vdev_bss_peer_ref_n_get(struct dp_soc *soc, struct dp_peer *dp_vdev_bss_peer_ref_n_get(struct dp_soc *soc,

View File

@@ -5629,12 +5629,16 @@ static void dp_print_jitter_stats(struct dp_peer *peer, struct dp_pdev *pdev)
{ {
uint8_t tid = 0; uint8_t tid = 0;
if (pdev && !wlan_cfg_get_dp_pdev_nss_enabled(pdev->wlan_cfg_ctx)) if (!pdev || !wlan_cfg_get_dp_pdev_nss_enabled(pdev->wlan_cfg_ctx))
return;
if (!peer->txrx_peer || !peer->txrx_peer->jitter_stats)
return; return;
DP_PRINT_STATS("Per TID Tx HW Enqueue-Comp Jitter Stats:\n"); DP_PRINT_STATS("Per TID Tx HW Enqueue-Comp Jitter Stats:\n");
for (tid = 0; tid < qdf_min(CDP_DATA_TID_MAX, DP_MAX_TIDS); tid++) { for (tid = 0; tid < qdf_min(CDP_DATA_TID_MAX, DP_MAX_TIDS); tid++) {
struct dp_rx_tid *rx_tid = &peer->rx_tid[tid]; struct cdp_peer_tid_stats *rx_tid =
&peer->txrx_peer->jitter_stats[tid];
DP_PRINT_STATS("Node tid = %d\n" DP_PRINT_STATS("Node tid = %d\n"
"Average Jiiter : %u (us)\n" "Average Jiiter : %u (us)\n"
@@ -5642,12 +5646,12 @@ static void dp_print_jitter_stats(struct dp_peer *peer, struct dp_pdev *pdev)
"Total Average error count : %llu\n" "Total Average error count : %llu\n"
"Total Success Count : %llu\n" "Total Success Count : %llu\n"
"Total Drop : %llu\n", "Total Drop : %llu\n",
rx_tid->tid, tid,
rx_tid->stats.tx_avg_jitter, rx_tid->tx_avg_jitter,
rx_tid->stats.tx_avg_delay, rx_tid->tx_avg_delay,
rx_tid->stats.tx_avg_err, rx_tid->tx_avg_err,
rx_tid->stats.tx_total_success, rx_tid->tx_total_success,
rx_tid->stats.tx_drop); rx_tid->tx_drop);
} }
} }
#else #else
@@ -5774,6 +5778,9 @@ void dp_peer_print_tx_delay_stats(struct dp_pdev *pdev,
struct cdp_hist_stats hist_stats; struct cdp_hist_stats hist_stats;
uint8_t tid; uint8_t tid;
if (!peer || !peer->txrx_peer)
return;
if (!pdev || !pdev->soc) if (!pdev || !pdev->soc)
return; return;
@@ -5818,6 +5825,9 @@ void dp_peer_print_rx_delay_stats(struct dp_pdev *pdev,
struct cdp_hist_stats hist_stats; struct cdp_hist_stats hist_stats;
uint8_t tid; uint8_t tid;
if (!peer || !peer->txrx_peer)
return;
if (!pdev || !pdev->soc) if (!pdev || !pdev->soc)
return; return;
@@ -7760,7 +7770,7 @@ dp_txrx_get_peer_delay_stats(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
struct dp_soc *soc = (struct dp_soc *)soc_hdl; struct dp_soc *soc = (struct dp_soc *)soc_hdl;
struct dp_peer *peer = dp_peer_find_hash_find(soc, peer_mac, 0, vdev_id, struct dp_peer *peer = dp_peer_find_hash_find(soc, peer_mac, 0, vdev_id,
DP_MOD_ID_CDP); DP_MOD_ID_CDP);
struct cdp_peer_ext_stats *pext_stats; struct dp_peer_delay_stats *pext_stats;
struct cdp_delay_rx_stats *rx_delay; struct cdp_delay_rx_stats *rx_delay;
struct cdp_delay_tx_stats *tx_delay; struct cdp_delay_tx_stats *tx_delay;
uint8_t tid; uint8_t tid;
@@ -7773,7 +7783,12 @@ dp_txrx_get_peer_delay_stats(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
return QDF_STATUS_E_FAILURE; return QDF_STATUS_E_FAILURE;
} }
pext_stats = peer->pext_stats; if (!peer->txrx_peer) {
dp_peer_unref_delete(peer, DP_MOD_ID_CDP);
return QDF_STATUS_E_FAILURE;
}
pext_stats = peer->txrx_peer->delay_stats;
if (!pext_stats) { if (!pext_stats) {
dp_peer_unref_delete(peer, DP_MOD_ID_CDP); dp_peer_unref_delete(peer, DP_MOD_ID_CDP);
return QDF_STATUS_E_FAILURE; return QDF_STATUS_E_FAILURE;
@@ -7781,14 +7796,14 @@ dp_txrx_get_peer_delay_stats(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) { for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) {
rx_delay = &delay_stats[tid].rx_delay; rx_delay = &delay_stats[tid].rx_delay;
dp_accumulate_delay_tid_stats(soc, pext_stats->delay_stats, dp_accumulate_delay_tid_stats(soc, pext_stats->delay_tid_stats,
&rx_delay->to_stack_delay, tid, &rx_delay->to_stack_delay, tid,
CDP_HIST_TYPE_REAP_STACK); CDP_HIST_TYPE_REAP_STACK);
tx_delay = &delay_stats[tid].tx_delay; tx_delay = &delay_stats[tid].tx_delay;
dp_accumulate_delay_tid_stats(soc, pext_stats->delay_stats, dp_accumulate_delay_tid_stats(soc, pext_stats->delay_tid_stats,
&tx_delay->tx_swq_delay, tid, &tx_delay->tx_swq_delay, tid,
CDP_HIST_TYPE_SW_ENQEUE_DELAY); CDP_HIST_TYPE_SW_ENQEUE_DELAY);
dp_accumulate_delay_tid_stats(soc, pext_stats->delay_stats, dp_accumulate_delay_tid_stats(soc, pext_stats->delay_tid_stats,
&tx_delay->hwtx_delay, tid, &tx_delay->hwtx_delay, tid,
CDP_HIST_TYPE_HW_COMP_DELAY); CDP_HIST_TYPE_HW_COMP_DELAY);
} }
@@ -7827,15 +7842,20 @@ dp_txrx_get_peer_jitter_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
if (!peer) if (!peer)
return QDF_STATUS_E_FAILURE; return QDF_STATUS_E_FAILURE;
for (tid = 0; tid < qdf_min(CDP_DATA_TID_MAX, DP_MAX_TIDS); tid++) { if (!peer->txrx_peer || !peer->txrx_peer->jitter_stats) {
struct dp_rx_tid *rx_tid = &peer->rx_tid[tid]; dp_peer_unref_delete(peer, DP_MOD_ID_CDP);
return QDF_STATUS_E_FAILURE;
}
tid_stats[tid].tx_avg_jitter = rx_tid->stats.tx_avg_jitter; for (tid = 0; tid < qdf_min(CDP_DATA_TID_MAX, DP_MAX_TIDS); tid++) {
tid_stats[tid].tx_avg_delay = rx_tid->stats.tx_avg_delay; struct cdp_peer_tid_stats *rx_tid =
tid_stats[tid].tx_avg_err = rx_tid->stats.tx_avg_err; &peer->txrx_peer->jitter_stats[tid];
tid_stats[tid].tx_total_success =
rx_tid->stats.tx_total_success; tid_stats[tid].tx_avg_jitter = rx_tid->tx_avg_jitter;
tid_stats[tid].tx_drop = rx_tid->stats.tx_drop; tid_stats[tid].tx_avg_delay = rx_tid->tx_avg_delay;
tid_stats[tid].tx_avg_err = rx_tid->tx_avg_err;
tid_stats[tid].tx_total_success = rx_tid->tx_total_success;
tid_stats[tid].tx_drop = rx_tid->tx_drop;
} }
dp_peer_unref_delete(peer, DP_MOD_ID_CDP); dp_peer_unref_delete(peer, DP_MOD_ID_CDP);