All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCH v5] u-boot: remove driver lookup loop from env_save()
@ 2018-07-23  8:01 Nicholas Faustini
  2018-07-26  5:16 ` Simon Goldschmidt
  2018-07-30 20:01 ` [U-Boot] [U-Boot, " Tom Rini
  0 siblings, 2 replies; 7+ messages in thread
From: Nicholas Faustini @ 2018-07-23  8:01 UTC (permalink / raw)
  To: u-boot

When called with ENVOP_SAVE, env_get_location() only returns the
gd->env_load_location variable without actually checking for
the environment location and priority.

This behaviour causes env_save() to fall into an infinite loop when
the low-level drv->save() call fails.

The env_save() function should not loop through the environment
location list but it should save the environment into the location
stored in gd->env_load_location by the last env_load() call.

Signed-off-by: Nicholas Faustini <nicholas.faustini@azcomtech.com>
Reviewed-by: Simon Goldschmidt <sgoldschmidt@de.pepperl-fuchs.com>

---

Changes in v5:
- Correction to 'Reviewed-by' tag

Changes in v4:
- Remove env_load_location from gd_t since it is not used anymore

Changes in v3:
- Add comment when env_load() fails and the env location is restored
- Introduce env_load_prio into gd struct. It stores the current
  priority of the environment location. Refactor of env_get_location()
  which acts the same on all the 'env_operation'

Changes in v2:
- Restore gd->env_load_location to the highest priority location when
  env_load() fails

 env/env.c                         | 34 ++++++++++++++++------------------
 include/asm-generic/global_data.h |  2 +-
 2 files changed, 17 insertions(+), 19 deletions(-)

diff --git a/env/env.c b/env/env.c
index 5c0842a..e033b46 100644
--- a/env/env.c
+++ b/env/env.c
@@ -119,21 +119,12 @@ static void env_set_inited(enum env_location location)
  */
 __weak enum env_location env_get_location(enum env_operation op, int prio)
 {
-	switch (op) {
-	case ENVOP_GET_CHAR:
-	case ENVOP_INIT:
-	case ENVOP_LOAD:
-		if (prio >= ARRAY_SIZE(env_locations))
-			return ENVL_UNKNOWN;
-
-		gd->env_load_location = env_locations[prio];
-		return gd->env_load_location;
-
-	case ENVOP_SAVE:
-		return gd->env_load_location;
-	}
+	if (prio >= ARRAY_SIZE(env_locations))
+		return ENVL_UNKNOWN;
+
+	gd->env_load_prio = prio;
 
-	return ENVL_UNKNOWN;
+	return env_locations[prio];
 }
 
 
@@ -205,22 +196,29 @@ int env_load(void)
 			return 0;
 	}
 
