summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNirav Shah <nnshah@codeaurora.org>2016-04-25 10:24:24 +0530
committerGerrit - the friendly Code Review server <code-review@localhost>2016-05-18 16:33:38 -0700
commit617cff9d7fcc22a7b569fa2cdb39c8cd9f161ed4 (patch)
tree8d36538a4228016483a537dadceeb3b99bf2096b
parent6a4eee661c99774f8d0bbc629e59fb987feebe6c (diff)
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
-rw-r--r--core/hdd/inc/wlan_hdd_main.h5
-rw-r--r--core/hdd/src/wlan_hdd_hostapd.c2
-rw-r--r--core/hdd/src/wlan_hdd_main.c35
-rw-r--r--core/hdd/src/wlan_hdd_tx_rx.c48
4 files changed, 77 insertions, 13 deletions
diff --git a/core/hdd/inc/wlan_hdd_main.h b/core/hdd/inc/wlan_hdd_main.h
index 22757b183450..93a2b707d98f 100644
--- a/core/hdd/inc/wlan_hdd_main.h
+++ b/core/hdd/inc/wlan_hdd_main.h
@@ -1035,7 +1035,10 @@ struct hdd_adapter_s {
/* 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 bf0cb5c310ba..bf4133562d48 100644
--- a/core/hdd/src/wlan_hdd_hostapd.c
+++ b/core/hdd/src/wlan_hdd_hostapd.c
@@ -6409,6 +6409,8 @@ hdd_adapter_t *hdd_wlan_create_ap_dev(hdd_context_t *pHddCtx,
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 58a6e5082367..2ae8890f975a 100644
--- a/core/hdd/src/wlan_hdd_main.c
+++ b/core/hdd/src/wlan_hdd_main.c
@@ -2060,6 +2060,7 @@ static hdd_adapter_t *hdd_alloc_station_adapter(hdd_context_t *hdd_ctx,
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 @@ void wlan_hdd_display_netif_queue_history(hdd_context_t *hdd_ctx)
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 @@ void wlan_hdd_display_netif_queue_history(hdd_context_t *hdd_ctx)
}
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 @@ void wlan_hdd_clear_netif_queue_history(hdd_context_t *hdd_ctx)
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 2e390476d5ef..ab40b1f65a1e 100644
--- a/core/hdd/src/wlan_hdd_tx_rx.c
+++ b/core/hdd/src/wlan_hdd_tx_rx.c
@@ -983,7 +983,7 @@ const char *hdd_reason_type_to_string(enum netif_reason_type reason)
CASE_RETURN_STRING(WLAN_PEER_UNAUTHORISED);
CASE_RETURN_STRING(WLAN_THERMAL_MITIGATION);
default:
- return "Unknown";
+ return "Invalid";
}
}
@@ -1010,7 +1010,7 @@ const char *hdd_action_type_to_string(enum netif_action_type action)
CASE_RETURN_STRING(WLAN_NETIF_CARRIER_ON);
CASE_RETURN_STRING(WLAN_NETIF_CARRIER_OFF);
default:
- return "Unknown";
+ return "Invalid";
}
}
@@ -1064,6 +1064,34 @@ void wlan_hdd_update_txq_timestamp(struct net_device *dev)
}
/**
+ * 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 @@ void wlan_hdd_netif_queue_control(hdd_adapter_t *adapter,
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 @@ void wlan_hdd_netif_queue_control(hdd_adapter_t *adapter,
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 @@ void wlan_hdd_netif_queue_control(hdd_adapter_t *adapter,
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 @@ void wlan_hdd_netif_queue_control(hdd_adapter_t *adapter,
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 @@ void wlan_hdd_netif_queue_control(hdd_adapter_t *adapter,
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 @@ void wlan_hdd_netif_queue_control(hdd_adapter_t *adapter,
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);