Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/lib/libsa Add an option (LIBSA_CREAD_NOCRC) to disable g...



details:   https://anonhg.NetBSD.org/src/rev/66638e0e5e24
branches:  trunk
changeset: 813123:66638e0e5e24
user:      tsutsui <tsutsui%NetBSD.org@localhost>
date:      Sun Jan 17 04:35:42 2016 +0000

description:
Add an option (LIBSA_CREAD_NOCRC) to disable gunzip CRC32 calculation.

No obvious sideeffect on booting i386 GENERIC kernels (without the option).
Closes PR/50638 (Extreme slowness on loading gzipped kernels on old CPUs).

diffstat:

 sys/lib/libsa/cread.c |  33 +++++++++++++++++++++++++++------
 1 files changed, 27 insertions(+), 6 deletions(-)

diffs (99 lines):

diff -r 38d2f56b4960 -r 66638e0e5e24 sys/lib/libsa/cread.c
--- a/sys/lib/libsa/cread.c     Sun Jan 17 03:08:39 2016 +0000
+++ b/sys/lib/libsa/cread.c     Sun Jan 17 04:35:42 2016 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: cread.c,v 1.27 2015/07/25 07:06:11 isaki Exp $ */
+/*     $NetBSD: cread.c,v 1.28 2016/01/17 04:35:42 tsutsui Exp $       */
 
 /*
  * Copyright (c) 1996
@@ -87,10 +87,9 @@
 void   zmemcpy(unsigned char *, unsigned char *, unsigned int);
 
 /*
- * The libkern version of this function uses an 8K set of tables.
  * This is the double-loop version of LE CRC32 from if_ethersubr,
- * lightly modified -- it is 200 bytes smaller than the version using
- * a 4-bit table and at least 8K smaller than the libkern version.
+ * lightly modified -- it is ~1KB smaller than libkern version with
+ * DYNAMIC_CRC_TABLE but too much slower especially on ancient poor CPUs.
  */
 #ifndef ETHER_CRC_POLY_LE
 #define ETHER_CRC_POLY_LE      0xedb88320
@@ -98,6 +97,10 @@
 uint32_t
 crc32(uint32_t crc, const uint8_t *const buf, size_t len)
 {
+#if defined(LIBSA_CREAD_NOCRC)
+       /* XXX provide a stub to avoid pulling a larger libkern version */
+       return crc;
+#else
        uint32_t c, carry;
        size_t i, j;
 
@@ -114,6 +117,7 @@
                }
        }
        return (crc ^ 0xffffffffU);
+#endif /* defined(LIBSA_CREAD_NOCRC) */
 }
 
 /*
@@ -317,7 +321,9 @@
 read(int fd, void *buf, size_t len)
 {
        struct sd *s;
+#if !defined(LIBSA_CREAD_NOCRC)
        unsigned char *start = buf; /* starting point for crc computation */
+#endif
 
        s = ss[fd];
 
@@ -373,13 +379,24 @@
                s->z_err = inflate(&(s->stream), Z_NO_FLUSH);
 
                if (s->z_err == Z_STREAM_END) {
+                       uint32_t total_out;
+#if !defined(LIBSA_CREAD_NOCRC)
+                       uint32_t crc;
                        /* Check CRC and original size */
                        s->crc = crc32(s->crc, start, (unsigned int)
                                        (s->stream.next_out - start));
                        start = s->stream.next_out;
+                       crc = getLong(s);
+#else
+                       (void)getLong(s);
+#endif
+                       total_out = getLong(s);
 
-                       if (getLong(s) != s->crc ||
-                           getLong(s) != s->stream.total_out) {
+                       if (
+#if !defined(LIBSA_CREAD_NOCRC)
+                           crc != s->crc ||
+#endif
+                           total_out != s->stream.total_out) {
 
                                s->z_err = Z_DATA_ERROR;
                        } else {
@@ -387,7 +404,9 @@
                                check_header(s);
                                if (s->z_err == Z_OK) {
                                        inflateReset(&(s->stream));
+#if !defined(LIBSA_CREAD_NOCRC)
                                        s->crc = crc32(0L, Z_NULL, 0);
+#endif
                                }
                        }
                }
@@ -395,8 +414,10 @@
                        break;
        }
 
+#if !defined(LIBSA_CREAD_NOCRC)
        s->crc = crc32(s->crc, start,
                       (unsigned int)(s->stream.next_out - start));
+#endif
 
        return (int)(len - s->stream.avail_out);
 }



Home | Main Index | Thread Index | Old Index