Blame SOURCES/0010-irqbalance-ui-can-t-change-window-when-in-editing-st.patch

8dca8a
From b65faa2b658e3cf4edf6d39e4bb1e103a47ac0de Mon Sep 17 00:00:00 2001
8dca8a
From: Liu Chao <liuchao173@huawei.com>
8dca8a
Date: Thu, 30 Jun 2022 10:19:00 +0800
8dca8a
Subject: [PATCH 10/14] irqbalance-ui: can't change window when in editing
8dca8a
 state
8dca8a
8dca8a
when invoking setup_irqs in settings or invoking settings in setup_irqs, it
8dca8a
doesn't break but enters another while loop.
8dca8a
For example:
8dca8a
 # gdb program `pidof irqbalance-ui`
8dca8a
 (gdb) bt
8dca8a
 #0  0x0000ffffb0dcc7b0 in poll () from /usr/lib64/libc.so.6
8dca8a
 #1  0x0000ffffb0e9097c in _nc_timed_wait () from /usr/lib64/libtinfo.so.6
8dca8a
 #2  0x0000ffffb0ecc154 in _nc_wgetch () from /usr/lib64/libncursesw.so.6
8dca8a
 #3  0x0000ffffb0eccb18 in wgetch () from /usr/lib64/libncursesw.so.6
8dca8a
 #4  0x00000000004045d4 in setup_irqs () at ui/ui.c:637
8dca8a
 #5  0x0000000000404084 in settings () at ui/ui.c:614
8dca8a
 #6  0x0000000000404084 in settings () at ui/ui.c:614
8dca8a
 #7  0x0000000000404084 in settings () at ui/ui.c:614
8dca8a
 #8  0x0000000000404084 in settings () at ui/ui.c:614
8dca8a
 #9  0x0000000000404084 in settings () at ui/ui.c:614
8dca8a
 #10 0x0000000000404084 in settings () at ui/ui.c:614
8dca8a
 #11 0x0000000000404084 in settings () at ui/ui.c:614
8dca8a
 #12 0x0000000000401fac in key_loop (data=<optimized out>) at ui/irqbalance-ui.c:387
8dca8a
 #13 0x0000ffffb105371c in ?? () from /usr/lib64/libglib-2.0.so.0
8dca8a
 #14 0x0000ffffb1052a84 in g_main_context_dispatch () from /usr/lib64/libglib-2.0.so.0
8dca8a
 #15 0x0000ffffb1052e38 in ?? () from /usr/lib64/libglib-2.0.so.0
8dca8a
 #16 0x0000ffffb1053188 in g_main_loop_run () from /usr/lib64/libglib-2.0.so.0
8dca8a
 #17 0x000000000040196c in main (argc=<optimized out>, argv=<optimized out>) at ui/irqbalance-ui.c:445
8dca8a
8dca8a
Signed-off-by: Liu Chao <liuchao173@huawei.com>
8dca8a
---
8dca8a
 ui/irqbalance-ui.c |  39 ++++++++++---
8dca8a
 ui/ui.c            | 137 ++++++++++++---------------------------------
8dca8a
 ui/ui.h            |   2 +-
8dca8a
 3 files changed, 69 insertions(+), 109 deletions(-)
8dca8a
8dca8a
diff --git a/ui/irqbalance-ui.c b/ui/irqbalance-ui.c
8dca8a
index 3ad3553..89ed94a 100644
8dca8a
--- a/ui/irqbalance-ui.c
8dca8a
+++ b/ui/irqbalance-ui.c
8dca8a
@@ -16,11 +16,16 @@
8dca8a
 #include "helpers.h"
8dca8a
 
8dca8a
 
8dca8a
+enum states {
8dca8a
+	STATE_TREE,
8dca8a
+	STATE_SETTINGS,
8dca8a
+	STATE_SETUP_IRQS
8dca8a
+};
8dca8a
+int state;
8dca8a
 int irqbalance_pid = -1;
8dca8a
 GList *tree = NULL;
8dca8a
 setup_t setup;
8dca8a
 GMainLoop *main_loop;
8dca8a
-int is_tree = 1;
8dca8a
 static int default_bufsz = 8192;
8dca8a
 
8dca8a
 struct msghdr * create_credentials_msg()
8dca8a
@@ -359,7 +364,7 @@ gboolean rescan_tree(gpointer data __attribute__((unused)))
8dca8a
 	parse_setup(setup_data);
