qcacmn: Trace del reg write, ce tasklet latency, tx, and rx pkts

Use the tracepoints to trace delayed register write, ce
tasklet scheduling latency, tx, and rx packets.

Change-Id: I63a89276177a9d0466dcb0c831eeb8e938a2bf79
CRs-Fixed: 3081870
This commit is contained in:
Yeshwanth Sriram Guntuka
2021-11-26 20:00:42 +05:30
committed by Madan Koyyalamudi
parent 80e882aa2a
commit de814c9b16
9 changed files with 100 additions and 2 deletions

View File

@@ -23,6 +23,7 @@
#include "hal_rx.h" #include "hal_rx.h"
#include "dp_peer.h" #include "dp_peer.h"
#include "dp_internal.h" #include "dp_internal.h"
#include <qdf_tracepoint.h>
#ifdef RXDMA_OPTIMIZATION #ifdef RXDMA_OPTIMIZATION
#ifndef RX_DATA_BUFFER_ALIGNMENT #ifndef RX_DATA_BUFFER_ALIGNMENT
@@ -2078,4 +2079,16 @@ void dp_rx_desc_pool_deinit_generic(struct dp_soc *soc,
struct rx_desc_pool *rx_desc_pool, struct rx_desc_pool *rx_desc_pool,
uint32_t pool_id); uint32_t pool_id);
/**
* dp_rx_pkt_tracepoints_enabled() - Get the state of rx pkt tracepoint
*
* Return: True if any rx pkt tracepoint is enabled else false
*/
static inline
bool dp_rx_pkt_tracepoints_enabled(void)
{
return (qdf_trace_dp_rx_tcp_pkt_enabled() ||
qdf_trace_dp_rx_udp_pkt_enabled() ||
qdf_trace_dp_rx_pkt_enabled());
}
#endif /* _DP_RX_H */ #endif /* _DP_RX_H */

View File

