[PATCH] MTD performance issues on XIP configuration.

Nicolas Pitre nico at cam.org
Tue Jun 27 11:30:26 EDT 2006


On Tue, 27 Jun 2006, Alexey Korolev wrote:

> On Tue, 27 Jun 2006, David Woodhouse wrote:
> > 
> > Code looks fine but please could you resubmit with an appropriate
> > Signed-off-by: line?
> 
> Oh sory I forget about this here is this patch again:
> 
> Signed-off-by: Alexey, Korolev <akorolev at infradead.org>

What is this patch doing?

Why are you completely pulling out the adaptative delay logic?

Unless there is sufficient explanation for this patch you have a NAK 
from me.


> diff -aur a/drivers/mtd/chips/cfi_cmdset_0001.c c/drivers/mtd/chips/cfi_cmdset_0001.c
> --- a/drivers/mtd/chips/cfi_cmdset_0001.c	2006-06-26 19:13:15.000000000 +0400
> +++ c/drivers/mtd/chips/cfi_cmdset_0001.c	2006-06-26 13:27:21.000000000 +0400
> @@ -908,7 +908,7 @@
>  
>  static int __xipram xip_wait_for_operation(
>  		struct map_info *map, struct flchip *chip,
> -		unsigned long adr, int *chip_op_time )
> +		unsigned long adr, int chip_op_time )
>  {
>  	struct cfi_private *cfi = map->fldrv_priv;
>  	struct cfi_pri_intelext *cfip = cfi->cmdset_priv;
> @@ -917,7 +917,7 @@
>  	flstate_t oldstate, newstate;
>  
>         	start = xip_currtime();
> -	usec = *chip_op_time * 8;
> +	usec = chip_op_time * 8;
>  	if (usec == 0)
>  		usec = 500000;
>  	done = 0;
> @@ -1001,7 +1001,7 @@
>  			map_write(map, CMD(0x70), adr);
>  			chip->state = oldstate;
>  			start = xip_currtime();
> -		} else if (usec >= 1000000/HZ) {
> +		} else if (chip_op_time >= 1000000/HZ) {
>  			/*
>  			 * Try to save on CPU power when waiting delay
>  			 * is at least a system timer tick period.
> @@ -1027,8 +1027,8 @@
>  #define XIP_INVAL_CACHED_RANGE(map, from, size)  \
>  	INVALIDATE_CACHED_RANGE(map, from, size)
>  
> -#define INVAL_CACHE_AND_WAIT(map, chip, cmd_adr, inval_adr, inval_len, p_usec) \
> -	xip_wait_for_operation(map, chip, cmd_adr, p_usec)
> +#define INVAL_CACHE_AND_WAIT(map, chip, cmd_adr, inval_adr, inval_len, usec) \
> +	xip_wait_for_operation(map, chip, cmd_adr, usec)
>  
>  #else
>  
> @@ -1040,26 +1040,24 @@
>  static int inval_cache_and_wait_for_operation(
>  		struct map_info *map, struct flchip *chip,
>  		unsigned long cmd_adr, unsigned long inval_adr, int inval_len,
> -		int *chip_op_time )
> +		int chip_op_time )
>  {
>  	struct cfi_private *cfi = map->fldrv_priv;
>  	map_word status, status_OK = CMD(0x80);
> -	int z, chip_state = chip->state;
> -	unsigned long timeo;
> -
> +	int chip_state = chip->state;
> +	unsigned long timeo, timer_resolution = 1000000/HZ;
> +	
>  	spin_unlock(chip->mutex);
>  	if (inval_len)
>  		INVALIDATE_CACHED_RANGE(map, inval_adr, inval_len);
> -	if (*chip_op_time)
> -		cfi_udelay(*chip_op_time);
> +	
> +	if ( chip_op_time / 2 > timer_resolution)
> +		cfi_udelay(chip_op_time / 2 );
> +		
>  	spin_lock(chip->mutex);
> +	
> +	timeo = jiffies + HZ/2 + chip_op_time * 8 / timer_resolution;
>  
> -	timeo = *chip_op_time * 8 * HZ / 1000000;
> -	if (timeo < HZ/2)
> -		timeo = HZ/2;
> -	timeo += jiffies;
> -
> -	z = 0;
>  	for (;;) {
>  		if (chip->state != chip_state) {
>  			/* Someone's suspended the operation: sleep */
> @@ -1070,7 +1068,7 @@
>  			spin_unlock(chip->mutex);
>  			schedule();
>  			remove_wait_queue(&chip->wq, &wait);
> -			timeo = jiffies + (HZ / 2); /* FIXME */
> +			timeo = jiffies + HZ/2 + chip_op_time * 8 / timer_resolution;
>  			spin_lock(chip->mutex);
>  			continue;
>  		}
> @@ -1087,18 +1085,14 @@
>  		}
>  
>  		/* Latency issues. Drop the lock, wait a while and retry */
> -		z++;
>  		spin_unlock(chip->mutex);
> -		cfi_udelay(1);
> +		if (chip_op_time / 2 < timer_resolution)
> +		    cfi_udelay(1);
> +    		else
> +		    cfi_udelay(timer_resolution);
>  		spin_lock(chip->mutex);
>  	}
>  
> -	if (!z) {
> -		if (!--(*chip_op_time))
> -			*chip_op_time = 1;
> -	} else if (z > 1)
> -		++(*chip_op_time);
> -
>  	/* Done and happy. */
>   	chip->state = FL_STATUS;
>  	return 0;
> @@ -1107,9 +1101,7 @@
>  #endif
>  
>  #define WAIT_TIMEOUT(map, chip, adr, udelay) \
> -	({ int __udelay = (udelay); \
> -	   INVAL_CACHE_AND_WAIT(map, chip, adr, 0, 0, &__udelay); })
> -
> +	INVAL_CACHE_AND_WAIT(map, chip, adr, 0, 0, udelay)
>  
>  static int do_point_onechip (struct map_info *map, struct flchip *chip, loff_t adr, size_t len)
>  {
> @@ -1332,7 +1324,7 @@
>  
>  	ret = INVAL_CACHE_AND_WAIT(map, chip, adr,
>  				   adr, map_bankwidth(map),
> -				   &chip->word_write_time);
> +				   chip->word_write_time);
>  	if (ret) {
>  		xip_enable(map, chip, adr);
>  		printk(KERN_ERR "%s: word write error (status timeout)\n", map->name);
> @@ -1569,7 +1561,7 @@
>  
>  	ret = INVAL_CACHE_AND_WAIT(map, chip, cmd_adr,
>  				   adr, len,
> -				   &chip->buffer_write_time);
> +				   chip->buffer_write_time);
>  	if (ret) {
>  		map_write(map, CMD(0x70), cmd_adr);
>  		chip->state = FL_STATUS;
> @@ -1704,7 +1696,7 @@
>  
>  	ret = INVAL_CACHE_AND_WAIT(map, chip, adr,
>  				   adr, len,
> -				   &chip->erase_time);
> +				   chip->erase_time);
>  	if (ret) {
>  		map_write(map, CMD(0x70), adr);
>  		chip->state = FL_STATUS;
>  
> 


Nicolas




More information about the linux-mtd mailing list