]> granicus.if.org Git - zfs/commitdiff
Add fix-stack-lzjb topic branch
authorBrian Behlendorf <behlendorf1@llnl.gov>
Mon, 14 Jun 2010 23:45:01 +0000 (16:45 -0700)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Mon, 14 Jun 2010 23:45:01 +0000 (16:45 -0700)
Reduce kernel stack usage by lzjb_compress() by moving uint16 array
off the stack and on to the heap.  The exact performance implications
of this I have not measured but we absolutely need to keep stack
usage to a minimum.  If/when this becomes and issue we optimize.

.topdeps [new file with mode: 0644]
.topmsg [new file with mode: 0644]
module/zfs/lzjb.c

diff --git a/.topdeps b/.topdeps
new file mode 100644 (file)
index 0000000..1f7391f
--- /dev/null
+++ b/.topdeps
@@ -0,0 +1 @@
+master
diff --git a/.topmsg b/.topmsg
new file mode 100644 (file)
index 0000000..4f1c8f2
--- /dev/null
+++ b/.topmsg
@@ -0,0 +1,9 @@
+From: Brian Behlendorf <behlendorf1@llnl.gov>
+Subject: [PATCH] fix stack lzjb
+
+Reduce kernel stack usage by lzjb_compress() by moving uint16 array
+off the stack and on to the heap.  The exact performance implications
+of this I have not measured but we absolutely need to keep stack
+usage to a minimum.  If/when this becomes and issue we optimize.
+
+Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
index 10952f472b333c8e2d208410bb4d6230c3a82e0a..1f2deb51a05850d8409fac42d156b9243e8c8a3a 100644 (file)
@@ -37,7 +37,7 @@
  * compress to d_len or less.
  */
 
-#include <sys/types.h>
+#include <sys/zfs_context.h>
 
 #define        MATCH_BITS      6
 #define        MATCH_MIN       3
@@ -55,12 +55,15 @@ lzjb_compress(void *s_start, void *d_start, size_t s_len, size_t d_len, int n)
        int copymask = 1 << (NBBY - 1);
        int mlen, offset, hash;
        uint16_t *hp;
-       uint16_t lempel[LEMPEL_SIZE] = { 0 };
+       uint16_t *lempel;
 
+       lempel = kmem_zalloc(LEMPEL_SIZE * sizeof (uint16_t), KM_SLEEP);
        while (src < (uchar_t *)s_start + s_len) {
                if ((copymask <<= 1) == (1 << NBBY)) {
-                       if (dst >= (uchar_t *)d_start + d_len - 1 - 2 * NBBY)
+                       if (dst >= (uchar_t *)d_start + d_len - 1 - 2 * NBBY) {
+                               kmem_free(lempel, LEMPEL_SIZE*sizeof(uint16_t));
                                return (s_len);
+                       }
                        copymask = 1;
                        copymap = dst;
                        *dst++ = 0;
@@ -90,6 +93,8 @@ lzjb_compress(void *s_start, void *d_start, size_t s_len, size_t d_len, int n)
                        *dst++ = *src++;
                }
        }
+
+       kmem_free(lempel, LEMPEL_SIZE * sizeof (uint16_t));
        return (dst - (uchar_t *)d_start);
 }