From: Lars Schmidt <l.schmidt@pengutronix.de>
To: barebox@lists.infradead.org
Cc: Lars Schmidt <l.schmidt@pengutronix.de>
Subject: [PATCH 1/4] bootchooser: implement locking of boot slots
Date: Fri, 13 Jun 2025 16:08:02 +0200 [thread overview]
Message-ID: <20250613140805.1229525-2-l.schmidt@pengutronix.de> (raw)
In-Reply-To: <20250613140805.1229525-1-l.schmidt@pengutronix.de>
This this new global slot lock inhibits the remaining attempts counter
from decreasing.
There are ways around this, but both come with a disadvantage:
- If we mark the old slot as bad after a good update, we lose the
distinction between old slots that are unbootable and ones that
are bootable. Maintaining this distinction allows a health monitor
to explicitly boot an old slot while preventing the bootloader
from doing it automatically
- If we set the maximum attempts to a very high number, we keep
writing the storage every boot, even if we don't do
In both cases, by not decreasing and increasing the remaining attempts
counter constantly the number of write cycles is also lowered.
Signed-off-by: Lars Schmidt <l.schmidt@pengutronix.de>
---
common/bootchooser.c | 27 ++++++++++++++++++++++-----
1 file changed, 22 insertions(+), 5 deletions(-)
diff --git a/common/bootchooser.c b/common/bootchooser.c
index 58032a2b57..a50f757791 100644
--- a/common/bootchooser.c
+++ b/common/bootchooser.c
@@ -49,6 +49,7 @@ struct bootchooser {
struct state *state;
char *state_prefix;
int refs;
+ bool slots_locked;
int verbose;
int dryrun;
@@ -353,6 +354,7 @@ struct bootchooser *bootchooser_get(void)
int ret = -EINVAL, id = 1;
uint32_t last_chosen;
static int attempts_resetted;
+ uint32_t locked;
if (bootchooser) {
bootchooser->refs++;
@@ -397,6 +399,18 @@ struct bootchooser *bootchooser_get(void)
pr_warn("using non-redundant NV instead of barebox-state\n");
}
+ ret = getenv_u32(bc->state_prefix, "slots_locked", &locked);
+ if (!ret) {
+ bc->slots_locked = locked ? true : false;
+ if (bc->slots_locked)
+ pr_debug("Global slots locking is enabled\n");
+ } else {
+ /* this is an optional value, so if it doesn't exist,
+ * we assume it's not locked
+ */
+ bc->slots_locked = false;
+ }
+
INIT_LIST_HEAD(&bc->targets);
freep = targets = xstrdup(available_targets);
@@ -650,11 +664,14 @@ static struct bootchooser_target *bootchooser_get_target(struct bootchooser *bc)
return ERR_PTR(-ENOENT);
found:
- target->remaining_attempts--;
-
- if (bc->verbose)
- pr_info("name=%s decrementing remaining_attempts to %d\n",
- target->name, target->remaining_attempts);
+ if (!bc->slots_locked) {
+ target->remaining_attempts--;
+ if (bc->verbose)
+ pr_info("name=%s remaining_attempts %d\n", target->name,
+ target->remaining_attempts);
+ } else {
+ pr_info("Slots locking is enabled, not decreasing remaining_attempts\n");
+ }
if (bc->verbose)
pr_info("selected target '%s', boot '%s'\n", target->name, target->boot);
--
2.39.5
next prev parent reply other threads:[~2025-06-13 15:21 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-06-13 14:08 [PATCH 0/4] Add boot slot locking to bootchooser Lars Schmidt
2025-06-13 14:08 ` Lars Schmidt [this message]
2025-06-16 10:44 ` [PATCH 1/4] bootchooser: implement locking of boot slots Ahmad Fatoum
2025-06-13 14:08 ` [PATCH 2/4] bootchooser: extend cmd tool by option to set slot locking Lars Schmidt
2025-06-16 10:49 ` Ahmad Fatoum
2025-06-13 14:08 ` [PATCH 3/4] Documentation: bootchooser: add information about slots_locked Lars Schmidt
2025-06-16 10:50 ` Ahmad Fatoum
2025-06-13 14:08 ` [PATCH 4/4] Documentation: migration-2025.07.0: " Lars Schmidt
2025-06-16 10:51 ` Ahmad Fatoum
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=20250613140805.1229525-2-l.schmidt@pengutronix.de \
--to=l.schmidt@pengutronix.de \
--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