mail archive of the barebox mailing list
 help / color / mirror / Atom feed
From: Marco Felsch <m.felsch@pengutronix.de>
To: Sascha Hauer <s.hauer@pengutronix.de>,
	 BAREBOX <barebox@lists.infradead.org>
Cc: Marco Felsch <m.felsch@pengutronix.de>
Subject: [PATCH v3 10/10] FIT: add support to cache opened fit images
Date: Wed, 03 Jul 2024 18:58:38 +0200	[thread overview]
Message-ID: <20240703-v2024-05-0-topic-fit-overlay-v3-10-c1fd766fd31d@pengutronix.de> (raw)
In-Reply-To: <20240703-v2024-05-0-topic-fit-overlay-v3-0-c1fd766fd31d@pengutronix.de>

Cache the FIT image fit_open() calls to avoid loading the same FIT image
twice. This is very useful if the same FIT image is used to provide the
base devicetree, kernel and initrd as well as devicetree overlays.

Signed-off-by: Marco Felsch <m.felsch@pengutronix.de>
---
 common/image-fit.c  | 32 ++++++++++++++++++++++++++++++++
 include/image-fit.h |  4 ++++
 2 files changed, 36 insertions(+)

diff --git a/common/image-fit.c b/common/image-fit.c
index 4839d8dd33a4..a75bb79d1761 100644
--- a/common/image-fit.c
+++ b/common/image-fit.c
@@ -16,6 +16,7 @@
 #include <fs.h>
 #include <malloc.h>
 #include <linux/ctype.h>
+#include <linux/refcount.h>
 #include <asm/byteorder.h>
 #include <errno.h>
 #include <linux/err.h>
@@ -32,6 +33,8 @@
 #define CHECK_LEVEL_SIG 2
 #define CHECK_LEVEL_MAX 3
 
+static LIST_HEAD(open_fits);
+
 static uint32_t dt_struct_advance(struct fdt_header *f, uint32_t dt, int size)
 {
 	dt += size;
@@ -847,6 +850,18 @@ void *fit_open_configuration(struct fit_handle *handle, const char *name,
 	return conf_node;
 }
 
+static struct fit_handle *fit_get_handle(const char *filename)
+{
+	struct fit_handle *handle;
+
+	list_for_each_entry(handle, &open_fits, entry) {
+		if (!strcmp(filename, handle->filename))
+			return handle;
+	}
+
+	return NULL;
+}
+
 static int fit_do_open(struct fit_handle *handle)
 {
 	const char *desc = "(no description)";
@@ -896,6 +911,8 @@ struct fit_handle *fit_open_buf(const void *buf, size_t size, bool verbose,
 	handle->size = size;
 	handle->verify = verify;
 
+	refcount_set(&handle->users, 1);
+
 	ret = fit_do_open(handle);
 	if (ret) {
 		fit_close(handle);
@@ -923,6 +940,12 @@ struct fit_handle *fit_open(const char *filename, bool verbose,
 	struct fit_handle *handle;
 	int ret;
 
+	handle = fit_get_handle(filename);
+	if (handle) {
+		refcount_inc(&handle->users);
+		return handle;
+	}
+
 	handle = xzalloc(sizeof(struct fit_handle));
 
 	handle->verbose = verbose;
@@ -939,6 +962,9 @@ struct fit_handle *fit_open(const char *filename, bool verbose,
 	handle->fit = handle->fit_alloc;
 	handle->filename = xstrdup(filename);
 
+	refcount_set(&handle->users, 1);
+	list_add(&handle->entry, &open_fits);
+
 	ret = fit_do_open(handle);
 	if (ret) {
 		fit_close(handle);
@@ -950,9 +976,15 @@ struct fit_handle *fit_open(const char *filename, bool verbose,
 
 void fit_close(struct fit_handle *handle)
 {
+	if (!refcount_dec_and_test(&handle->users))
+		return;
+
 	if (handle->root)
 		of_delete_node(handle->root);
 
+	if (handle->filename)
+		list_del(&handle->entry);
+
 	free(handle->filename);
 	free(handle->fit_alloc);
 	free(handle);
diff --git a/include/image-fit.h b/include/image-fit.h
index 68f70f4365cb..f9791ff251c5 100644
--- a/include/image-fit.h
+++ b/include/image-fit.h
@@ -7,6 +7,7 @@
 #define __IMAGE_FIT_H__
 
 #include <linux/types.h>
+#include <linux/refcount.h>
 #include <bootm.h>
 
 struct fit_handle {
@@ -15,6 +16,9 @@ struct fit_handle {
 	size_t size;
 	char *filename;
 
+	struct list_head entry;
+	refcount_t users;
+
 	bool verbose;
 	enum bootm_verify verify;
 

-- 
2.39.2




  parent reply	other threads:[~2024-07-03 16:59 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-07-03 16:58 [PATCH v3 00/10] Add FIT image overlay support Marco Felsch
2024-07-03 16:58 ` [PATCH v3 01/10] FIT: fix missing free in fit_open error path Marco Felsch
2024-07-03 18:30   ` Ahmad Fatoum
2024-07-03 16:58 ` [PATCH v3 02/10] FIT: fit_open_configuration: add match function support Marco Felsch
2024-07-03 16:58 ` [PATCH v3 03/10] of: overlay: make the pattern match function more generic Marco Felsch
2024-07-15  9:46   ` Sascha Hauer
2024-07-03 16:58 ` [PATCH v3 04/10] of: overlay: make search dir/path " Marco Felsch
2024-07-15  9:48   ` Sascha Hauer
2024-07-03 16:58 ` [PATCH v3 05/10] FIT: expose useful helpers Marco Felsch
2024-07-03 16:58 ` [PATCH v3 06/10] of: overlay: add FIT overlay support Marco Felsch
2024-07-15 10:18   ` Sascha Hauer
2024-07-15 11:30     ` Marco Felsch
2024-07-15 11:56       ` Sascha Hauer
2024-07-03 16:58 ` [PATCH v3 07/10] of: overlay: drop unnecessary empty check in of_overlay_global_fixup_dir Marco Felsch
2024-07-03 16:58 ` [PATCH v3 08/10] of: overlay: replace filename with an more unique name Marco Felsch
2024-07-03 16:58 ` [PATCH v3 09/10] FIT: save filename during fit_open Marco Felsch
2024-07-03 16:58 ` Marco Felsch [this message]
2024-07-03 18:46   ` [PATCH v3 10/10] FIT: add support to cache opened fit images Ahmad Fatoum
2024-07-04  8:57     ` Marco Felsch

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=20240703-v2024-05-0-topic-fit-overlay-v3-10-c1fd766fd31d@pengutronix.de \
    --to=m.felsch@pengutronix.de \
    --cc=barebox@lists.infradead.org \
    --cc=s.hauer@pengutronix.de \
    /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