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:
parent
2925d6f11d
commit
b7e01457d1
@ -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);
|
||||||
|
12
ft2232_spi.c
12
ft2232_spi.c
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
x
Reference in New Issue
Block a user