qcacmn: msdu time lag update for tx completion

msdu time from hwenqueue to tx completion as part of
msdu stats.

Change-Id: I71ba6f1dec0505e4fa09b5fb123f21912b08b9c5
CRs-Fixed: 2286774
This commit is contained in:
Ruchi, Agrawal
2018-06-20 19:31:03 +05:30
committed by nshrivas
parent 234753cb0f
commit 2cbca3b050
7 changed files with 113 additions and 2 deletions

View File

@@ -136,6 +136,8 @@
#define FILTER_DATA_DATA 0x0001 #define FILTER_DATA_DATA 0x0001
#define FILTER_DATA_NULL 0x0008 #define FILTER_DATA_NULL 0x0008
QDF_DECLARE_EWMA(tx_lag, 1024, 8)
/* /*
* DP configuration parameters * DP configuration parameters
*/ */
@@ -897,7 +899,7 @@ enum cdp_stat_update_type {
*/ */
struct cdp_tx_sojourn_stats { struct cdp_tx_sojourn_stats {
uint32_t ppdu_seq_id; uint32_t ppdu_seq_id;
uint32_t avg_sojourn_msdu[CDP_DATA_TID_MAX]; qdf_ewma_tx_lag avg_sojourn_msdu[CDP_DATA_TID_MAX];
uint32_t sum_sojourn_msdu[CDP_DATA_TID_MAX]; uint32_t sum_sojourn_msdu[CDP_DATA_TID_MAX];
uint32_t num_msdus[CDP_DATA_TID_MAX]; uint32_t num_msdus[CDP_DATA_TID_MAX];
}; };

View File

@@ -3033,6 +3033,12 @@ static struct cdp_pdev *dp_pdev_attach_wifi3(struct cdp_soc_t *txrx_soc,
pdev->tlv_count = 0; pdev->tlv_count = 0;
pdev->list_depth = 0; pdev->list_depth = 0;
qdf_mem_zero(&pdev->sojourn_stats, sizeof(struct cdp_tx_sojourn_stats));
pdev->sojourn_buf = qdf_nbuf_alloc(pdev->soc->osdev,
sizeof(struct cdp_tx_sojourn_stats), 0, 4,
TRUE);
/* initlialize cal client timer */ /* initlialize cal client timer */
dp_cal_client_attach(&pdev->cal_client_ctx, pdev, pdev->soc->osdev, dp_cal_client_attach(&pdev->cal_client_ctx, pdev, pdev->soc->osdev,
&dp_iterate_update_peer_list); &dp_iterate_update_peer_list);
@@ -3204,6 +3210,8 @@ static void dp_pdev_detach_wifi3(struct cdp_pdev *txrx_pdev, int force)
dp_htt_ppdu_stats_detach(pdev); dp_htt_ppdu_stats_detach(pdev);
qdf_nbuf_free(pdev->sojourn_buf);
dp_cal_client_detach(&pdev->cal_client_ctx); dp_cal_client_detach(&pdev->cal_client_ctx);
soc->pdev_list[pdev->pdev_id] = NULL; soc->pdev_list[pdev->pdev_id] = NULL;
soc->pdev_count--; soc->pdev_count--;

View File

@@ -2779,6 +2779,68 @@ static inline void dp_tx_notify_completion(struct dp_soc *soc,
tx_compl_cbk(netbuf, osif_dev); tx_compl_cbk(netbuf, osif_dev);
} }
/** dp_tx_sojourn_stats_process() - Collect sojourn stats
* @pdev: pdev handle
* @tid: tid value
* @txdesc_ts: timestamp from txdesc
* @ppdu_id: ppdu id
*
* Return: none
*/
#ifdef FEATURE_PERPKT_INFO
static inline void dp_tx_sojourn_stats_process(struct dp_pdev *pdev,
uint8_t tid,
uint64_t txdesc_ts,
uint32_t ppdu_id)
{
uint64_t delta_ms;
struct cdp_tx_sojourn_stats *sojourn_stats;
if (pdev->enhanced_stats_en == 0)
return;
if (pdev->sojourn_stats.ppdu_seq_id == 0)
pdev->sojourn_stats.ppdu_seq_id = ppdu_id;
if (ppdu_id != pdev->sojourn_stats.ppdu_seq_id) {
if (!pdev->sojourn_buf)
return;
sojourn_stats = (struct cdp_tx_sojourn_stats *)
qdf_nbuf_data(pdev->sojourn_buf);
qdf_mem_copy(sojourn_stats, &pdev->sojourn_stats,
sizeof(struct cdp_tx_sojourn_stats));
qdf_mem_zero(&pdev->sojourn_stats,
sizeof(struct cdp_tx_sojourn_stats));
dp_wdi_event_handler(WDI_EVENT_TX_SOJOURN_STAT, pdev->soc,
pdev->sojourn_buf, HTT_INVALID_PEER,
WDI_NO_VAL, pdev->pdev_id);
pdev->sojourn_stats.ppdu_seq_id = ppdu_id;
}
if (tid == HTT_INVALID_TID)
return;
delta_ms = qdf_ktime_to_ms(qdf_ktime_get()) -
txdesc_ts;
qdf_ewma_tx_lag_add(&pdev->sojourn_stats.avg_sojourn_msdu[tid],
delta_ms);
pdev->sojourn_stats.sum_sojourn_msdu[tid] += delta_ms;
pdev->sojourn_stats.num_msdus[tid]++;
}
#else
static inline void dp_tx_sojourn_stats_process(struct dp_pdev *pdev,
uint8_t tid,
uint64_t txdesc_ts,
uint32_t ppdu_id)
{
}
#endif
/** /**
* dp_tx_comp_process_tx_status() - Parse and Dump Tx completion status info * dp_tx_comp_process_tx_status() - Parse and Dump Tx completion status info
* @tx_desc: software descriptor head pointer * @tx_desc: software descriptor head pointer
@@ -2859,12 +2921,15 @@ static inline void dp_tx_comp_process_tx_status(struct dp_tx_desc_s *tx_desc,
DP_STATS_INC_PKT(peer, tx.bcast, 1, length); DP_STATS_INC_PKT(peer, tx.bcast, 1, length);
} }
dp_tx_sojourn_stats_process(vdev->pdev, ts.tid,
tx_desc->timestamp,
ts.ppdu_id);
dp_tx_update_peer_stats(peer, &ts, length); dp_tx_update_peer_stats(peer, &ts, length);
out: out:
return; return;
} }
/** /**
* dp_tx_comp_process_desc() - Tx complete software descriptor handler * dp_tx_comp_process_desc() - Tx complete software descriptor handler
* @soc: core txrx main context * @soc: core txrx main context
@@ -2924,9 +2989,11 @@ static void dp_tx_comp_process_desc(struct dp_soc *soc,
DP_HIST_PACKET_COUNT_INC(desc->pdev->pdev_id); DP_HIST_PACKET_COUNT_INC(desc->pdev->pdev_id);
next = desc->next; next = desc->next;
dp_tx_desc_release(desc, desc->pool_id); dp_tx_desc_release(desc, desc->pool_id);
desc = next; desc = next;
} }
DP_TX_HIST_STATS_PER_PDEV(); DP_TX_HIST_STATS_PER_PDEV();
} }

View File

@@ -310,6 +310,8 @@ static inline struct dp_tx_desc_s *dp_tx_desc_alloc(struct dp_soc *soc,
soc->tx_desc[desc_pool_id].num_allocated++; soc->tx_desc[desc_pool_id].num_allocated++;
soc->tx_desc[desc_pool_id].num_free--; soc->tx_desc[desc_pool_id].num_free--;
tx_desc->timestamp = qdf_ktime_to_ms(qdf_ktime_get());
tx_desc->flags = DP_TX_DESC_FLAG_ALLOCATED; tx_desc->flags = DP_TX_DESC_FLAG_ALLOCATED;
TX_DESC_LOCK_UNLOCK(&soc->tx_desc[desc_pool_id].lock); TX_DESC_LOCK_UNLOCK(&soc->tx_desc[desc_pool_id].lock);

View File

@@ -299,6 +299,7 @@ struct dp_tx_desc_s {
void *me_buffer; void *me_buffer;
void *tso_desc; void *tso_desc;
void *tso_num_desc; void *tso_num_desc;
uint64_t timestamp;
}; };
/** /**
@@ -1235,6 +1236,9 @@ struct dp_pdev {
uint8_t is_primary; uint8_t is_primary;
/* Context of cal client timer */ /* Context of cal client timer */
void *cal_client_ctx; void *cal_client_ctx;
struct cdp_tx_sojourn_stats sojourn_stats;
qdf_nbuf_t sojourn_buf;
}; };
struct dp_peer; struct dp_peer;

