summaryrefslogtreecommitdiff
path: root/ft2232_spi.c
diff options
context:
space:
mode:
authorhailfinger <hailfinger@2b7e53f0-3cfb-0310-b3e9-8179ed1497e1>2009-11-25 16:58:17 +0000
committerhailfinger <hailfinger@2b7e53f0-3cfb-0310-b3e9-8179ed1497e1>2009-11-25 16:58:17 +0000
commit7514a58723a96fd1fa7b26e3a9d653d0f9e64840 (patch)
tree341176081702d03d5bfc3fc5eafbeea6618f5e0c /ft2232_spi.c
parent2e7db9459839e3604e6ad76f0e24fd3f1a402f7e (diff)
downloadflashrom-7514a58723a96fd1fa7b26e3a9d653d0f9e64840.tar.gz
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. Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net> Acked-by: Sean Nelson <audiohacked@gmail.com> git-svn-id: https://code.coreboot.org/svn/flashrom/trunk@780 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
Diffstat (limited to 'ft2232_spi.c')
-rw-r--r--ft2232_spi.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/ft2232_spi.c b/ft2232_spi.c
index aa00753..d565a6f 100644
--- a/ft2232_spi.c
+++ b/ft2232_spi.c
@@ -200,14 +200,22 @@ int ft2232_spi_send_command(unsigned int writecnt, unsigned int readcnt,
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 + 9);
+ /* 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;
}
/*