diff mbox

[U-Boot] common, env: optimize boottime

Message ID 1387457104-3048-1-git-send-email-hs@denx.de
State Accepted
Delegated to: Tom Rini
Headers show

Commit Message

Heiko Schocher Dec. 19, 2013, 12:45 p.m. UTC
when creating the hashtable, for each environmentvariable
getenv(ENV_CALLBACK_VAR) and getenv(ENV_FLAGS_VAR) is called,
which costs at this point a lot of time. So call this two
getenv() calls only once.

Boottime on the ids8313 board without this patch:

2013-12-19 13:38:22,894:  NAND:  128 MiB
2013-12-19 13:38:27,659:  In:    serial
(~4.8 sec)

Bootime with this patch on the ids8313 board:

2013-12-19 13:40:25,332:  NAND:  128 MiB
2013-12-19 13:40:25,546:  In:    serial
(~0.2 sec)

Signed-off-by: Heiko Schocher <hs@denx.de>
Cc: Tom Rini <trini@ti.com>
Cc: Joe Hershberger <joe.hershberger@ni.com>
Cc: Wolfgang Denk <wd@denx.de>
---
 common/env_callback.c | 9 ++++++++-
 common/env_flags.c    | 8 +++++++-
 2 files changed, 15 insertions(+), 2 deletions(-)

Comments

Tom Rini Jan. 14, 2014, 9:01 p.m. UTC | #1
On Thu, Dec 19, 2013 at 01:45:04PM +0100, Heiko Schocher wrote:

> when creating the hashtable, for each environmentvariable
> getenv(ENV_CALLBACK_VAR) and getenv(ENV_FLAGS_VAR) is called,
> which costs at this point a lot of time. So call this two
> getenv() calls only once.
> 
> Boottime on the ids8313 board without this patch:
> 
> 2013-12-19 13:38:22,894:  NAND:  128 MiB
> 2013-12-19 13:38:27,659:  In:    serial
> (~4.8 sec)
> 
> Bootime with this patch on the ids8313 board:
> 
> 2013-12-19 13:40:25,332:  NAND:  128 MiB
> 2013-12-19 13:40:25,546:  In:    serial
> (~0.2 sec)
> 
> Signed-off-by: Heiko Schocher <hs@denx.de>
> Cc: Tom Rini <trini@ti.com>
> Cc: Joe Hershberger <joe.hershberger@ni.com>
> Cc: Wolfgang Denk <wd@denx.de>

Applied to u-boot/master, thanks!
diff mbox

Patch

diff --git a/common/env_callback.c b/common/env_callback.c
index 34bb58e..d03fa03 100644
--- a/common/env_callback.c
+++ b/common/env_callback.c
@@ -35,6 +35,9 @@  static struct env_clbk_tbl *find_env_callback(const char *name)
 	return NULL;
 }
 
+static int first_call = 1;
+static const char *callback_list;
+
 /*
  * Look for a possible callback for a newly added variable
  * This is called specifically when the variable did not exist in the hash
@@ -43,11 +46,15 @@  static struct env_clbk_tbl *find_env_callback(const char *name)
 void env_callback_init(ENTRY *var_entry)
 {
 	const char *var_name = var_entry->key;
-	const char *callback_list = getenv(ENV_CALLBACK_VAR);
 	char callback_name[256] = "";
 	struct env_clbk_tbl *clbkp;
 	int ret = 1;
 
+	if (first_call) {
+		callback_list = getenv(ENV_CALLBACK_VAR);
+		first_call = 0;
+	}
+
 	/* look in the ".callbacks" var for a reference to this variable */
 	if (callback_list != NULL)
 		ret = env_attr_lookup(callback_list, var_name, callback_name);
diff --git a/common/env_flags.c b/common/env_flags.c
index e9b72e6..985f92e 100644
--- a/common/env_flags.c
+++ b/common/env_flags.c
@@ -395,6 +395,9 @@  static int env_parse_flags_to_bin(const char *flags)
 	return binflags;
 }
 
+static int first_call = 1;
+static const char *flags_list;
+
 /*
  * Look for possible flags for a newly added variable
  * This is called specifically when the variable did not exist in the hash
@@ -403,10 +406,13 @@  static int env_parse_flags_to_bin(const char *flags)
 void env_flags_init(ENTRY *var_entry)
 {
 	const char *var_name = var_entry->key;
-	const char *flags_list = getenv(ENV_FLAGS_VAR);
 	char flags[ENV_FLAGS_ATTR_MAX_LEN + 1] = "";
 	int ret = 1;
 
+	if (first_call) {
+		flags_list = getenv(ENV_FLAGS_VAR);
+		first_call = 0;
+	}
 	/* look in the ".flags" and static for a reference to this variable */
 	ret = env_flags_lookup(flags_list, var_name, flags);