8dca8a
 	char *irqbalance_data = get_data(STATS);
8dca8a
 	parse_into_tree(irqbalance_data);
8dca8a
-	if(is_tree) {
8dca8a
+	if(state == STATE_TREE) {
8dca8a
 		display_tree();
8dca8a
 	}
8dca8a
 	free(setup_data);
8dca8a
@@ -375,16 +380,35 @@ gboolean key_loop(gpointer data __attribute__((unused)))
8dca8a
 		close_window(0);
8dca8a
 		break;
8dca8a
 	case KEY_F(3):
8dca8a
-		is_tree = 1;
8dca8a
-		display_tree();
8dca8a
+		if (state == STATE_SETTINGS || state == STATE_SETUP_IRQS) {
8dca8a
+			state = STATE_TREE;
8dca8a
+			display_tree();
8dca8a
+		}
8dca8a
 		break;
8dca8a
 	case KEY_F(4):
8dca8a
-		is_tree = 0;
8dca8a
+		if (state == STATE_TREE || state == STATE_SETUP_IRQS) {
8dca8a
+			state = STATE_SETTINGS;
8dca8a
+			settings();
8dca8a
+		}
8dca8a
 		settings();
8dca8a
 		break;
8dca8a
 	case KEY_F(5):
8dca8a
-		is_tree = 0;
8dca8a
-		setup_irqs();
8dca8a
+		if (state == STATE_TREE || state == STATE_SETTINGS) {
8dca8a
+			state = STATE_SETUP_IRQS;
8dca8a
+			setup_irqs();
8dca8a
+		}
8dca8a
+		break;
8dca8a
+	case 'c':
8dca8a
+		if (state == STATE_SETTINGS)
8dca8a
+			handle_cpu_banning();
8dca8a
+		break;
8dca8a
+	case 'i':
8dca8a
+		if (state == STATE_SETUP_IRQS)
8dca8a
+			handle_irq_banning();
8dca8a
+		break;
8dca8a
+	case 's':
8dca8a
+		if (state == STATE_SETTINGS)
8dca8a
+			handle_sleep_setting();
8dca8a
 		break;
8dca8a
 	default:
8dca8a
 		break;
8dca8a
@@ -437,6 +461,7 @@ int main(int argc, char **argv)
8dca8a
 		}
8dca8a
 	}
8dca8a
 
8dca8a
+	state = STATE_TREE;
8dca8a
 	init();
8dca8a
 
8dca8a
 	main_loop = g_main_loop_new(NULL, FALSE);
8dca8a
diff --git a/ui/ui.c b/ui/ui.c
8dca8a
index beafe3a..1e211de 100644
8dca8a
--- a/ui/ui.c
8dca8a
+++ b/ui/ui.c
8dca8a
@@ -273,7 +273,8 @@ void handle_cpu_banning()
8dca8a
 			attrset(COLOR_PAIR(5));
8dca8a
 			mvprintw(LINES - 2, 1,
8dca8a
 				"Press <S> for changing sleep setup, <C> for CPU ban setup.  ");
8dca8a
-			move(LINES - 1, COLS - 1);
8dca8a
+			show_frame();
8dca8a
+			show_footer();
8dca8a
 			refresh();
8dca8a
 			break;
8dca8a
 		case 's':
8dca8a
@@ -287,8 +288,8 @@ void handle_cpu_banning()
8dca8a
 			attrset(COLOR_PAIR(5));
8dca8a
 			mvprintw(LINES - 2, 1,
8dca8a
 				"Press <S> for changing sleep setup, <C> for CPU ban setup.  ");
8dca8a
-			attrset(COLOR_PAIR(3));
8dca8a
-			move(LINES - 1, COLS - 1);
8dca8a
+			show_frame();
8dca8a
+			show_footer();
8dca8a
 			refresh();
8dca8a
 			char settings_string[1024] = "settings cpus \0";
8dca8a
 			for_each_cpu(all_cpus, get_new_cpu_ban_values, settings_string);
8dca8a
@@ -302,16 +303,6 @@ void handle_cpu_banning()
8dca8a
 			processing = 0;
8dca8a
 			close_window(0);
8dca8a
 			break;
8dca8a
-		case KEY_F(3):
8dca8a
-			is_tree = 1;
8dca8a
-			processing = 0;
8dca8a
-			display_tree();
8dca8a
-			break;
8dca8a
-		case KEY_F(5):
8dca8a
-			is_tree = 0;
8dca8a
-			processing = 0;
8dca8a
-			setup_irqs();
8dca8a
-			break;
8dca8a
 		default:
