diff options
| author | Srinivas Girigowda <sgirigow@codeaurora.org> | 2016-08-10 22:19:14 -0700 |
|---|---|---|
| committer | Anjaneedevi Kapparapu <akappa@codeaurora.org> | 2016-08-23 12:37:16 +0530 |
| commit | 3dbb68b6ee2c5b9f01336a317cc4801e56e104eb (patch) | |
| tree | 89277eb0cb37e574c2ffc03e04dc21d953bb4389 | |
| parent | be9f91314156b6cf1deead40995a0495c12a643a (diff) | |
qcacld-2.0: Optimize packet trace dumping
Do not hold the spinlock for packet trace dumping and
dump the trace only for connection related errors.
Change-Id: Ia33137fc924f8a860cf9ae281b8167fe3832c5b4
CRs-Fixed: 1053314
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_cfg80211.c | 7 | ||||
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_p2p.c | 4 | ||||
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_tx_rx.c | 2 | ||||
| -rw-r--r-- | CORE/MAC/inc/aniGlobal.h | 13 | ||||
| -rw-r--r-- | CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c | 4 | ||||
| -rw-r--r-- | CORE/MAC/src/pe/lim/limUtils.c | 2 | ||||
| -rw-r--r-- | CORE/SERVICES/WMA/wma.c | 2 | ||||
| -rw-r--r-- | CORE/SME/src/csr/csrApiRoam.c | 2 | ||||
| -rw-r--r-- | CORE/SME/src/sme_common/sme_Api.c | 4 | ||||
| -rw-r--r-- | CORE/VOSS/inc/vos_api.h | 2 | ||||
| -rw-r--r-- | CORE/VOSS/src/vos_api.c | 15 | ||||
| -rw-r--r-- | CORE/VOSS/src/vos_packet.c | 126 | ||||
| -rw-r--r-- | CORE/VOSS/src/vos_sched.c | 2 |
13 files changed, 102 insertions, 83 deletions
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c index ce80b3180221..6c69482d0884 100644 --- a/CORE/HDD/src/wlan_hdd_cfg80211.c +++ b/CORE/HDD/src/wlan_hdd_cfg80211.c @@ -9339,7 +9339,7 @@ static int __wlan_hdd_cfg80211_wifi_logger_get_ring_data(struct wiphy *wiphy, ret = vos_flush_logs(WLAN_LOG_TYPE_NON_FATAL, WLAN_LOG_INDICATOR_FRAMEWORK, WLAN_LOG_REASON_CODE_UNUSED, - true); + DUMP_VOS_TRACE | DUMP_PACKET_TRACE); if (VOS_STATUS_SUCCESS != ret) { hddLog(LOGE, FL("Failed to trigger bug report")); return -EINVAL; @@ -17359,9 +17359,10 @@ static eHalStatus hdd_cfg80211_scan_done_callback(tHalHandle halHandle, vos_flush_logs(WLAN_LOG_TYPE_NON_FATAL, WLAN_LOG_INDICATOR_HOST_DRIVER, WLAN_LOG_REASON_NO_SCAN_RESULTS, - true); + DUMP_VOS_TRACE); pHddCtx->last_scan_bug_report_timestamp = current_timestamp; } + pHddCtx->last_scan_bug_report_timestamp = current_timestamp; } } } @@ -22549,7 +22550,7 @@ static int __wlan_hdd_cfg80211_tdls_mgmt(struct wiphy *wiphy, vos_flush_logs(WLAN_LOG_TYPE_FATAL, WLAN_LOG_INDICATOR_HOST_DRIVER, WLAN_LOG_REASON_HDD_TIME_OUT, - true); + DUMP_VOS_TRACE); pAdapter->mgmtTxCompletionStatus = FALSE; wlan_hdd_tdls_check_bmps(pAdapter); return -EINVAL; diff --git a/CORE/HDD/src/wlan_hdd_p2p.c b/CORE/HDD/src/wlan_hdd_p2p.c index 9895497383ba..52e2f03c967a 100644 --- a/CORE/HDD/src/wlan_hdd_p2p.c +++ b/CORE/HDD/src/wlan_hdd_p2p.c @@ -342,7 +342,7 @@ void wlan_hdd_cancel_existing_remain_on_channel(hdd_adapter_t *pAdapter) vos_flush_logs(WLAN_LOG_TYPE_FATAL, WLAN_LOG_INDICATOR_HOST_DRIVER, WLAN_LOG_REASON_HDD_TIME_OUT, - true); + DUMP_VOS_TRACE); } INIT_COMPLETION(pAdapter->cancel_rem_on_chan_var); @@ -1273,7 +1273,7 @@ int __wlan_hdd_cfg80211_cancel_remain_on_channel( struct wiphy *wiphy, vos_flush_logs(WLAN_LOG_TYPE_FATAL, WLAN_LOG_INDICATOR_HOST_DRIVER, WLAN_LOG_REASON_HDD_TIME_OUT, - true); + DUMP_VOS_TRACE); } INIT_COMPLETION(pAdapter->cancel_rem_on_chan_var); /* Issue abort remain on chan request to sme. diff --git a/CORE/HDD/src/wlan_hdd_tx_rx.c b/CORE/HDD/src/wlan_hdd_tx_rx.c index 24574c8b0f57..8998c3de68bc 100644 --- a/CORE/HDD/src/wlan_hdd_tx_rx.c +++ b/CORE/HDD/src/wlan_hdd_tx_rx.c @@ -810,7 +810,7 @@ void wlan_display_tx_timeout_stats(hdd_adapter_t *adapter) vos_flush_logs(WLAN_LOG_TYPE_FATAL, WLAN_LOG_INDICATOR_HOST_DRIVER, WLAN_LOG_REASON_HDD_TIME_OUT, - true); + DUMP_VOS_TRACE); } } diff --git a/CORE/MAC/inc/aniGlobal.h b/CORE/MAC/inc/aniGlobal.h index ebeaa6c62656..20c66aac5408 100644 --- a/CORE/MAC/inc/aniGlobal.h +++ b/CORE/MAC/inc/aniGlobal.h @@ -196,6 +196,19 @@ enum log_event_indicator { }; /** + * enum log_dump_trace_mask - Mask to indicate what traces to log + * @DUMP_NO_TRACE: Do not dump any logs + * @DUMP_VOS_TRACE: Dump vos trace logs + * @DUMP_PACKET_TRACE: Dump packet trace + * + */ +enum log_dump_trace_mask { + DUMP_NO_TRACE = 0x0, + DUMP_VOS_TRACE = 0x1, + DUMP_PACKET_TRACE = 0x2 +}; + +/** * enum log_event_host_reason_code - Reason code for bug report * @WLAN_LOG_REASON_CODE_UNUSED: Unused * @WLAN_LOG_REASON_ROAM_FAIL: Driver initiated roam has failed diff --git a/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c b/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c index 1197d319f1b4..8e9abca3c75a 100644 --- a/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c +++ b/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c @@ -1921,7 +1921,7 @@ __limProcessSmeJoinReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf) vos_flush_logs(WLAN_LOG_TYPE_FATAL, WLAN_LOG_INDICATOR_HOST_DRIVER, WLAN_LOG_REASON_STALE_SESSION_FOUND, - true); + DUMP_VOS_TRACE); retCode = eSIR_SME_REFUSED; goto end; } @@ -2474,7 +2474,7 @@ __limProcessSmeReassocReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf) vos_flush_logs(WLAN_LOG_TYPE_FATAL, WLAN_LOG_INDICATOR_HOST_DRIVER, WLAN_LOG_REASON_STALE_SESSION_FOUND, - true); + DUMP_VOS_TRACE); retCode = eSIR_SME_REFUSED; goto end; } diff --git a/CORE/MAC/src/pe/lim/limUtils.c b/CORE/MAC/src/pe/lim/limUtils.c index f4569d25a3ea..cac705450caa 100644 --- a/CORE/MAC/src/pe/lim/limUtils.c +++ b/CORE/MAC/src/pe/lim/limUtils.c @@ -1036,7 +1036,7 @@ tANI_U8 limWriteDeferredMsgQ(tpAniSirGlobal pMac, tpSirMsgQ limMsg) vos_flush_logs(WLAN_LOG_TYPE_NON_FATAL, WLAN_LOG_INDICATOR_HOST_DRIVER, WLAN_LOG_REASON_QUEUE_FULL, - true); + DUMP_VOS_TRACE); } else { diff --git a/CORE/SERVICES/WMA/wma.c b/CORE/SERVICES/WMA/wma.c index c3edf99220ab..4055836994bc 100644 --- a/CORE/SERVICES/WMA/wma.c +++ b/CORE/SERVICES/WMA/wma.c @@ -34577,7 +34577,7 @@ VOS_STATUS WDA_TxPacket(void *wma_context, void *tx_frame, u_int16_t frmLen, vos_flush_logs(WLAN_LOG_TYPE_FATAL, WLAN_LOG_INDICATOR_HOST_DRIVER, WLAN_LOG_REASON_MGMT_FRAME_TIMEOUT, - true); + DUMP_VOS_TRACE); wmi_crash_inject(wma_handle->wmi_handle, RECOVERY_SIM_ASSERT, 0); } diff --git a/CORE/SME/src/csr/csrApiRoam.c b/CORE/SME/src/csr/csrApiRoam.c index 416028973f57..01043d3bb57a 100644 --- a/CORE/SME/src/csr/csrApiRoam.c +++ b/CORE/SME/src/csr/csrApiRoam.c @@ -8846,7 +8846,7 @@ static void csrRoamRoamingStateReassocRspProcessor( tpAniSirGlobal pMac, tpSirSm vos_flush_logs(WLAN_LOG_TYPE_FATAL, WLAN_LOG_INDICATOR_HOST_DRIVER, WLAN_LOG_REASON_ROAM_FAIL, - true); + DUMP_VOS_TRACE | DUMP_PACKET_TRACE); #if defined(WLAN_FEATURE_VOWIFI_11R) || defined(FEATURE_WLAN_ESE) || \ defined(FEATURE_WLAN_LFR) if ((eSIR_SME_FT_REASSOC_TIMEOUT_FAILURE == pSmeJoinRsp->statusCode) || diff --git a/CORE/SME/src/sme_common/sme_Api.c b/CORE/SME/src/sme_common/sme_Api.c index 775e57ddd4a9..94a0943d824c 100644 --- a/CORE/SME/src/sme_common/sme_Api.c +++ b/CORE/SME/src/sme_common/sme_Api.c @@ -505,7 +505,7 @@ tSmeCmd *smeGetCommandBuffer( tpAniSirGlobal pMac ) vos_flush_logs(WLAN_LOG_TYPE_FATAL, WLAN_LOG_INDICATOR_HOST_DRIVER, WLAN_LOG_REASON_SME_OUT_OF_CMD_BUF, - false); + DUMP_NO_TRACE); } else { /* Trigger SSR */ vos_wlanRestart(); @@ -14071,7 +14071,7 @@ void activeListCmdTimeoutHandle(void *userData) vos_flush_logs(WLAN_LOG_TYPE_FATAL, WLAN_LOG_INDICATOR_HOST_DRIVER, WLAN_LOG_REASON_SME_COMMAND_STUCK, - false); + DUMP_NO_TRACE); } else { vosTraceDumpAll(mac_ctx, 0, 0, 500, 0); } diff --git a/CORE/VOSS/inc/vos_api.h b/CORE/VOSS/inc/vos_api.h index 191b3cee5f48..77e146c4f210 100644 --- a/CORE/VOSS/inc/vos_api.h +++ b/CORE/VOSS/inc/vos_api.h @@ -368,7 +368,7 @@ void vos_deinit_log_completion(void); VOS_STATUS vos_flush_logs(uint32_t is_fatal, uint32_t indicator, uint32_t reason_code, - bool dump_vos_trace); + uint32_t dump_vos_trace); void vos_wlan_flush_host_logs_for_fatal(void); void vos_logging_set_fw_flush_complete(void); void vos_probe_threads(void); diff --git a/CORE/VOSS/src/vos_api.c b/CORE/VOSS/src/vos_api.c index aab204afe7f2..ae5cb31d6688 100644 --- a/CORE/VOSS/src/vos_api.c +++ b/CORE/VOSS/src/vos_api.c @@ -1941,7 +1941,7 @@ VOS_STATUS vos_mq_post_message_by_priority(VOS_MQ_ID msgQueueId, vos_flush_logs(WLAN_LOG_TYPE_FATAL, WLAN_LOG_INDICATOR_HOST_ONLY, WLAN_LOG_REASON_VOS_MSG_UNDER_RUN, - true); + DUMP_VOS_TRACE); } if (VOS_WRAPPER_MAX_FAIL_COUNT == debug_count) { vos_wlanRestart(); @@ -2891,6 +2891,8 @@ void vos_wlan_flush_host_logs_for_fatal(void) * @indicator: Source which trigerred the bug report * @reason_code: Reason for triggering bug report * @dump_vos_trace: If vos trace are needed in logs. + * @pkt_trace: flag to indicate when to report packet trace + * dump this info when connection related error occurs * * This function sets the log related params and send the WMI command to the * FW to flush its logs. On receiving the flush completion event from the FW @@ -2901,7 +2903,7 @@ void vos_wlan_flush_host_logs_for_fatal(void) VOS_STATUS vos_flush_logs(uint32_t is_fatal, uint32_t indicator, uint32_t reason_code, - bool dump_vos_trace) + uint32_t dump_trace) { uint32_t ret; VOS_STATUS status; @@ -2942,14 +2944,15 @@ VOS_STATUS vos_flush_logs(uint32_t is_fatal, } VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, - "%s: Triggering bug report: type:%d, indicator=%d reason_code=%d", - __func__, is_fatal, indicator, reason_code); + "%s: Triggering bug report: type:%d, indicator=%d reason_code=%d dump_trace=0x%x", + __func__, is_fatal, indicator, reason_code, dump_trace); - if (dump_vos_trace) + if (dump_trace | DUMP_VOS_TRACE) vosTraceDumpAll(vos_context->pMACContext, 0, 0, 500, 0); #ifdef QCA_PKT_PROTO_TRACE - vos_pkt_trace_buf_dump(); + if (dump_trace | DUMP_PACKET_TRACE) + vos_pkt_trace_buf_dump(); #endif if (WLAN_LOG_INDICATOR_HOST_ONLY == indicator) { vos_wlan_flush_host_logs_for_fatal(); diff --git a/CORE/VOSS/src/vos_packet.c b/CORE/VOSS/src/vos_packet.c index daeec8f5014c..1795ecbfb8e1 100644 --- a/CORE/VOSS/src/vos_packet.c +++ b/CORE/VOSS/src/vos_packet.c @@ -314,91 +314,93 @@ void vos_pkt_trace_buf_update VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO, "%s %d, %s", __func__, __LINE__, event_string); - spin_lock_bh(&trace_buffer_lock); if (!trace_buffer) { VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO, "trace_buffer is already free"); - spin_unlock_bh(&trace_buffer_lock); return; } + spin_lock_bh(&trace_buffer_lock); slot = trace_buffer_order % VOS_PKT_TRAC_MAX_TRACE_BUF; trace_buffer[slot].order = trace_buffer_order; + trace_buffer_order++; + spin_unlock_bh(&trace_buffer_lock); do_gettimeofday(&tv); trace_buffer[slot].event_sec_time = tv.tv_sec; trace_buffer[slot].event_msec_time = tv.tv_usec; strncpy(trace_buffer[slot].event_string, event_string, (sizeof(trace_buffer[slot].event_string) < strlen(event_string)? sizeof(trace_buffer[slot].event_string) : strlen(event_string))); - trace_buffer_order++; - spin_unlock_bh(&trace_buffer_lock); return; } /** - * vos_pkt_trace_buf_dump - Dump stored information into kernel log + * vos_pkt_trace_buf_dump_1() - Helper function to dump pkt trace + * @slot: index + * + * Return: none */ -void vos_pkt_trace_buf_dump -( - void -) +void vos_pkt_trace_buf_dump_1(int slot) { - v_U32_t slot, idx; - struct rtc_time tm; - unsigned long local_time; - - spin_lock_bh(&trace_buffer_lock); - if (!trace_buffer) { - VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO, - "trace_buffer is already free"); - spin_unlock_bh(&trace_buffer_lock); - return; - } - VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_INFO, - "PACKET TRACE DUMP START Current Timestamp %u", - (unsigned int)vos_timer_get_system_time()); - VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_INFO, - "ORDER : RTC TIME : EVT"); - - if (VOS_PKT_TRAC_MAX_TRACE_BUF > trace_buffer_order) - { - for (slot = 0 ; slot < trace_buffer_order; slot++) - { - local_time = (u32)(trace_buffer[slot].event_sec_time - - (sys_tz.tz_minuteswest * 60)); - rtc_time_to_tm(local_time, &tm); - VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_INFO, - "%5d : [%02d:%02d:%02d.%06lu] : %s", - trace_buffer[slot].order, - tm.tm_hour, tm.tm_min, tm.tm_sec, - trace_buffer[slot].event_sec_time, - trace_buffer[slot].event_string); - } - } - else - { - for (idx = 0 ; idx < VOS_PKT_TRAC_MAX_TRACE_BUF; idx++) - { - slot = (trace_buffer_order + idx) % VOS_PKT_TRAC_MAX_TRACE_BUF; - local_time = (u32)(trace_buffer[slot].event_sec_time - - (sys_tz.tz_minuteswest * 60)); - rtc_time_to_tm(local_time, &tm); - VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_INFO, - "%5d : [%02d:%02d:%02d.%06lu] : %s", - trace_buffer[slot].order, - tm.tm_hour, tm.tm_min, tm.tm_sec, - trace_buffer[slot].event_sec_time, - trace_buffer[slot].event_string); - } - } - - VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_INFO, - "PACKET TRACE DUMP END"); - spin_unlock_bh(&trace_buffer_lock); + struct rtc_time tm; + unsigned long local_time; + + local_time = (u32)(trace_buffer[slot].event_sec_time - + (sys_tz.tz_minuteswest * 60)); + rtc_time_to_tm(local_time, &tm); + VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, + "%5d : [%02d:%02d:%02d.%06lu] : %s", + trace_buffer[slot].order, + tm.tm_hour, tm.tm_min, tm.tm_sec, + trace_buffer[slot].event_sec_time, + trace_buffer[slot].event_string); +} - return; +/** + * vos_pkt_trace_buf_dump - Dump stored information into kernel log + */ +void vos_pkt_trace_buf_dump(void) +{ + uint32_t i, latest_idx = trace_buffer_order; + int slot; + + if (!trace_buffer || !latest_idx) { + VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_INFO, + "trace_buffer is already free trace_buffer_order: %d", + trace_buffer_order); + return; + } + VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, + "PACKET TRACE DUMP START Current Timestamp %u", + (unsigned int)vos_timer_get_system_time()); + VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, + "ORDER : RTC TIME : EVT"); + + if (VOS_PKT_TRAC_MAX_TRACE_BUF > latest_idx) { + /* + * Scenario: Number of trace records less than MAX, + * Circular buffer not overwritten. + */ + for (slot = latest_idx - 1; slot >= 0; slot--) + vos_pkt_trace_buf_dump_1(slot); + } else { + /* + * Scenario: Number of trace records exceeded MAX, + * Circular buffer is overwritten. + */ + for (i = 0; i < VOS_PKT_TRAC_MAX_TRACE_BUF; i++) { + slot = ((latest_idx - i - 1) % + VOS_PKT_TRAC_MAX_TRACE_BUF); + vos_pkt_trace_buf_dump_1(slot); + } + } + + VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, + "PACKET TRACE DUMP END"); + + return; } /** diff --git a/CORE/VOSS/src/vos_sched.c b/CORE/VOSS/src/vos_sched.c index aa5607c2d933..9db28ed0fca7 100644 --- a/CORE/VOSS/src/vos_sched.c +++ b/CORE/VOSS/src/vos_sched.c @@ -999,7 +999,7 @@ static void vos_wd_detect_thread_stuck(void) vos_flush_logs(WLAN_LOG_TYPE_FATAL, WLAN_LOG_INDICATOR_HOST_ONLY, WLAN_LOG_REASON_THREAD_STUCK, - true); + DUMP_VOS_TRACE); spin_lock_irqsave(&gpVosWatchdogContext->thread_stuck_lock, flags); } |
