[PATCH 3/3] OMAP clock/hwmod: fix off-by-one errors

Russell King - ARM Linux linux at arm.linux.org.uk
Mon Nov 16 09:08:30 EST 2009


On Mon, Nov 16, 2009 at 06:36:55AM -0700, Paul Walmsley wrote:
> Fix loop bailout off-by-one bugs reported by Juha Leppänen
> <juha_motorsportcom at luukku.com>.

I'm not sure the new code is any easier to read than the old code.
And what with some checks post-loop being <= and others being >, it's
a recipe for cut'n'paste errors happening.

> diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c
> index 633b216..a4a9518 100644
> --- a/arch/arm/mach-omap2/omap_hwmod.c
> +++ b/arch/arm/mach-omap2/omap_hwmod.c
> @@ -759,14 +759,12 @@ static int _reset(struct omap_hwmod *oh)
>  	_write_sysconfig(v, oh);
>  
>  	c = 0;
> -	while (c < MAX_MODULE_RESET_WAIT &&
> -	       !(omap_hwmod_readl(oh, oh->sysconfig->syss_offs) &
> -		 SYSS_RESETDONE_MASK)) {
> +	while (!(omap_hwmod_readl(oh, oh->sysconfig->syss_offs) &
> +		 SYSS_RESETDONE_MASK) &&
> +	       (c++ < MAX_MODULE_RESET_WAIT))
>  		udelay(1);
> -		c++;
> -	}
>  
> -	if (c == MAX_MODULE_RESET_WAIT)
> +	if (c > MAX_MODULE_RESET_WAIT)
>  		WARN(1, "omap_hwmod: %s: failed to reset in %d usec\n",
>  		     oh->name, MAX_MODULE_RESET_WAIT);
>  	else

How about:

	for (c = 0; c <= MAX_MODULE_RESET_WAIT; c++) {
		if (omap_hwmod_readl(oh, oh->sysconfig->syss_offs) &
		    SYSS_RESETDONE_MASK) {
			pr_debug("omap_hwmod: %s: reset in %d usec\n",
				oh->name, c);
			return 0;
		}
	}

	WARN(1, "omap_hwmod: %s: failed to reset in %d usec\n",
                     oh->name, c - 1);
	return -ETIMEDOUT;

?

Even better would be to turn this into a helper much like wait_event(),
which would stop silly mistakes happening.



More information about the linux-arm-kernel mailing list