View File

@@ -108,6 +108,20 @@ typedef __qdf_wait_queue_head_t qdf_wait_queue_head_t;
(_a)[4] == 0xff && \ (_a)[4] == 0xff && \
(_a)[5] == 0xff) (_a)[5] == 0xff)
#define QDF_DECLARE_EWMA(name, factor, weight) \
_QDF_DECLARE_EWMA(name, factor, weight)
#define qdf_ewma_tx_lag _qdf_ewma_tx_lag
#define qdf_ewma_tx_lag_init(tx_lag) \
_qdf_ewma_tx_lag_init(tx_lag)
#define qdf_ewma_tx_lag_add(tx_lag, value) \
_qdf_ewma_tx_lag_add(tx_lag, value)
#define qdf_ewma_tx_lag_read(tx_lag) \
_qdf_ewma_tx_lag_read(tx_lag)
/** /**
* qdf_status_to_os_return - returns the status to OS. * qdf_status_to_os_return - returns the status to OS.
* @status: enum QDF_STATUS * @status: enum QDF_STATUS

View File

@@ -29,6 +29,7 @@
#include <linux/types.h> #include <linux/types.h>
#include <linux/mm.h> #include <linux/mm.h>
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/average.h>
#include <linux/random.h> #include <linux/random.h>
#include <linux/io.h> #include <linux/io.h>
@@ -280,6 +281,10 @@ static inline bool __qdf_is_macaddr_equal(struct qdf_mac_addr *mac_addr1,
#define __qdf_min(_a, _b) min(_a, _b) #define __qdf_min(_a, _b) min(_a, _b)
#define __qdf_max(_a, _b) max(_a, _b) #define __qdf_max(_a, _b) max(_a, _b)
#define _QDF_DECLARE_EWMA(name, _factor, _weight) \
DECLARE_EWMA(name, _factor, _weight)
#define _qdf_ewma_tx_lag struct ewma_tx_lag
#define __qdf_ffz(mask) (~(mask) == 0 ? -1 : ffz(mask)) #define __qdf_ffz(mask) (~(mask) == 0 ? -1 : ffz(mask))
@@ -350,6 +355,15 @@ static inline bool __qdf_is_macaddr_equal(struct qdf_mac_addr *mac_addr1,
#define __qdf_roundup(x, y) roundup(x, y) #define __qdf_roundup(x, y) roundup(x, y)
#define _qdf_ewma_tx_lag_init(tx_lag) \
ewma_tx_lag_init(tx_lag)
#define _qdf_ewma_tx_lag_add(tx_lag, value) \
ewma_tx_lag_add(tx_lag, value)
#define _qdf_ewma_tx_lag_read(tx_lag) \
ewma_tx_lag_read(tx_lag)
#ifdef QCA_CONFIG_SMP #ifdef QCA_CONFIG_SMP
/** /**
* __qdf_get_cpu() - get cpu_index * __qdf_get_cpu() - get cpu_index