8dca8a
 			break;
8dca8a
 		}
8dca8a
@@ -475,7 +466,8 @@ void handle_irq_banning()
8dca8a
 			attrset(COLOR_PAIR(5));
8dca8a
 			mvprintw(LINES - 2, 1, "Press  for setting up IRQ banning.\
8dca8a
 				");
8dca8a
-			move(LINES - 1, COLS - 1);
8dca8a
+			show_frame();
8dca8a
+			show_footer();
8dca8a
 			refresh();
8dca8a
 			break;
8dca8a
 		case 's':
8dca8a
@@ -490,7 +482,8 @@ void handle_irq_banning()
8dca8a
 			mvprintw(LINES - 2, 1, "Press  for setting up IRQ banning.\
8dca8a
 				");
8dca8a
 			attrset(COLOR_PAIR(3));
8dca8a
-			move(LINES - 1, COLS - 1);
8dca8a
+			show_frame();
8dca8a
+			show_footer();
8dca8a
 			refresh();
8dca8a
 			char settings_string[1024] = BAN_IRQS;
8dca8a
 			for_each_irq(all_irqs, get_new_irq_ban_values, settings_string);
8dca8a
@@ -504,22 +497,35 @@ void handle_irq_banning()
8dca8a
 			processing = 0;
8dca8a
 			close_window(0);
8dca8a
 			break;
8dca8a
-		case KEY_F(3):
8dca8a
-			is_tree = 1;
8dca8a
-			processing = 0;
8dca8a
-			display_tree();
8dca8a
-			break;
8dca8a
-		case KEY_F(4):
8dca8a
-			is_tree = 0;
8dca8a
-			processing = 0;
8dca8a
-			settings();
8dca8a
-			break;
8dca8a
 		default:
8dca8a
 			break;
8dca8a
 		}
8dca8a
 	}
8dca8a
 }
8dca8a
 
