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 <[email protected]> > > 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, [email protected] (arlington, ma, where it's 47.1 degrees) _______________________________________________ flashrom mailing list [email protected] http://www.flashrom.org/mailman/listinfo/flashrom
