From 2faa46fbfb00d927a555b5e2db5b12e7d8f3eced Mon Sep 17 00:00:00 2001 From: Chaithanya Garrepalli Date: Mon, 9 Apr 2018 12:34:20 +0530 Subject: [PATCH] qcacmn: avoid vdev stats aggregate for every ppdu stats event Avoid vdev aggregate stats for every ppdu stats event as it is consuming high CPU in veriwave max clients testcase. Instead aggregate the stats when ifconfig athX command is issued. Add CDP API to aggregate and update stats called when needed Change-Id: I801d5f8fab0c275942b77a9975293f95bd4026b0 CRs-Fixed: 2220704 --- dp/inc/cdp_txrx_cmn.h | 11 ++++---- dp/inc/cdp_txrx_ops.h | 4 +-- dp/wifi3.0/dp_htt.c | 1 - dp/wifi3.0/dp_main.c | 48 +++++++++++++++++++++++++++++++++-- dp/wifi3.0/dp_rx_mon_status.c | 1 - 5 files changed, 54 insertions(+), 11 deletions(-) diff --git a/dp/inc/cdp_txrx_cmn.h b/dp/inc/cdp_txrx_cmn.h index cb93d3b59338..a0a1ce13f658 100644 --- a/dp/inc/cdp_txrx_cmn.h +++ b/dp/inc/cdp_txrx_cmn.h @@ -1498,17 +1498,18 @@ void cdp_vdev_tx_unlock(ol_txrx_soc_handle soc, /** * cdp_ath_getstats() - get updated athstats * @soc: opaque soc handle - * @pdev: data path pdev handle - * @net_device_stats: interface stats - * @rtnl_link_stats64: device statistics structure + * @dev: dp interface handle + * @stats: cdp network device stats structure + * @type: device type pdev/vdev * * Return: void */ static inline void cdp_ath_getstats(ol_txrx_soc_handle soc, - struct cdp_pdev *pdev, struct cdp_dev_stats *stats) + void *dev, struct cdp_dev_stats *stats, + uint8_t type) { if (soc && soc->ops && soc->ops->cmn_drv_ops->txrx_ath_getstats) - soc->ops->cmn_drv_ops->txrx_ath_getstats(pdev, stats); + soc->ops->cmn_drv_ops->txrx_ath_getstats(dev, stats, type); } /** diff --git a/dp/inc/cdp_txrx_ops.h b/dp/inc/cdp_txrx_ops.h index 3af9d3c3c075..f65030643387 100644 --- a/dp/inc/cdp_txrx_ops.h +++ b/dp/inc/cdp_txrx_ops.h @@ -138,8 +138,8 @@ struct cdp_cmn_ops { void (*txrx_vdev_tx_unlock)(struct cdp_vdev *vdev); - void (*txrx_ath_getstats)(struct cdp_pdev *pdev, - struct cdp_dev_stats *stats); + void (*txrx_ath_getstats)(void *pdev, + struct cdp_dev_stats *stats, uint8_t type); void (*txrx_set_gid_flag)(struct cdp_pdev *pdev, u_int8_t *mem_status, u_int8_t *user_position); diff --git a/dp/wifi3.0/dp_htt.c b/dp/wifi3.0/dp_htt.c index c0894e39cfe0..aaec3f94537f 100644 --- a/dp/wifi3.0/dp_htt.c +++ b/dp/wifi3.0/dp_htt.c @@ -154,7 +154,6 @@ static void dp_tx_stats_update(struct dp_soc *soc, struct dp_peer *peer, &peer->stats, ppdu->peer_id, UPDATE_PEER_STATS); - dp_aggregate_vdev_stats(peer->vdev); } } #endif diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index ee31b16d78f6..ba2b3af73f4d 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -4936,6 +4936,22 @@ static inline void dp_aggregate_pdev_stats(struct dp_pdev *pdev) } +/** + * dp_vdev_getstats() - get vdev packet level stats + * @vdev_handle: Datapath VDEV handle + * @stats: cdp network device stats structure + * + * Return: void + */ +static void dp_vdev_getstats(void *vdev_handle, + struct cdp_dev_stats *stats) +{ + struct dp_vdev *vdev = (struct dp_vdev *)vdev_handle; + + dp_aggregate_vdev_stats(vdev); +} + + /** * dp_pdev_getstats() - get pdev packet level stats * @pdev_handle: Datapath PDEV handle @@ -4943,7 +4959,7 @@ static inline void dp_aggregate_pdev_stats(struct dp_pdev *pdev) * * Return: void */ -static void dp_pdev_getstats(struct cdp_pdev *pdev_handle, +static void dp_pdev_getstats(void *pdev_handle, struct cdp_dev_stats *stats) { struct dp_pdev *pdev = (struct dp_pdev *)pdev_handle; @@ -4965,6 +4981,34 @@ static void dp_pdev_getstats(struct cdp_pdev *pdev_handle, pdev->stats.rx.bcast.bytes; } +/** + * dp_get_device_stats() - get interface level packet stats + * @handle: device handle + * @stats: cdp network device stats structure + * @type: device type pdev/vdev + * + * Return: void + */ +static void dp_get_device_stats(void *handle, + struct cdp_dev_stats *stats, uint8_t type) +{ + switch (type) { + case UPDATE_VDEV_STATS: + dp_vdev_getstats(handle, stats); + break; + case UPDATE_PDEV_STATS: + dp_pdev_getstats(handle, stats); + break; + default: + QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, + "apstats cannot be updated for this input " + "type %d\n", type); + break; + } + +} + + /** * dp_print_pdev_tx_stats(): Print Pdev level TX stats * @pdev: DP_PDEV Handle @@ -6869,7 +6913,7 @@ static struct cdp_cmn_ops dp_ops_cmn = { .txrx_get_vdev_mac_addr = dp_get_vdev_mac_addr_wifi3, .txrx_get_vdev_from_vdev_id = dp_get_vdev_from_vdev_id_wifi3, .txrx_get_ctrl_pdev_from_vdev = dp_get_ctrl_pdev_from_vdev_wifi3, - .txrx_ath_getstats = dp_pdev_getstats, + .txrx_ath_getstats = dp_get_device_stats, .addba_requestprocess = dp_addba_requestprocess_wifi3, .addba_responsesetup = dp_addba_responsesetup_wifi3, .delba_process = dp_delba_process_wifi3, diff --git a/dp/wifi3.0/dp_rx_mon_status.c b/dp/wifi3.0/dp_rx_mon_status.c index f1557ebf5096..20d022bfb8d5 100644 --- a/dp/wifi3.0/dp_rx_mon_status.c +++ b/dp/wifi3.0/dp_rx_mon_status.c @@ -198,7 +198,6 @@ static void dp_rx_stats_update(struct dp_soc *soc, struct dp_peer *peer, &peer->stats, ppdu->peer_id, UPDATE_PEER_STATS); - dp_aggregate_vdev_stats(peer->vdev); } } #endif