From: Daniel Glöckner <dg@xxxxxxxxx> Some code can't foresee which resources will be used by its poller. This is the case especially in pollers that will execute arbitrary commands input by the user. With this commit a special slice is introduced that is released only when Barebox is waiting for console input and only when it is doing that outside of any command. Code that wants to depend on the idle slice must select CONFIG_IDLE_SLICE to make it available. Signed-off-by: Daniel Glöckner <dg@xxxxxxxxx> Signed-off-by: Sascha Hauer <s.hauer@xxxxxxxxxxxxxx> --- common/hush.c | 5 +++++ common/ratp/ratp.c | 7 ++++++- common/slice.c | 22 ++++++++++++++++++++++ common/startup.c | 2 ++ include/ratp_bb.h | 1 - include/slice.h | 5 +++++ lib/readline.c | 6 +----- 7 files changed, 41 insertions(+), 7 deletions(-) diff --git a/common/hush.c b/common/hush.c index c24b2c7cd2..61424d98e7 100644 --- a/common/hush.c +++ b/common/hush.c @@ -460,7 +460,12 @@ static void get_user_input(struct in_str *i) else prompt = CONFIG_PROMPT_HUSH_PS2; + idle_slice_release(); + n = readline(prompt, console_buffer, CONFIG_CBSIZE); + + idle_slice_acquire(); + if (n == -1 ) { i->interrupt = 1; n = 0; diff --git a/common/ratp/ratp.c b/common/ratp/ratp.c index 556dc638d8..ec665803bb 100644 --- a/common/ratp/ratp.c +++ b/common/ratp/ratp.c @@ -299,10 +299,13 @@ static int ratp_console_register(struct ratp_ctx *ctx) return 0; } -void barebox_ratp_command_run(void) +static void barebox_ratp_command_run(void) { int ret; + if (slice_acquired(&idle_slice)) + return; + if (!ratp_command) return; @@ -369,6 +372,8 @@ static void ratp_poller(struct poller_struct *poller) free(buf); + barebox_ratp_command_run(); + return; out: diff --git a/common/slice.c b/common/slice.c index 085d67604f..b64b822ec1 100644 --- a/common/slice.c +++ b/common/slice.c @@ -3,6 +3,7 @@ #define pr_fmt(fmt) "slice: " fmt #include <common.h> +#include <init.h> #include <slice.h> /* @@ -231,6 +232,27 @@ void slice_exit(struct slice *slice) free(slice->name); } +struct slice idle_slice; + +void idle_slice_acquire(void) +{ + slice_acquire(&idle_slice); +} + +void idle_slice_release(void) +{ + slice_release(&idle_slice); +} + +static int idle_slice_init(void) +{ + slice_init(&idle_slice, "idle"); + slice_acquire(&idle_slice); + return 0; +} + +pure_initcall(idle_slice_init); + #if defined CONFIG_CMD_SLICE #include <command.h> diff --git a/common/startup.c b/common/startup.c index 511675ed55..aecb045f45 100644 --- a/common/startup.c +++ b/common/startup.c @@ -268,8 +268,10 @@ enum autoboot_state do_autoboot_countdown(void) break; } + idle_slice_release(); ret = console_countdown(global_autoboot_timeout, flags, abortkeys, &outkey); + idle_slice_acquire(); if (ret == 0) autoboot_state = AUTOBOOT_BOOT; diff --git a/include/ratp_bb.h b/include/ratp_bb.h index a4f28c642c..b710f99bf9 100644 --- a/include/ratp_bb.h +++ b/include/ratp_bb.h @@ -41,7 +41,6 @@ struct ratp_bb_pkt { }; int barebox_ratp(struct console_device *cdev); -void barebox_ratp_command_run(void); int barebox_ratp_fs_call(struct ratp_bb_pkt *tx, struct ratp_bb_pkt **rx); int barebox_ratp_fs_mount(const char *path); diff --git a/include/slice.h b/include/slice.h index 5538fc434a..37d5350ebe 100644 --- a/include/slice.h +++ b/include/slice.h @@ -28,4 +28,9 @@ void slice_exit(struct slice *slice); void slice_debug_acquired(struct slice *slice); +extern struct slice idle_slice; + +void idle_slice_acquire(void); +void idle_slice_release(void); + #endif /* __SLICE_H */ diff --git a/lib/readline.c b/lib/readline.c index 3d16c1838c..e5370f9c7b 100644 --- a/lib/readline.c +++ b/lib/readline.c @@ -3,7 +3,6 @@ #include <init.h> #include <libbb.h> #include <poller.h> -#include <ratp_bb.h> #include <xfuncs.h> #include <complete.h> #include <linux/ctype.h> @@ -200,11 +199,8 @@ int readline(const char *prompt, char *buf, int len) puts (prompt); while (1) { - while (!tstc()) { + while (!tstc()) poller_call(); - if (IS_ENABLED(CONFIG_CONSOLE_RATP)) - barebox_ratp_command_run(); - } ichar = read_key(); -- 2.26.2 _______________________________________________ barebox mailing list barebox@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/barebox