qcacld-3.0: Add logic to log pause/unpause time
Add logic to calculate pause and unpause time for
network queues to debug data path issues.
Change-Id: I825b10837d999384a91ca3c2271e472a71fd8863
CRs-Fixed: 999861
diff --git a/core/hdd/inc/wlan_hdd_main.h b/core/hdd/inc/wlan_hdd_main.h
index 22757b1..93a2b70 100644
--- a/core/hdd/inc/wlan_hdd_main.h
+++ b/core/hdd/inc/wlan_hdd_main.h
@@ -1035,7 +1035,10 @@
/* BITMAP indicating pause reason */
uint32_t pause_map;
spinlock_t pause_map_lock;
-
+ qdf_time_t start_time;
+ qdf_time_t last_time;
+ qdf_time_t total_pause_time;
+ qdf_time_t total_unpause_time;
uint8_t history_index;
struct hdd_netif_queue_history
queue_oper_history[WLAN_HDD_MAX_HISTORY_ENTRY];
diff --git a/core/hdd/src/wlan_hdd_hostapd.c b/core/hdd/src/wlan_hdd_hostapd.c
index bf0cb5c..bf41335 100644
--- a/core/hdd/src/wlan_hdd_hostapd.c
+++ b/core/hdd/src/wlan_hdd_hostapd.c
@@ -6409,6 +6409,8 @@
SET_NETDEV_DEV(pWlanHostapdDev, pHddCtx->parent_dev);
spin_lock_init(&pHostapdAdapter->pause_map_lock);
+ pHostapdAdapter->start_time =
+ pHostapdAdapter->last_time = qdf_system_ticks();
}
return pHostapdAdapter;
}
diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c
index 58a6e50..2ae8890 100644
--- a/core/hdd/src/wlan_hdd_main.c
+++ b/core/hdd/src/wlan_hdd_main.c
@@ -2060,6 +2060,7 @@
SET_NETDEV_DEV(pWlanDev, hdd_ctx->parent_dev);
hdd_wmm_init(adapter);
spin_lock_init(&adapter->pause_map_lock);
+ adapter->start_time = adapter->last_time = qdf_system_ticks();
}
return adapter;
@@ -4819,24 +4820,40 @@
hdd_adapter_list_node_t *adapter_node = NULL, *next = NULL;
QDF_STATUS status;
int i;
+ qdf_time_t total, pause, unpause, curr_time;
status = hdd_get_front_adapter(hdd_ctx, &adapter_node);
while (NULL != adapter_node && QDF_STATUS_SUCCESS == status) {
adapter = adapter_node->pAdapter;
hddLog(QDF_TRACE_LEVEL_ERROR,
- "Session_id %d device mode %d current index %d",
- adapter->sessionId, adapter->device_mode,
- adapter->history_index);
+ "Session_id %d device mode %d",
+ adapter->sessionId, adapter->device_mode);
hddLog(QDF_TRACE_LEVEL_ERROR,
"Netif queue operation statistics:");
hddLog(QDF_TRACE_LEVEL_ERROR,
"Current pause_map value %x", adapter->pause_map);
+ curr_time = qdf_system_ticks();
+ total = curr_time - adapter->start_time;
+ if (adapter->pause_map) {
+ pause = adapter->total_pause_time +
+ curr_time - adapter->last_time;
+ unpause = adapter->total_unpause_time;
+ } else {
+ unpause = adapter->total_unpause_time +
+ curr_time - adapter->last_time;
+ pause = adapter->total_pause_time;
+ }
hddLog(QDF_TRACE_LEVEL_ERROR,
- " reason_type: pause_cnt: unpause_cnt");
+ "Total: %ums Pause: %ums Unpause: %ums",
+ qdf_system_ticks_to_msecs(total),
+ qdf_system_ticks_to_msecs(pause),
+ qdf_system_ticks_to_msecs(unpause));
+ hddLog(QDF_TRACE_LEVEL_ERROR,
+ "reason_type: pause_cnt: unpause_cnt");
- for (i = 0; i < WLAN_REASON_TYPE_MAX; i++) {
+ for (i = 1; i < WLAN_REASON_TYPE_MAX; i++) {
hddLog(QDF_TRACE_LEVEL_ERROR,
"%s: %d: %d",
hdd_reason_type_to_string(i),
@@ -4845,7 +4862,8 @@
}
hddLog(QDF_TRACE_LEVEL_ERROR,
- "Netif queue operation history:");
+ "Netif queue operation history: current index %d",
+ adapter->history_index);
hddLog(QDF_TRACE_LEVEL_ERROR,
"index: time: action_type: reason_type: pause_map");
@@ -4888,7 +4906,10 @@
sizeof(adapter->queue_oper_stats));
qdf_mem_zero(adapter->queue_oper_history,
sizeof(adapter->queue_oper_history));
-
+ adapter->history_index = 0;
+ adapter->start_time = adapter->last_time = qdf_system_ticks();
+ adapter->total_pause_time = 0;
+ adapter->total_unpause_time = 0;
status = hdd_get_next_adapter(hdd_ctx, adapter_node, &next);
adapter_node = next;
}
diff --git a/core/hdd/src/wlan_hdd_tx_rx.c b/core/hdd/src/wlan_hdd_tx_rx.c
index 2e39047..ab40b1f 100644
--- a/core/hdd/src/wlan_hdd_tx_rx.c
+++ b/core/hdd/src/wlan_hdd_tx_rx.c
@@ -983,7 +983,7 @@
CASE_RETURN_STRING(WLAN_PEER_UNAUTHORISED);
CASE_RETURN_STRING(WLAN_THERMAL_MITIGATION);
default:
- return "Unknown";
+ return "Invalid";
}
}
@@ -1010,7 +1010,7 @@
CASE_RETURN_STRING(WLAN_NETIF_CARRIER_ON);
CASE_RETURN_STRING(WLAN_NETIF_CARRIER_OFF);
default:
- return "Unknown";
+ return "Invalid";
}
}
@@ -1064,6 +1064,34 @@
}
/**
+ * wlan_hdd_update_unpause_time() - update unpause time
+ * @adapter: adapter handle
+ *
+ * Return: none
+ */
+static void wlan_hdd_update_unpause_time(hdd_adapter_t *adapter)
+{
+ qdf_time_t curr_time = qdf_system_ticks();
+
+ adapter->total_unpause_time += curr_time - adapter->last_time;
+ adapter->last_time = curr_time;
+}
+
+/**
+ * wlan_hdd_update_pause_time() - update pause time
+ * @adapter: adapter handle
+ *
+ * Return: none
+ */
+static void wlan_hdd_update_pause_time(hdd_adapter_t *adapter)
+{
+ qdf_time_t curr_time = qdf_system_ticks();
+
+ adapter->total_pause_time += curr_time - adapter->last_time;
+ adapter->last_time = curr_time;
+}
+
+/**
* wlan_hdd_netif_queue_control() - Use for netif_queue related actions
* @adapter: adapter handle
* @action: action type
@@ -1100,6 +1128,7 @@
if (!adapter->pause_map) {
netif_tx_stop_all_queues(adapter->dev);
wlan_hdd_update_txq_timestamp(adapter->dev);
+ wlan_hdd_update_unpause_time(adapter);
}
adapter->pause_map |= (1 << reason);
spin_unlock_bh(&adapter->pause_map_lock);
@@ -1108,16 +1137,20 @@
case WLAN_START_ALL_NETIF_QUEUE:
spin_lock_bh(&adapter->pause_map_lock);
adapter->pause_map &= ~(1 << reason);
- if (!adapter->pause_map)
+ if (!adapter->pause_map) {
netif_tx_start_all_queues(adapter->dev);
+ wlan_hdd_update_pause_time(adapter);
+ }
spin_unlock_bh(&adapter->pause_map_lock);
break;
case WLAN_WAKE_ALL_NETIF_QUEUE:
spin_lock_bh(&adapter->pause_map_lock);
adapter->pause_map &= ~(1 << reason);
- if (!adapter->pause_map)
+ if (!adapter->pause_map) {
netif_tx_wake_all_queues(adapter->dev);
+ wlan_hdd_update_pause_time(adapter);
+ }
spin_unlock_bh(&adapter->pause_map_lock);
break;
@@ -1126,6 +1159,7 @@
if (!adapter->pause_map) {
netif_tx_stop_all_queues(adapter->dev);
wlan_hdd_update_txq_timestamp(adapter->dev);
+ wlan_hdd_update_unpause_time(adapter);
}
adapter->pause_map |= (1 << reason);
netif_carrier_off(adapter->dev);
@@ -1136,8 +1170,10 @@
spin_lock_bh(&adapter->pause_map_lock);
netif_carrier_on(adapter->dev);
adapter->pause_map &= ~(1 << reason);
- if (!adapter->pause_map)
+ if (!adapter->pause_map) {
netif_tx_start_all_queues(adapter->dev);
+ wlan_hdd_update_pause_time(adapter);
+ }
spin_unlock_bh(&adapter->pause_map_lock);
break;
@@ -1146,6 +1182,7 @@
if (!adapter->pause_map) {
netif_tx_disable(adapter->dev);
wlan_hdd_update_txq_timestamp(adapter->dev);
+ wlan_hdd_update_unpause_time(adapter);
}
adapter->pause_map |= (1 << reason);
spin_unlock_bh(&adapter->pause_map_lock);
@@ -1156,6 +1193,7 @@
if (!adapter->pause_map) {
netif_tx_disable(adapter->dev);
wlan_hdd_update_txq_timestamp(adapter->dev);
+ wlan_hdd_update_unpause_time(adapter);
}
adapter->pause_map |= (1 << reason);
netif_carrier_off(adapter->dev);