[flashrom] [PATCH] Reduce realloc syscall overhead for ft2232 and bitbang

Paul Fox pgf at foxharp.boston.ma.us
Wed Nov 25 16:31:30 CET 2009


carl-daniel wrote:
 > Reduce realloc syscall overhead for FT2232 and bitbang.
 > 
 > FT2232 ran realloc() for every executed command. Start with a big enough
 > buffer and don't touch buffer size unless it needs to grow.
 > Bitbang was slightly better: It only ran realloc() if buffer size
 > changed. Still, the solution above improves performance and reliability.

this is fine, but i'm curious -- did you measure a performance
change, or is this "by inspection"?  it's never been my
impression that historically realloc would be slow, unless the
buffer is growing -- in which case there's no choice.  and my perhaps
mistaken assumption was that realloc() would usually not shrink a
buffer.

paul

 > 
 > Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006 at gmx.net>
 > 
 > Index: flashrom-realloc_overhead/bitbang_spi.c
 > ===================================================================
 > --- flashrom-realloc_overhead/bitbang_spi.c	(Revision 777)
 > +++ flashrom-realloc_overhead/bitbang_spi.c	(Arbeitskopie)
 > @@ -87,14 +87,16 @@
 >  	static unsigned char *bufout = NULL;
 >  	static unsigned char *bufin = NULL;
 >  	static int oldbufsize = 0;
 > -	int bufsize = max(writecnt + readcnt, 260);
 > +	int bufsize;
 >  	int i;
 >  
 >  	/* Arbitrary size limitation here. We're only constrained by memory. */
 >  	if (writecnt > 65536 || readcnt > 65536)
 >  		return SPI_INVALID_LENGTH;
 >  
 > -	if (bufsize != oldbufsize) {
 > +	bufsize = max(writecnt + readcnt, 260);
 > +	/* Never shrink. realloc() calls are expensive. */
 > +	if (bufsize > oldbufsize) {
 >  		bufout = realloc(bufout, bufsize);
 >  		if (!bufout) {
 >  			fprintf(stderr, "Out of memory!\n");
 > @@ -109,6 +111,7 @@
 >  				free(bufout);
 >  			exit(1);
 >  		}
 > +		oldbufsize = bufsize;
 >  	}
 >  		
 >  	memcpy(bufout, writearr, writecnt);
 > Index: flashrom-realloc_overhead/ft2232_spi.c
 > ===================================================================
 > --- flashrom-realloc_overhead/ft2232_spi.c	(Revision 777)
 > +++ flashrom-realloc_overhead/ft2232_spi.c	(Arbeitskopie)
 > @@ -200,14 +200,22 @@
 >  	static unsigned char *buf = NULL;
 >  	/* failed is special. We use bitwise ops, but it is essentially bool. */
 >  	int i = 0, ret = 0, failed = 0;
 > +	int bufsize;
 > +	static int oldbufsize = 0;
 >  
 >  	if (writecnt > 65536 || readcnt > 65536)
 >  		return SPI_INVALID_LENGTH;
 >  
 > -	buf = realloc(buf, writecnt + readcnt + 100);
 > -	if (!buf) {
 > -		fprintf(stderr, "Out of memory!\n");
 > -		exit(1); // -1
 > +	/* buf is not used for the response from the chip. */
 > +	bufsize = max(writecnt + 9, 260);
 > +	/* Never shrink. realloc() calls are expensive. */
 > +	if (bufsize > oldbufsize) {
 > +		buf = realloc(buf, bufsize);
 > +		if (!buf) {
 > +			fprintf(stderr, "Out of memory!\n");
 > +			exit(1);
 > +		}
 > +		oldbufsize = bufsize;
 >  	}
 >  
 >  	/*
 > 
 > 
 > -- 
 > Developer quote of the month: 
 > "We are juggling too many chainsaws and flaming arrows and tigers."

=---------------------
 paul fox, pgf at foxharp.boston.ma.us (arlington, ma, where it's 47.1 degrees)




More information about the flashrom mailing list