8dca8a
+void handle_sleep_setting()
8dca8a
+{
8dca8a
+	char info[128] = "Current sleep interval between rebalancing: \0";
8dca8a
+	uint8_t sleep_input_offset = strlen(info) + 3;
8dca8a
+	mvprintw(LINES - 1, 1, "Press ESC for discarding your input.\
8dca8a
+												");
8dca8a
+	attrset(COLOR_PAIR(0));
8dca8a
+	mvprintw(LINES - 2, 1, "			\
8dca8a
+												");
8dca8a
+	uint64_t new_sleep = get_valid_sleep_input(sleep_input_offset);
8dca8a
+	if(new_sleep != setup.sleep) {
8dca8a
+		setup.sleep = new_sleep;
8dca8a
+		char settings_data[128];
8dca8a
+		snprintf(settings_data, 128, "%s %" PRIu64, SET_SLEEP, new_sleep);
8dca8a
+		send_settings(settings_data);
8dca8a
+	}
8dca8a
+	attrset(COLOR_PAIR(5));
8dca8a
+	mvprintw(LINES - 2, 1, "Press <S> for changing sleep setup, <C> for CPU ban setup. ");
8dca8a
+	show_frame();
8dca8a
+	show_footer();
8dca8a
+	refresh();
8dca8a
+}
8dca8a
+
8dca8a
 void init()
8dca8a
 {
8dca8a
 	signal(SIGINT, close_window);
8dca8a
@@ -563,60 +569,15 @@ void settings()
8dca8a
 	parse_setup(setup_data);
8dca8a
 
8dca8a
 	char info[128] = "Current sleep interval between rebalancing: \0";
8dca8a
-	uint8_t sleep_input_offset = strlen(info) + 3;
8dca8a
 	snprintf(info + strlen(info), 128 - strlen(info), "%" PRIu64 "\n", setup.sleep);
8dca8a
 	attrset(COLOR_PAIR(1));
8dca8a
 	mvprintw(2, 3, "%s", info);
8dca8a
 	print_all_cpus();
8dca8a
-
8dca8a
-	int user_input = 1;
8dca8a
-	while(user_input) {
8dca8a
-		attrset(COLOR_PAIR(5));
8dca8a
-		mvprintw(LINES - 2, 1,
8dca8a
-				 "Press <S> for changing sleep setup, <C> for CPU ban setup. ");
8dca8a
-		show_frame();
8dca8a
-		show_footer();
8dca8a
-		refresh();
8dca8a
-		int c = getch();
8dca8a
-		switch(c) {
8dca8a
-		case 's': {
8dca8a
-			mvprintw(LINES - 1, 1, "Press ESC for discarding your input.\
8dca8a
-												");
8dca8a
-			attrset(COLOR_PAIR(0));
8dca8a
-			mvprintw(LINES - 2, 1, "			\
8dca8a
-												");
8dca8a
-			uint64_t new_sleep = get_valid_sleep_input(sleep_input_offset);
8dca8a
-			if(new_sleep != setup.sleep) {
8dca8a
-				setup.sleep = new_sleep;
8dca8a
-				char settings_data[128];
8dca8a
-				snprintf(settings_data, 128, "%s %" PRIu64, SET_SLEEP, new_sleep);
8dca8a
-				send_settings(settings_data);
8dca8a
-			}
8dca8a
-			break;
8dca8a
-		}
8dca8a
-		case 'c':
8dca8a
-			handle_cpu_banning();
8dca8a
-			break;
8dca8a
-		/* We need to include window changing options as well because the
8dca8a
-		 * related char was eaten up by getch() already */
8dca8a
-		case 'q':
8dca8a
-			user_input = 0;
8dca8a
-			close_window(0);
8dca8a
-			break;
8dca8a
-		case KEY_F(3):
8dca8a
-			is_tree = 1;
8dca8a
-			user_input = 0;
8dca8a
-			display_tree();
8dca8a
-			break;
8dca8a
-		case KEY_F(5):
8dca8a
-			is_tree = 0;
8dca8a
-			user_input = 0;
8dca8a
-			setup_irqs();
8dca8a
-			break;
8dca8a
-		default:
8dca8a
-			break;
8dca8a
-		}
8dca8a
-	}
8dca8a
+	attrset(COLOR_PAIR(5));
8dca8a
+	mvprintw(LINES - 2, 1, "Press <S> for changing sleep setup, <C> for CPU ban setup. ");
8dca8a
+	show_frame();
8dca8a
+	show_footer();
8dca8a
+	refresh();
8dca8a
 	free(setup_data);
8dca8a
 }
8dca8a
 
8dca8a
@@ -631,32 +592,6 @@ void setup_irqs()
8dca8a
 	show_frame();
8dca8a
 	show_footer();
8dca8a
 	refresh();
8dca8a
-
8dca8a
-	int user_input = 1;
8dca8a
-	while(user_input) {
8dca8a
-		int c = getch();
8dca8a
-		switch(c) {
8dca8a
-		case 'i':
8dca8a
-			handle_irq_banning();
8dca8a
-			break;
8dca8a
-		case 'q':
8dca8a
-			user_input = 0;
8dca8a
-			close_window(0);
8dca8a
-			break;
8dca8a
-		case KEY_F(3):
8dca8a
-			is_tree = 1;
8dca8a
-			user_input = 0;
8dca8a
-			display_tree();
8dca8a
-			break;
8dca8a
-		case KEY_F(4):
8dca8a
-			is_tree = 0;
8dca8a
-			user_input = 0;
8dca8a
-			settings();
8dca8a
-			break;
8dca8a
-		default:
8dca8a
-			break;
8dca8a
-		}
8dca8a
-	}
8dca8a
 }
8dca8a
 
8dca8a
 void display_tree_node_irqs(irq_t *irq, void *data)
8dca8a
diff --git a/ui/ui.h b/ui/ui.h
8dca8a
index 0aa8280..ca2a3a6 100644
8dca8a
--- a/ui/ui.h
8dca8a
+++ b/ui/ui.h
8dca8a
@@ -13,7 +13,6 @@
8dca8a
 
8dca8a
 extern GList *tree;
8dca8a
 extern setup_t setup;
8dca8a
-extern int is_tree;
8dca8a
 
8dca8a
 void show_frame();
8dca8a
 void show_footer();
8dca8a
@@ -29,6 +28,7 @@ void display_banned_cpus();
8dca8a
 int toggle_cpu(GList *cpu_list, int cpu_number);
8dca8a
 void get_new_cpu_ban_values(cpu_ban_t *cpu, void *data);
8dca8a
 void get_cpu();
8dca8a
+void handle_sleep_setting();
8dca8a
 void handle_cpu_banning();
8dca8a
 
8dca8a
 void copy_assigned_obj(int *number, void *data);
8dca8a
-- 
8dca8a
2.33.1
8dca8a