mail archive of the barebox mailing list
 help / color / mirror / Atom feed
From: Sascha Hauer <s.hauer@pengutronix.de>
To: Barebox List <barebox@lists.infradead.org>
Cc: "Edmund Henniges" <eh@emlix.com>, "Daniel Glöckner" <dg@emlix.com>
Subject: [PATCH 07/19] Introduce idle slice
Date: Wed, 20 May 2020 11:43:51 +0200	[thread overview]
Message-ID: <20200520094403.12651-8-s.hauer@pengutronix.de> (raw)
In-Reply-To: <20200520094403.12651-1-s.hauer@pengutronix.de>

From: Daniel Glöckner <dg@emlix.com>

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@emlix.com>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
 common/console_countdown.c |  1 +
 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/Kconfig                |  1 +
 lib/readline.c             |  7 ++-----
 9 files changed, 44 insertions(+), 7 deletions(-)

diff --git a/common/console_countdown.c b/common/console_countdown.c
index 74dc382795..c69029dc0e 100644
--- a/common/console_countdown.c
+++ b/common/console_countdown.c
@@ -19,6 +19,7 @@
 #include <errno.h>
 #include <console_countdown.h>
 #include <stdio.h>
+#include <slice.h>
 
 static bool console_countdown_timeout_abort;
 
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/Kconfig b/lib/Kconfig
index b4a8079700..053ac15cfc 100644
--- a/lib/Kconfig
+++ b/lib/Kconfig
@@ -111,6 +111,7 @@ config RATP
 	select COMPILE_MEMORY
 	select COMMAND_SUPPORT
 	select POLLER
+	select IDLE_SLICE
 	depends on CONSOLE_FULL
 	depends on !SHELL_NONE
 	bool "RATP protocol support"
diff --git a/lib/readline.c b/lib/readline.c
index 3d16c1838c..cafdc58b1b 100644
--- a/lib/readline.c
+++ b/lib/readline.c
@@ -3,7 +3,7 @@
 #include <init.h>
 #include <libbb.h>
 #include <poller.h>
-#include <ratp_bb.h>
+#include <slice.h>
 #include <xfuncs.h>
 #include <complete.h>
 #include <linux/ctype.h>
@@ -200,11 +200,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@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

  parent reply	other threads:[~2020-05-20  9:44 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-05-20  9:43 [PATCH 00/19] Slices and fastboot over UDP Sascha Hauer
2020-05-20  9:43 ` [PATCH 01/19] poller: Give pollers a name Sascha Hauer
2020-05-20  9:43 ` [PATCH 02/19] poller: Add a poller command Sascha Hauer
2020-05-20  9:43 ` [PATCH 03/19] fastboot: split generic code from USB gadget Sascha Hauer
2020-05-20  9:43 ` [PATCH 04/19] fastboot: don't close fd 0 when downloading to ram Sascha Hauer
2020-05-20  9:43 ` [PATCH 05/19] fastboot: Use unique tempfile name Sascha Hauer
2020-05-20  9:43 ` [PATCH 06/19] Introduce slices Sascha Hauer
2020-05-20  9:43 ` Sascha Hauer [this message]
2020-05-22 11:56   ` [PATCH 07/19] Introduce idle slice Daniel Glöckner
2020-05-25  8:09     ` Sascha Hauer
2020-05-20  9:43 ` [PATCH 08/19] net: Add a slice to struct eth_device Sascha Hauer
2020-05-20  9:43 ` [PATCH 09/19] net: mdiobus: Add slice Sascha Hauer
2020-05-20  9:43 ` [PATCH 10/19] usb: Add a slice to usb host controllers Sascha Hauer
2020-05-20  9:43 ` [PATCH 11/19] usbnet: Add slice Sascha Hauer
2020-05-20  9:43 ` [PATCH 12/19] net: Call net_poll() in a poller Sascha Hauer
2020-05-20  9:43 ` [PATCH 13/19] net: reply to ping requests Sascha Hauer
2020-05-20  9:43 ` [PATCH 14/19] usbnet: Be more friendly in the receive path Sascha Hauer
2020-05-20  9:43 ` [PATCH 15/19] poller: Allow to run pollers inside of pollers Sascha Hauer
2020-05-20  9:44 ` [PATCH 16/19] defconfigs: update renamed fastboot options Sascha Hauer
2020-05-20  9:44 ` [PATCH 17/19] fastboot: rename usbgadget.fastboot_* variables to fastboot.* Sascha Hauer
2020-05-20  9:44 ` [PATCH 18/19] fastboot net: implement fastboot over UDP Sascha Hauer
2020-05-20  9:44 ` [PATCH 19/19] fastboot net: remove may_send Sascha Hauer

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200520094403.12651-8-s.hauer@pengutronix.de \
    --to=s.hauer@pengutronix.de \
    --cc=barebox@lists.infradead.org \
    --cc=dg@emlix.com \
    --cc=eh@emlix.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox