From 6b79ee126bbe2488f9f46b1a4a694f76fa3ec2e0 Mon Sep 17 00:00:00 2001 From: Krzysztof Karas Date: Tue, 17 Aug 2021 10:52:45 +0200 Subject: [PATCH] spdk_top: refresh tab space Currently THREADS tab displays records of objects that have already been deleted inside SPDK target. This patch adds redrawing of empty spaces to erase those leftovers. Deleted threads_info pointer array, since we can use the global array directly. Change-Id: Ia4ccb8f1b9a530cb86be50b9ed629f6b9b0543cb Signed-off-by: Krzysztof Karas Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/9199 Reviewed-by: Tomasz Zawadzki Reviewed-by: Jim Harris Reviewed-by: Paul Luse Reviewed-by: Chengqiang Meng Reviewed-by: Xiaodong Liu Reviewed-by: GangCao Tested-by: SPDK CI Jenkins Community-CI: Broadcom CI Community-CI: Mellanox Build Bot --- app/spdk_top/spdk_top.c | 42 +++++++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/app/spdk_top/spdk_top.c b/app/spdk_top/spdk_top.c index 88c0fbfec..00d55b659 100644 --- a/app/spdk_top/spdk_top.c +++ b/app/spdk_top/spdk_top.c @@ -1152,59 +1152,65 @@ static uint8_t refresh_threads_tab(uint8_t current_page) { struct col_desc *col_desc = g_col_desc[THREADS_TAB]; - uint64_t i, threads_count; - uint16_t col; + uint64_t i, j, threads_count; + uint16_t col, empty_col = 0; uint8_t max_pages, item_index; char pollers_number[MAX_POLLER_COUNT_STR_LEN], idle_time[MAX_TIME_STR_LEN], busy_time[MAX_TIME_STR_LEN], core_str[MAX_CORE_MASK_STR_LEN]; - struct rpc_thread_info *thread_info[RPC_MAX_THREADS]; threads_count = g_last_threads_count; - for (i = 0; i < threads_count; i++) { - thread_info[i] = &g_threads_info[i]; - } - max_pages = (threads_count + g_max_data_rows - 1) / g_max_data_rows; for (i = current_page * g_max_data_rows; - i < spdk_min(threads_count, (uint64_t)((current_page + 1) * g_max_data_rows)); + i < (uint64_t)((current_page + 1) * g_max_data_rows); i++) { item_index = i - (current_page * g_max_data_rows); + /* When number of threads decreases, this will print spaces in places + * where non existent threads were previously displayed. */ + if (i >= threads_count) { + for (j = 1; j < (uint64_t)g_max_col - 1; j++) { + mvwprintw(g_tabs[THREADS_TAB], item_index + TABS_DATA_START_ROW, j, " "); + } + + empty_col++; + continue; + } + col = TABS_DATA_START_COL; draw_row_background(item_index, THREADS_TAB); if (!col_desc[0].disabled) { print_max_len(g_tabs[THREADS_TAB], TABS_DATA_START_ROW + item_index, col, - col_desc[0].max_data_string, ALIGN_LEFT, thread_info[i]->name); + col_desc[0].max_data_string, ALIGN_LEFT, g_threads_info[i].name); col += col_desc[0].max_data_string; } if (!col_desc[1].disabled) { - snprintf(core_str, MAX_CORE_STR_LEN, "%d", thread_info[i]->core_num); + snprintf(core_str, MAX_CORE_STR_LEN, "%d", g_threads_info[i].core_num); print_max_len(g_tabs[THREADS_TAB], TABS_DATA_START_ROW + item_index, col, col_desc[1].max_data_string, ALIGN_RIGHT, core_str); col += col_desc[1].max_data_string + 2; } if (!col_desc[2].disabled) { - snprintf(pollers_number, MAX_POLLER_COUNT_STR_LEN, "%ld", thread_info[i]->active_pollers_count); + snprintf(pollers_number, MAX_POLLER_COUNT_STR_LEN, "%ld", g_threads_info[i].active_pollers_count); print_max_len(g_tabs[THREADS_TAB], TABS_DATA_START_ROW + item_index, col + (col_desc[2].name_len / 2), col_desc[2].max_data_string, ALIGN_LEFT, pollers_number); col += col_desc[2].max_data_string + 2; } if (!col_desc[3].disabled) { - snprintf(pollers_number, MAX_POLLER_COUNT_STR_LEN, "%ld", thread_info[i]->timed_pollers_count); + snprintf(pollers_number, MAX_POLLER_COUNT_STR_LEN, "%ld", g_threads_info[i].timed_pollers_count); print_max_len(g_tabs[THREADS_TAB], TABS_DATA_START_ROW + item_index, col + (col_desc[3].name_len / 2), col_desc[3].max_data_string, ALIGN_LEFT, pollers_number); col += col_desc[3].max_data_string + 1; } if (!col_desc[4].disabled) { - snprintf(pollers_number, MAX_POLLER_COUNT_STR_LEN, "%ld", thread_info[i]->paused_pollers_count); + snprintf(pollers_number, MAX_POLLER_COUNT_STR_LEN, "%ld", g_threads_info[i].paused_pollers_count); print_max_len(g_tabs[THREADS_TAB], TABS_DATA_START_ROW + item_index, col + (col_desc[4].name_len / 2), col_desc[4].max_data_string, ALIGN_LEFT, pollers_number); col += col_desc[4].max_data_string + 2; @@ -1212,9 +1218,9 @@ refresh_threads_tab(uint8_t current_page) if (!col_desc[5].disabled) { if (g_interval_data == true) { - get_time_str(thread_info[i]->idle - thread_info[i]->last_idle, idle_time); + get_time_str(g_threads_info[i].idle - g_threads_info[i].last_idle, idle_time); } else { - get_time_str(thread_info[i]->idle, idle_time); + get_time_str(g_threads_info[i].idle, idle_time); } print_max_len(g_tabs[THREADS_TAB], TABS_DATA_START_ROW + item_index, col, col_desc[5].max_data_string, ALIGN_RIGHT, idle_time); @@ -1223,9 +1229,9 @@ refresh_threads_tab(uint8_t current_page) if (!col_desc[6].disabled) { if (g_interval_data == true) { - get_time_str(thread_info[i]->busy - thread_info[i]->last_busy, busy_time); + get_time_str(g_threads_info[i].busy - g_threads_info[i].last_busy, busy_time); } else { - get_time_str(thread_info[i]->busy, busy_time); + get_time_str(g_threads_info[i].busy, busy_time); } print_max_len(g_tabs[THREADS_TAB], TABS_DATA_START_ROW + item_index, col, col_desc[6].max_data_string, ALIGN_RIGHT, busy_time); @@ -1236,7 +1242,7 @@ refresh_threads_tab(uint8_t current_page) } } - g_max_selected_row = i - current_page * g_max_data_rows - 1; + g_max_selected_row = i - current_page * g_max_data_rows - 1 - empty_col; return max_pages; }