@@ -3859,6 +3859,12 @@ dp_tx_comp_process_desc(struct dp_soc *soc,
dp_send_completion_to_pkt_capture(soc, desc, ts); dp_send_completion_to_pkt_capture(soc, desc, ts);
if (dp_tx_pkt_tracepoints_enabled())
qdf_trace_dp_packet(desc->nbuf, QDF_TX,
desc->msdu_ext_desc ?
desc->msdu_ext_desc->tso_desc : NULL,
desc->timestamp);
if (!(desc->msdu_ext_desc)) { if (!(desc->msdu_ext_desc)) {
dp_tx_enh_unmap(soc, desc); dp_tx_enh_unmap(soc, desc);

View File

@@ -27,6 +27,7 @@
#endif #endif
#include "dp_internal.h" #include "dp_internal.h"
#include "hal_tx.h" #include "hal_tx.h"
#include <qdf_tracepoint.h>
#define DP_INVALID_VDEV_ID 0xFF #define DP_INVALID_VDEV_ID 0xFF
@@ -841,4 +842,16 @@ QDF_STATUS dp_get_uplink_delay(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
uint32_t *val); uint32_t *val);
#endif /* WLAN_FEATURE_TSF_UPLINK_TSF */ #endif /* WLAN_FEATURE_TSF_UPLINK_TSF */
/**
* dp_tx_pkt_tracepoints_enabled() - Get the state of tx pkt tracepoint
*
* Return: True if any tx pkt tracepoint is enabled else false
*/
static inline
bool dp_tx_pkt_tracepoints_enabled(void)
{
return (qdf_trace_dp_tx_comp_tcp_pkt_enabled() ||
qdf_trace_dp_tx_comp_udp_pkt_enabled() ||
qdf_trace_dp_tx_comp_pkt_enabled());
}
#endif #endif

View File

@@ -664,7 +664,8 @@ done:
DP_RX_TID_SAVE(nbuf, tid); DP_RX_TID_SAVE(nbuf, tid);
if (qdf_unlikely(rx_pdev->delay_stats_flag) || if (qdf_unlikely(rx_pdev->delay_stats_flag) ||
qdf_unlikely(wlan_cfg_is_peer_ext_stats_enabled( qdf_unlikely(wlan_cfg_is_peer_ext_stats_enabled(
soc->wlan_cfg_ctx))) soc->wlan_cfg_ctx)) ||
dp_rx_pkt_tracepoints_enabled())
qdf_nbuf_set_timestamp(nbuf); qdf_nbuf_set_timestamp(nbuf);
tid_stats = tid_stats =

View File

@@ -215,7 +215,9 @@ dp_tx_hw_enqueue_li(struct dp_soc *soc, struct dp_vdev *vdev,
hal_tx_desc_set_mesh_en(soc->hal_soc, hal_tx_desc_cached, 1); hal_tx_desc_set_mesh_en(soc->hal_soc, hal_tx_desc_cached, 1);
if (qdf_unlikely(vdev->pdev->delay_stats_flag) || if (qdf_unlikely(vdev->pdev->delay_stats_flag) ||
qdf_unlikely(wlan_cfg_is_peer_ext_stats_enabled(soc->wlan_cfg_ctx))) qdf_unlikely(
wlan_cfg_is_peer_ext_stats_enabled(soc->wlan_cfg_ctx)) ||
dp_tx_pkt_tracepoints_enabled())
tx_desc->timestamp = qdf_ktime_to_ms(qdf_ktime_real_get()); tx_desc->timestamp = qdf_ktime_to_ms(qdf_ktime_real_get());
dp_verbose_debug("length:%d , type = %d, dma_addr %llx, offset %d desc id %u", dp_verbose_debug("length:%d , type = %d, dma_addr %llx, offset %d desc id %u",

View File

@@ -23,6 +23,7 @@
#include "target_type.h" #include "target_type.h"
#include "qdf_module.h" #include "qdf_module.h"
#include "wcss_version.h" #include "wcss_version.h"
#include <qdf_tracepoint.h>
#ifdef QCA_WIFI_QCA8074 #ifdef QCA_WIFI_QCA8074
void hal_qca6290_attach(struct hal_soc *hal); void hal_qca6290_attach(struct hal_soc *hal);
@@ -778,6 +779,11 @@ static void hal_reg_write_work(void *arg)
hal_verbose_debug("read_idx %u srng 0x%x, addr 0x%pK dequeue_val %u sched delay %llu us", hal_verbose_debug("read_idx %u srng 0x%x, addr 0x%pK dequeue_val %u sched delay %llu us",
hal->read_idx, ring_id, addr, write_val, delta_us); hal->read_idx, ring_id, addr, write_val, delta_us);
qdf_trace_dp_del_reg_write(ring_id, q_elem->enqueue_val,
q_elem->dequeue_val,
q_elem->enqueue_time,
q_elem->dequeue_time);
num_processed++; num_processed++;
hal->read_idx = (hal->read_idx + 1) & hal->read_idx = (hal->read_idx + 1) &
(HAL_REG_WRITE_QUEUE_LEN - 1); (HAL_REG_WRITE_QUEUE_LEN - 1);

View File

@@ -1,5 +1,6 @@
/* /*
* Copyright (c) 2013-2021 The Linux Foundation. All rights reserved. * Copyright (c) 2013-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved.
* *
* Permission to use, copy, modify, and/or distribute this software for * Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the * any purpose with or without fee is hereby granted, provided that the
@@ -153,6 +154,10 @@ struct CE_state {
qdf_lro_ctx_t lro_data; qdf_lro_ctx_t lro_data;
void (*service)(struct hif_softc *scn, int CE_id); void (*service)(struct hif_softc *scn, int CE_id);
#ifdef WLAN_TRACEPOINTS
/* CE tasklet sched time in nanoseconds */
unsigned long long ce_tasklet_sched_time;
#endif
}; };
/* Descriptor rings must be aligned to this boundary */ /* Descriptor rings must be aligned to this boundary */

View File

@@ -1,5 +1,6 @@
/* /*
* Copyright (c) 2013-2021 The Linux Foundation. All rights reserved. * Copyright (c) 2013-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved.
* *
* Permission to use, copy, modify, and/or distribute this software for * Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the * any purpose with or without fee is hereby granted, provided that the
@@ -28,6 +29,7 @@
#include "hif_debug.h" #include "hif_debug.h"
#include "hif_napi.h" #include "hif_napi.h"
#include "qdf_module.h" #include "qdf_module.h"
#include <qdf_tracepoint.h>
#ifdef IPA_OFFLOAD #ifdef IPA_OFFLOAD
#ifdef QCA_WIFI_3_0 #ifdef QCA_WIFI_3_0
@@ -1149,6 +1151,28 @@ more_watermarks:
qdf_atomic_set(&CE_state->rx_pending, 0); qdf_atomic_set(&CE_state->rx_pending, 0);
} }
#ifdef WLAN_TRACEPOINTS
/**
* ce_trace_tasklet_sched_latency() - Trace ce tasklet scheduling
* latency
* @ce_state: CE context
*
* Return: None
*/
static inline
void ce_trace_tasklet_sched_latency(struct CE_state *ce_state)
{
qdf_trace_dp_ce_tasklet_sched_latency(ce_state->id,
ce_state->ce_service_start_time -
ce_state->ce_tasklet_sched_time);
}
#else
static inline
void ce_trace_tasklet_sched_latency(struct CE_state *ce_state)
{
}
#endif
/* /*
* Guts of interrupt handler for per-engine interrupts on a particular CE. * Guts of interrupt handler for per-engine interrupts on a particular CE.
* *
@@ -1178,6 +1202,8 @@ int ce_per_engine_service(struct hif_softc *scn, unsigned int CE_id)
hif_get_ce_service_max_yield_time( hif_get_ce_service_max_yield_time(
(struct hif_opaque_softc *)scn); (struct hif_opaque_softc *)scn);
ce_trace_tasklet_sched_latency(CE_state);
qdf_spin_lock(&CE_state->ce_index_lock); qdf_spin_lock(&CE_state->ce_index_lock);
CE_state->service(scn, CE_id); CE_state->service(scn, CE_id);

View File

@@ -1,5 +1,6 @@
/* /*
* Copyright (c) 2015-2021 The Linux Foundation. All rights reserved. * Copyright (c) 2015-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved.
* *
* Permission to use, copy, modify, and/or distribute this software for * Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the * any purpose with or without fee is hereby granted, provided that the
@@ -647,6 +648,29 @@ void hif_clear_ce_stats(struct HIF_CE_state *hif_ce_state)
qdf_mem_zero(&hif_ce_state->stats, sizeof(struct ce_stats)); qdf_mem_zero(&hif_ce_state->stats, sizeof(struct ce_stats));
} }
#ifdef WLAN_TRACEPOINTS
/**
* hif_set_ce_tasklet_sched_time() - Set tasklet schedule time for
* CE with matching ce_id
* @scn: hif context
* @ce_id: CE id
*
* Return: None
*/
static inline
void hif_set_ce_tasklet_sched_time(struct hif_softc *scn, uint8_t ce_id)
{
struct CE_state *ce_state = scn->ce_id_to_state[ce_id];
ce_state->ce_tasklet_sched_time = qdf_time_sched_clock();
}
#else
static inline
void hif_set_ce_tasklet_sched_time(struct hif_softc *scn, uint8_t ce_id)
{
}
#endif
/** /**
* hif_tasklet_schedule() - schedule tasklet * hif_tasklet_schedule() - schedule tasklet
* @hif_ctx: hif context * @hif_ctx: hif context
@@ -664,6 +688,8 @@ static inline bool hif_tasklet_schedule(struct hif_opaque_softc *hif_ctx,
qdf_atomic_dec(&scn->active_tasklet_cnt); qdf_atomic_dec(&scn->active_tasklet_cnt);
return false; return false;
} }
hif_set_ce_tasklet_sched_time(scn, tasklet_entry->ce_id);
/* keep it before tasklet_schedule, this is to happy whunt. /* keep it before tasklet_schedule, this is to happy whunt.
* in whunt, tasklet may run before finished hif_tasklet_schedule. * in whunt, tasklet may run before finished hif_tasklet_schedule.
*/ */