1
0
mirror of https://review.coreboot.org/flashrom.git synced 2025-04-28 07:23:43 +02:00

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.

Corresponding to flashrom svn r780.

Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>
Acked-by: Sean Nelson <audiohacked@gmail.com>
This commit is contained in:
Carl-Daniel Hailfinger 2009-11-25 16:58:17 +00:00
parent 2925d6f11d
commit b7e01457d1
2 changed files with 17 additions and 6 deletions

View File

@ -87,14 +87,16 @@ int bitbang_spi_send_command(unsigned int writecnt, unsigned int readcnt,
static unsigned char *bufout = NULL; static unsigned char *bufout = NULL;
static unsigned char *bufin = NULL; static unsigned char *bufin = NULL;
static int oldbufsize = 0; static int oldbufsize = 0;
int bufsize = max(writecnt + readcnt, 260); int bufsize;
int i; int i;
/* Arbitrary size limitation here. We're only constrained by memory. */ /* Arbitrary size limitation here. We're only constrained by memory. */
if (writecnt > 65536 || readcnt > 65536) if (writecnt > 65536 || readcnt > 65536)
return SPI_INVALID_LENGTH; 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); bufout = realloc(bufout, bufsize);
if (!bufout) { if (!bufout) {
fprintf(stderr, "Out of memory!\n"); fprintf(stderr, "Out of memory!\n");
@ -109,6 +111,7 @@ int bitbang_spi_send_command(unsigned int writecnt, unsigned int readcnt,
free(bufout); free(bufout);
exit(1); exit(1);
} }
oldbufsize = bufsize;
} }
memcpy(bufout, writearr, writecnt); memcpy(bufout, writearr, writecnt);

View File

@ -200,14 +200,22 @@ int ft2232_spi_send_command(unsigned int writecnt, unsigned int readcnt,
static unsigned char *buf = NULL; static unsigned char *buf = NULL;
/* failed is special. We use bitwise ops, but it is essentially bool. */ /* failed is special. We use bitwise ops, but it is essentially bool. */
int i = 0, ret = 0, failed = 0; int i = 0, ret = 0, failed = 0;
int bufsize;
static int oldbufsize = 0;
if (writecnt > 65536 || readcnt > 65536) if (writecnt > 65536 || readcnt > 65536)
return SPI_INVALID_LENGTH; return SPI_INVALID_LENGTH;
buf = realloc(buf, writecnt + readcnt + 100); /* buf is not used for the response from the chip. */
bufsize = max(writecnt + 9, 260 + 9);
/* Never shrink. realloc() calls are expensive. */
if (bufsize > oldbufsize) {
buf = realloc(buf, bufsize);
if (!buf) { if (!buf) {
fprintf(stderr, "Out of memory!\n"); fprintf(stderr, "Out of memory!\n");
exit(1); // -1 exit(1);
}
oldbufsize = bufsize;
} }
/* /*