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 <[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."


_______________________________________________
flashrom mailing list
[email protected]
http://www.flashrom.org/mailman/listinfo/flashrom

Reply via email to