[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