+	/*
+	 * In case of invalid environment, we set the 'default' env location
+	 * to the highest priority. In this way, next calls to env_save()
+	 * will restore the environment at the right place.
+	 */
+	env_get_location(ENVOP_LOAD, 0);
+
 	return -ENODEV;
 }
 
 int env_save(void)
 {
 	struct env_driver *drv;
-	int prio;
 
-	for (prio = 0; (drv = env_driver_lookup(ENVOP_SAVE, prio)); prio++) {
+	drv = env_driver_lookup(ENVOP_SAVE, gd->env_load_prio);
+	if (drv) {
 		int ret;
 
 		if (!drv->save)
-			continue;
+			return -ENODEV;
 
 		if (!env_has_inited(drv->location))
-			continue;
+			return -ENODEV;
 
 		printf("Saving Environment to %s... ", drv->name);
 		ret = drv->save();
diff --git a/include/asm-generic/global_data.h b/include/asm-generic/global_data.h
index 0fd4900..c83fc01 100644
--- a/include/asm-generic/global_data.h
+++ b/include/asm-generic/global_data.h
@@ -50,7 +50,7 @@ typedef struct global_data {
 	unsigned long env_addr;		/* Address  of Environment struct */
 	unsigned long env_valid;	/* Environment valid? enum env_valid */
 	unsigned long env_has_init;	/* Bitmask of boolean of struct env_location offsets */
-	int env_load_location;
+	int env_load_prio;		/* Priority of the loaded environment */
 
 	unsigned long ram_base;		/* Base address of RAM used by U-Boot */
 	unsigned long ram_top;		/* Top address of RAM used by U-Boot */
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [U-Boot] [PATCH v5] u-boot: remove driver lookup loop from env_save()
  2018-07-23  8:01 [U-Boot] [PATCH v5] u-boot: remove driver lookup loop from env_save() Nicholas Faustini
@ 2018-07-26  5:16 ` Simon Goldschmidt
  2018-07-26 14:02   ` Maxime Ripard
  2018-07-30 20:01 ` [U-Boot] [U-Boot, " Tom Rini
  1 sibling, 1 reply; 7+ messages in thread
From: Simon Goldschmidt @ 2018-07-26  5:16 UTC (permalink / raw)
  To: u-boot

Simon, Maxime,

any input on this? Via which tree would this be pushed? Should we CC Tom?

It would be nice if 2018.09 had this bug fixed (endless loop in 
env_save() on error).

Thanks,
Simon

On 23.07.2018 10:01, Nicholas Faustini wrote:
> When called with ENVOP_SAVE, env_get_location() only returns the
> gd->env_load_location variable without actually checking for
> the environment location and priority.
> 
> This behaviour causes env_save() to fall into an infinite loop when
> the low-level drv->save() call fails.
> 
> The env_save() function should not loop through the environment
> location list but it should save the environment into the location
> stored in gd->env_load_location by the last env_load() call.
> 
> Signed-off-by: Nicholas Faustini <nicholas.faustini@azcomtech.com>
> Reviewed-by: Simon Goldschmidt <sgoldschmidt@de.pepperl-fuchs.com>
> 
> ---
> 
> Changes in v5:
> - Correction to 'Reviewed-by' tag
> 
> Changes in v4:
> - Remove env_load_location from gd_t since it is not used anymore
> 
> Changes in v3:
> - Add comment when env_load() fails and the env location is restored
> - Introduce env_load_prio into gd struct. It stores the current
>    priority of the environment location. Refactor of env_get_location()
>    which acts the same on all the 'env_operation'
> 
> Changes in v2:
> - Restore gd->env_load_location to the highest priority location when
>    env_load() fails
> 
>   env/env.c                         | 34 ++++++++++++++++------------------
>   include/asm-generic/global_data.h |  2 +-
>   2 files changed, 17 insertions(+), 19 deletions(-)
> 
> diff --git a/env/env.c b/env/env.c
> index 5c0842a..e033b46 100644
> --- a/env/env.c
> +++ b/env/env.c
> @@ -119,21 +119,12 @@ static void env_set_inited(enum env_location location)
>    */
>   __weak enum env_location env_get_location(enum env_operation op, int prio)
>   {
> -	switch (op) {
> -	case ENVOP_GET_CHAR:
> -	case ENVOP_INIT:
> -	case ENVOP_LOAD:
> -		if (prio >= ARRAY_SIZE(env_locations))
> -			return ENVL_UNKNOWN;
> -
> -		gd->env_load_location = env_locations[prio];
> -		return gd->env_load_location;
> -
> -	case ENVOP_SAVE:
> -		return gd->env_load_location;
> -	}
> +	if (prio >= ARRAY_SIZE(env_locations))
> +		return ENVL_UNKNOWN;
> +
> +	gd->env_load_prio = prio;
>   
> -	return ENVL_UNKNOWN;
> +	return env_locations[prio];
>   }
>   
>   
> @@ -205,22 +196,29 @@ int env_load(void)
>   			return 0;
>   	}
>   
> +	/*
> +	 * In case of invalid environment, we set the 'default' env location
> +	 * to the highest priority. In this way, next calls to env_save()
> +	 * will restore the environment at the right place.
> +	 */
> +	env_get_location(ENVOP_LOAD, 0);
> +
>   	return -ENODEV;
>   }
>   
>   int env_save(void)
>   {
>   	struct env_driver *drv;
> -	int prio;
>   
> -	for (prio = 0; (drv = env_driver_lookup(ENVOP_SAVE, prio)); prio++) {
> +	drv = env_driver_lookup(ENVOP_SAVE, gd->env_load_prio);
> +	if (drv) {
>   		int ret;
>   
>   		if (!drv->save)
> -			continue;
> +			return -ENODEV;
>   
>   		if (!env_has_inited(drv->location))
> -			continue;
> +			return -ENODEV;
>   
>   		printf("Saving Environment to %s... ", drv->name);
>   		ret = drv->save();
> diff --git a/include/asm-generic/global_data.h b/include/asm-generic/global_data.h
> index 0fd4900..c83fc01 100644
> --- a/include/asm-generic/global_data.h
> +++ b/include/asm-generic/global_data.h
> @@ -50,7 +50,7 @@ typedef struct global_data {
>   	unsigned long env_addr;		/* Address  of Environment struct */
>   	unsigned long env_valid;	/* Environment valid? enum env_valid */
>   	unsigned long env_has_init;	/* Bitmask of boolean of struct env_location offsets */
> -	int env_load_location;
> +	int env_load_prio;		/* Priority of the loaded environment */
>   
>   	unsigned long ram_base;		/* Base address of RAM used by U-Boot */
>   	unsigned long ram_top;		/* Top address of RAM used by U-Boot */
> 

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [U-Boot] [PATCH v5] u-boot: remove driver lookup loop from env_save()
  2018-07-26  5:16 ` Simon Goldschmidt
@ 2018-07-26 14:02   ` Maxime Ripard
  2018-07-26 20:16     ` Goldschmidt Simon
  0 siblings, 1 reply; 7+ messages in thread
From: Maxime Ripard @ 2018-07-26 14:02 UTC (permalink / raw)
  To: u-boot

On Thu, Jul 26, 2018 at 07:16:36AM +0200, Simon Goldschmidt wrote:
> Simon, Maxime,
> 
> any input on this? Via which tree would this be pushed? Should we CC Tom?
> 
> It would be nice if 2018.09 had this bug fixed (endless loop in env_save()
> on error).

This looks good to me but Tom will probably end up this patch, so you
definitely want to cc him.

Maxime

-- 
Maxime Ripard, Bootlin (formerly Free Electrons)
Embedded Linux and Kernel engineering
https://bootlin.com
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20180726/ea393f09/attachment.sig>

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [U-Boot] [PATCH v5] u-boot: remove driver lookup loop from env_save()
  2018-07-26 14:02   ` Maxime Ripard
@ 2018-07-26 20:16     ` Goldschmidt Simon
  2018-07-27  0:29       ` Tom Rini
  0 siblings, 1 reply; 7+ messages in thread
From: Goldschmidt Simon @ 2018-07-26 20:16 UTC (permalink / raw)
  To: u-boot

+ Tom:

I don't know via which tree this would go in. I think you took the last 
env changes directly?

v1..v4 are detached threads, I can send you links if you need them.


Thanks,

Simon


On 26.07.2018 16:02, Maxime Ripard wrote:
> On Thu, Jul 26, 2018 at 07:16:36AM +0200, Simon Goldschmidt wrote:
>> Simon, Maxime,
>>
>> any input on this? Via which tree would this be pushed? Should we CC Tom?
>>
>> It would be nice if 2018.09 had this bug fixed (endless loop in env_save()
>> on error).
> This looks good to me but Tom will probably end up this patch, so you
> definitely want to cc him.
>
> Maxime
>

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [U-Boot] [PATCH v5] u-boot: remove driver lookup loop from env_save()
  2018-07-26 20:16     ` Goldschmidt Simon
@ 2018-07-27  0:29       ` Tom Rini
  2018-07-27  7:59         ` Nicholas
  0 siblings, 1 reply; 7+ messages in thread
From: Tom Rini @ 2018-07-27  0:29 UTC (permalink / raw)
  To: u-boot

On Thu, Jul 26, 2018 at 10:16:01PM +0200, Goldschmidt Simon wrote:

> + Tom:
> 
> I don't know via which tree this would go in. I think you took the last env
> changes directly?
> 
> v1..v4 are detached threads, I can send you links if you need them.

It's on my TODO list to pick up, thanks!

-- 
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20180726/2a336b51/attachment.sig>

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [U-Boot] [PATCH v5] u-boot: remove driver lookup loop from env_save()
  2018-07-27  0:29       ` Tom Rini
@ 2018-07-27  7:59         ` Nicholas
  0 siblings, 0 replies; 7+ messages in thread
From: Nicholas @ 2018-07-27  7:59 UTC (permalink / raw)
  To: u-boot

Hi Tom,

On gio, 2018-07-26 at 20:29 -0400, Tom Rini wrote:
> On Thu, Jul 26, 2018 at 10:16:01PM +0200, Goldschmidt Simon wrote:
> 
> > 
> > + Tom:
> > 
> > I don't know via which tree this would go in. I think you took the
> > last env
> > changes directly?
> > 
> > v1..v4 are detached threads, I can send you links if you need them.
> It's on my TODO list to pick up, thanks!
> 

Thanks. I apologize for the detached threads, I was not very familiar
with patman.

Here links of the other threads if needed:
v1: https://lists.denx.de/pipermail/u-boot/2018-July/334199.html
v2: https://lists.denx.de/pipermail/u-boot/2018-July/334445.html
v3: https://lists.denx.de/pipermail/u-boot/2018-July/334538.html
v4: https://lists.denx.de/pipermail/u-boot/2018-July/334589.html

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [U-Boot] [U-Boot, v5] u-boot: remove driver lookup loop from env_save()
  2018-07-23  8:01 [U-Boot] [PATCH v5] u-boot: remove driver lookup loop from env_save() Nicholas Faustini
  2018-07-26  5:16 ` Simon Goldschmidt
@ 2018-07-30 20:01 ` Tom Rini
  1 sibling, 0 replies; 7+ messages in thread
From: Tom Rini @ 2018-07-30 20:01 UTC (permalink / raw)
  To: u-boot

On Mon, Jul 23, 2018 at 10:01:07AM +0200, Nicholas Faustini wrote:

> When called with ENVOP_SAVE, env_get_location() only returns the
> gd->env_load_location variable without actually checking for
> the environment location and priority.
> 
> This behaviour causes env_save() to fall into an infinite loop when
> the low-level drv->save() call fails.
> 
> The env_save() function should not loop through the environment
> location list but it should save the environment into the location
> stored in gd->env_load_location by the last env_load() call.
> 
> Signed-off-by: Nicholas Faustini <nicholas.faustini@azcomtech.com>
> Reviewed-by: Simon Goldschmidt <sgoldschmidt@de.pepperl-fuchs.com>

Applied to u-boot/master, thanks!

-- 
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20180730/73340dad/attachment.sig>

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2018-07-30 20:01 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-07-23  8:01 [U-Boot] [PATCH v5] u-boot: remove driver lookup loop from env_save() Nicholas Faustini
2018-07-26  5:16 ` Simon Goldschmidt
2018-07-26 14:02   ` Maxime Ripard
2018-07-26 20:16     ` Goldschmidt Simon
2018-07-27  0:29       ` Tom Rini
2018-07-27  7:59         ` Nicholas
2018-07-30 20:01 ` [U-Boot] [U-Boot, " Tom Rini

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.