From: "Daniel Glöckner" <dg@emlix.com>
To: Barebox List <barebox@lists.infradead.org>
Cc: "Daniel Glöckner" <dg@emlix.com>
Subject: [PATCH v3 02/14] Introduce idle slice
Date: Mon, 15 Jun 2020 19:20:35 +0200 [thread overview]
Message-ID: <af6e2213e7d0e6fe62108b118dba8e7c3a985342.1592241105.git.dg@emlix.com> (raw)
In-Reply-To: <cover.1592241105.git.dg@emlix.com>
In-Reply-To: <cover.1592241105.git.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/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 c24b2c7cd..61424d98e 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 d2fdb631b..a57e69350 100644
--- a/common/ratp/ratp.c
+++ b/common/ratp/ratp.c
@@ -315,10 +315,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;
@@ -385,6 +388,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 085d67604..b64b822ec 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 511675ed5..aecb045f4 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 a4f28c642..b710f99bf 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 5538fc434..37d5350eb 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 3d16c1838..e5370f9c7 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.17.1
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
next prev parent reply other threads:[~2020-06-15 17:21 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-06-15 17:20 [PATCH v3 00/14] Slices and fastboot over UDP Daniel Glöckner
2020-06-15 17:20 ` [PATCH v3 01/14] Introduce slices Daniel Glöckner
2020-06-15 17:20 ` Daniel Glöckner [this message]
2020-06-15 17:20 ` [PATCH v3 03/14] net: Add a slice to struct eth_device Daniel Glöckner
2020-06-15 17:20 ` [PATCH v3 04/14] net: mdiobus: Add slice Daniel Glöckner
2020-06-15 17:20 ` [PATCH v3 05/14] usb: Add a slice to usb host controllers Daniel Glöckner
2020-06-15 17:20 ` [PATCH v3 06/14] usbnet: Add slice Daniel Glöckner
2020-06-15 17:20 ` [PATCH v3 07/14] net: Call net_poll() in a poller Daniel Glöckner
2020-06-15 17:20 ` [PATCH v3 08/14] net: reply to ping requests Daniel Glöckner
2020-06-15 17:20 ` [PATCH v3 09/14] usbnet: Be more friendly in the receive path Daniel Glöckner
2020-06-15 17:20 ` [PATCH v3 10/14] poller: Allow to run pollers inside of pollers Daniel Glöckner
2020-06-17 7:00 ` Sascha Hauer
2020-06-15 17:20 ` [PATCH v3 11/14] defconfigs: update renamed fastboot options Daniel Glöckner
2020-06-15 17:20 ` [PATCH v3 12/14] globalvar: Add helper for deprecated variable names Daniel Glöckner
2020-06-15 17:20 ` [PATCH v3 13/14] fastboot: rename usbgadget.fastboot_* variables to fastboot.* Daniel Glöckner
2020-06-15 17:20 ` [PATCH v3 14/14] fastboot net: implement fastboot over UDP Daniel Glöckner
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=af6e2213e7d0e6fe62108b118dba8e7c3a985342.1592241105.git.dg@emlix.com \
--to=dg@emlix.com \
--cc=barebox@lists.infradead.org \
/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