qcacmn: Add support to dump last n dpt stat records

Add support to dump only last n dpt records of debug fs
dump_set_dpt_logs file.

Change-Id: Ic6418803d53cc2abbfc200f62df2a24c3bc55d54
CRs-Fixed: 2362523
This commit is contained in:
Rakshith Suresh Patkar
2018-12-06 20:40:49 +05:30
committed by nshrivas
parent 33d9b7fc64
commit e105ac141d
2 changed files with 63 additions and 21 deletions

View File

@@ -374,6 +374,8 @@ struct qdf_dp_trace_record_s {
* @num: Current index * @num: Current index
* @proto_bitmap: defines which protocol to be traced * @proto_bitmap: defines which protocol to be traced
* @no_of_record: defines every nth packet to be traced * @no_of_record: defines every nth packet to be traced
* @num_records_to_dump: defines number of records to be dumped
* @dump_counter: counter to track number of records dumped
* @verbosity : defines verbosity level * @verbosity : defines verbosity level
* @ini_conf_verbosity: Configured verbosity from INI * @ini_conf_verbosity: Configured verbosity from INI
* @enable: enable/disable DP trace * @enable: enable/disable DP trace
@@ -417,6 +419,8 @@ struct s_qdf_dp_trace_data {
uint32_t num; uint32_t num;
uint8_t proto_bitmap; uint8_t proto_bitmap;
uint8_t no_of_record; uint8_t no_of_record;
uint16_t num_records_to_dump;
uint16_t dump_counter;
uint8_t verbosity; uint8_t verbosity;
uint8_t ini_conf_verbosity; uint8_t ini_conf_verbosity;
bool enable; bool enable;
@@ -662,14 +666,16 @@ QDF_STATUS qdf_dpt_dump_stats_debugfs(qdf_debugfs_file_t file,
uint32_t curr_pos); uint32_t curr_pos);
/** /**
* qdf_dpt_set_value_debugfs() - dump DP Trace stats to debugfs file * qdf_dpt_set_value_debugfs() - set value of DP Trace debugfs params
* @file: debugfs file to read * @proto_bitmap: defines which protocol to be traced
* @curr_pos: curr position to start read * @no_of_record: defines every nth packet to be traced
* @verbosity : defines verbosity level
* @num_records_to_dump: defines number of records to be dumped
* *
* Return: none * Return: none
*/ */
void qdf_dpt_set_value_debugfs(uint8_t proto_bitmap, uint8_t no_of_record, void qdf_dpt_set_value_debugfs(uint8_t proto_bitmap, uint8_t no_of_record,
uint8_t verbosity); uint8_t verbosity, uint16_t num_records_to_dump);
/** /**
@@ -877,7 +883,7 @@ QDF_STATUS qdf_dpt_dump_stats_debugfs(qdf_debugfs_file_t file,
static inline static inline
void qdf_dpt_set_value_debugfs(uint8_t proto_bitmap, uint8_t no_of_record, void qdf_dpt_set_value_debugfs(uint8_t proto_bitmap, uint8_t no_of_record,
uint8_t verbosity) uint8_t verbosity, uint16_t num_records_to_dump)
{ {
} }

View File

@@ -841,6 +841,14 @@ static inline void free_g_qdf_dp_trace_tbl_buffer(void)
#endif #endif
#define QDF_DP_TRACE_PREPEND_STR_SIZE 100 #define QDF_DP_TRACE_PREPEND_STR_SIZE 100
/*
* one dp trace record can't be greater than 300 bytes.
* Max Size will be QDF_DP_TRACE_PREPEND_STR_SIZE(100) + BUFFER_SIZE(121).
* Always make sure to change this QDF_DP_TRACE_MAX_RECORD_SIZE
* value accordingly whenever above two mentioned MACRO value changes.
*/
#define QDF_DP_TRACE_MAX_RECORD_SIZE 300
static void qdf_dp_unused(struct qdf_dp_trace_record_s *record, static void qdf_dp_unused(struct qdf_dp_trace_record_s *record,
uint16_t index, uint8_t pdev_id, uint8_t info) uint16_t index, uint8_t pdev_id, uint8_t info)
{ {
@@ -2185,6 +2193,8 @@ void qdf_dp_trace_clear_buffer(void)
g_qdf_dp_trace_data.head = INVALID_QDF_DP_TRACE_ADDR; g_qdf_dp_trace_data.head = INVALID_QDF_DP_TRACE_ADDR;
g_qdf_dp_trace_data.tail = INVALID_QDF_DP_TRACE_ADDR; g_qdf_dp_trace_data.tail = INVALID_QDF_DP_TRACE_ADDR;
g_qdf_dp_trace_data.num = 0; g_qdf_dp_trace_data.num = 0;
g_qdf_dp_trace_data.dump_counter = 0;
g_qdf_dp_trace_data.num_records_to_dump = MAX_QDF_DP_TRACE_RECORDS;
if (g_qdf_dp_trace_data.enable) if (g_qdf_dp_trace_data.enable)
memset(g_qdf_dp_trace_tbl, 0, memset(g_qdf_dp_trace_tbl, 0,
MAX_QDF_DP_TRACE_RECORDS * MAX_QDF_DP_TRACE_RECORDS *
@@ -2245,8 +2255,7 @@ static void qdf_dpt_dump_hex_trace_debugfs(qdf_debugfs_file_t file,
hex_dump_to_buffer(ptr + i, linelen, ROW_SIZE, 1, hex_dump_to_buffer(ptr + i, linelen, ROW_SIZE, 1,
linebuf, sizeof(linebuf), false); linebuf, sizeof(linebuf), false);
qdf_debugfs_printf(file, "DPT: %s %s\n", qdf_debugfs_printf(file, "%s %s\n", str, linebuf);
str, linebuf);
} }
} }
@@ -2416,10 +2425,11 @@ uint32_t qdf_dpt_get_curr_pos_debugfs(qdf_debugfs_file_t file,
return g_qdf_dp_trace_data.curr_pos; return g_qdf_dp_trace_data.curr_pos;
qdf_debugfs_printf(file, qdf_debugfs_printf(file,
"DPT: config - bitmap 0x%x verb %u #rec %u live_config %u thresh %u time_limit %u\n", "DPT: config - bitmap 0x%x verb %u #rec %u rec_requested %u live_config %u thresh %u time_limit %u\n",
g_qdf_dp_trace_data.proto_bitmap, g_qdf_dp_trace_data.proto_bitmap,
g_qdf_dp_trace_data.verbosity, g_qdf_dp_trace_data.verbosity,
g_qdf_dp_trace_data.no_of_record, g_qdf_dp_trace_data.no_of_record,
g_qdf_dp_trace_data.num_records_to_dump,
g_qdf_dp_trace_data.live_mode_config, g_qdf_dp_trace_data.live_mode_config,
g_qdf_dp_trace_data.high_tput_thresh, g_qdf_dp_trace_data.high_tput_thresh,
g_qdf_dp_trace_data.thresh_time_limit); g_qdf_dp_trace_data.thresh_time_limit);
@@ -2470,7 +2480,8 @@ uint32_t qdf_dpt_get_curr_pos_debugfs(qdf_debugfs_file_t file,
g_qdf_dp_trace_data.saved_tail = tail; g_qdf_dp_trace_data.saved_tail = tail;
} }
spin_unlock_bh(&l_dp_trace_lock); spin_unlock_bh(&l_dp_trace_lock);
return i;
return g_qdf_dp_trace_data.saved_tail;
} }
qdf_export_symbol(qdf_dpt_get_curr_pos_debugfs); qdf_export_symbol(qdf_dpt_get_curr_pos_debugfs);
@@ -2479,17 +2490,36 @@ QDF_STATUS qdf_dpt_dump_stats_debugfs(qdf_debugfs_file_t file,
{ {
struct qdf_dp_trace_record_s p_record; struct qdf_dp_trace_record_s p_record;
uint32_t i = curr_pos; uint32_t i = curr_pos;
uint32_t tail = g_qdf_dp_trace_data.saved_tail; uint16_t num_records_to_dump = g_qdf_dp_trace_data.num_records_to_dump;
if (!g_qdf_dp_trace_data.enable) if (!g_qdf_dp_trace_data.enable) {
QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR,
"%s: Tracing Disabled", __func__);
return QDF_STATUS_E_FAILURE;
}
if (num_records_to_dump > g_qdf_dp_trace_data.num)
num_records_to_dump = g_qdf_dp_trace_data.num;
/*
* Max dp trace record size should always be less than
* QDF_DP_TRACE_PREPEND_STR_SIZE(100) + BUFFER_SIZE(121).
*/
if (WARN_ON(QDF_DP_TRACE_MAX_RECORD_SIZE <
QDF_DP_TRACE_PREPEND_STR_SIZE + BUFFER_SIZE))
return QDF_STATUS_E_FAILURE; return QDF_STATUS_E_FAILURE;
spin_lock_bh(&l_dp_trace_lock); spin_lock_bh(&l_dp_trace_lock);
p_record = g_qdf_dp_trace_tbl[i]; p_record = g_qdf_dp_trace_tbl[i];
spin_unlock_bh(&l_dp_trace_lock); spin_unlock_bh(&l_dp_trace_lock);
for (;; ) { for (;; ) {
if ((file->size - file->count) < 100) { /*
* Initially we get file as 1 page size, and
* if remaining size in file is less than one record max size,
* then return so that it gets an extra page.
*/
if ((file->size - file->count) < QDF_DP_TRACE_MAX_RECORD_SIZE) {
spin_lock_bh(&l_dp_trace_lock); spin_lock_bh(&l_dp_trace_lock);
g_qdf_dp_trace_data.curr_pos = i; g_qdf_dp_trace_data.curr_pos = i;
spin_unlock_bh(&l_dp_trace_lock); spin_unlock_bh(&l_dp_trace_lock);
@@ -2561,17 +2591,20 @@ QDF_STATUS qdf_dpt_dump_stats_debugfs(qdf_debugfs_file_t file,
break; break;
} }
if (i == tail) if (++g_qdf_dp_trace_data.dump_counter == num_records_to_dump)
break; break;
i += 1;
spin_lock_bh(&l_dp_trace_lock); spin_lock_bh(&l_dp_trace_lock);
if (i == MAX_QDF_DP_TRACE_RECORDS) if (i == 0)
i = 0; i = MAX_QDF_DP_TRACE_RECORDS;
i -= 1;
p_record = g_qdf_dp_trace_tbl[i]; p_record = g_qdf_dp_trace_tbl[i];
spin_unlock_bh(&l_dp_trace_lock); spin_unlock_bh(&l_dp_trace_lock);
} }
g_qdf_dp_trace_data.dump_counter = 0;
return QDF_STATUS_SUCCESS; return QDF_STATUS_SUCCESS;
} }
qdf_export_symbol(qdf_dpt_dump_stats_debugfs); qdf_export_symbol(qdf_dpt_dump_stats_debugfs);
@@ -2585,11 +2618,14 @@ qdf_export_symbol(qdf_dpt_dump_stats_debugfs);
* Return: None * Return: None
*/ */
void qdf_dpt_set_value_debugfs(uint8_t proto_bitmap, uint8_t no_of_record, void qdf_dpt_set_value_debugfs(uint8_t proto_bitmap, uint8_t no_of_record,
uint8_t verbosity) uint8_t verbosity, uint16_t num_records_to_dump)
{ {
g_qdf_dp_trace_data.proto_bitmap = proto_bitmap; if (g_qdf_dp_trace_data.enable) {
g_qdf_dp_trace_data.no_of_record = no_of_record; g_qdf_dp_trace_data.proto_bitmap = proto_bitmap;
g_qdf_dp_trace_data.verbosity = verbosity; g_qdf_dp_trace_data.no_of_record = no_of_record;
g_qdf_dp_trace_data.verbosity = verbosity;
g_qdf_dp_trace_data.num_records_to_dump = num_records_to_dump;
}
} }
qdf_export_symbol(qdf_dpt_set_value_debugfs); qdf_export_symbol(qdf_dpt_set_value_debugfs);