Re: [PATCH 1/2] lib: Add lz4 compressor module

2013-04-25 Thread Chanho Min

>> gcc seems to define __builtin_clz as __clzsi2 in some architecture.
>> But, kernel doesn't link libgcc.a.
>> If kernel should use gcc's built-in function without libgcc.a,
>> do we need to port __clzsi2 to 'arch/*/lib/*'?
>
>This breaks alpha (gcc-4.4.4) as well.  Can we please get this fixed
>promptly?

__clzsi2 can be implemented by using generic functions.
It can be overridden by linking arch-specific versions may not be implemented.
does this way look acceptable?

diff --git a/lib/Makefile b/lib/Makefile
index af79e8c..e17b3ee 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -23,7 +23,7 @@ lib-y += kobject.o klist.o

 obj-y += bcd.o div64.o sort.o parser.o halfmd4.o debug_locks.o random32.o \
   bust_spinlocks.o hexdump.o kasprintf.o bitmap.o scatterlist.o \
-  gcd.o lcm.o list_sort.o uuid.o flex_array.o \
+  gcd.o lcm.o list_sort.o uuid.o flex_array.o clz.o\
   bsearch.o find_last_bit.o find_next_bit.o llist.o memweight.o kfifo.o
 obj-y += string_helpers.o
 obj-$(CONFIG_TEST_STRING_HELPERS) += test-string_helpers.o
diff --git a/lib/clz.c b/lib/clz.c
index e69de29..6794b83 100644
--- a/lib/clz.c
+++ b/lib/clz.c
@@ -0,0 +1,23 @@
+#include 
+
+int __attribute__((weak)) __clzsi2(int val)
+{
+ return BITS_PER_LONG - fls(val);
+}
+EXPORT_SYMBOL(__clzsi2);
+
+#if BITS_PER_LONG == 32
+int __attribute__((weak)) __clzdi2(long val)
+{
+ return BITS_PER_LONG - fls((int)val);
+}
+EXPORT_SYMBOL(__clzdi2);
+#elif BITS_PER_LONG == 64
+int __attribute__((weak)) __clzdi2(long val)
+{
+ return BITS_PER_LONG - fls64((u64)val);
+}
+EXPORT_SYMBOL(__clzdi2);
+#else
+#error BITS_PER_LONG not 32 or 64
+#endif

--
To unsubscribe from this list: send the line "unsubscribe linux-crypto" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 2/2] crypto: Add lz4 Cryptographic API

2013-03-14 Thread Chanho Min
This patch adds support for lz4 and lz4hc compression algorithm
using the lib/lz4/* codebase.

Signed-off-by: Chanho Min 
---
 crypto/Kconfig  |   16 +
 crypto/Makefile |2 ++
 crypto/lz4.c|  105 +++
 crypto/lz4hc.c  |  105 +++
 4 files changed, 228 insertions(+)
 create mode 100644 crypto/lz4.c
 create mode 100644 crypto/lz4hc.c

diff --git a/crypto/Kconfig b/crypto/Kconfig
index aed52b2..cad1835 100644
--- a/crypto/Kconfig
+++ b/crypto/Kconfig
@@ -1236,6 +1236,22 @@ config CRYPTO_842
help
  This is the 842 algorithm.

+config CRYPTO_LZ4
+   tristate "LZ4 compression algorithm"
+   select CRYPTO_ALGAPI
+   select LZ4_COMPRESS
+   select LZ4_DECOMPRESS
+   help
+ This is the LZ4 algorithm.
+
+config CRYPTO_LZ4HC
+   tristate "LZ4HC compression algorithm"
+   select CRYPTO_ALGAPI
+   select LZ4HC_COMPRESS
+   select LZ4_DECOMPRESS
+   help
+ This is the LZ4 high compression mode algorithm.
+
 comment "Random Number Generation"

 config CRYPTO_ANSI_CPRNG
diff --git a/crypto/Makefile b/crypto/Makefile
index be1a1be..af87faa 100644
--- a/crypto/Makefile
+++ b/crypto/Makefile
@@ -84,6 +84,8 @@ obj-$(CONFIG_CRYPTO_CRC32C) += crc32c.o
 obj-$(CONFIG_CRYPTO_CRC32) += crc32.o
 obj-$(CONFIG_CRYPTO_AUTHENC) += authenc.o authencesn.o
 obj-$(CONFIG_CRYPTO_LZO) += lzo.o
+obj-$(CONFIG_CRYPTO_LZ4) += lz4.o
+obj-$(CONFIG_CRYPTO_LZ4HC) += lz4hc.o
 obj-$(CONFIG_CRYPTO_842) += 842.o
 obj-$(CONFIG_CRYPTO_RNG2) += rng.o
 obj-$(CONFIG_CRYPTO_RNG2) += krng.o
diff --git a/crypto/lz4.c b/crypto/lz4.c
new file mode 100644
index 000..98bfdd7
--- /dev/null
+++ b/crypto/lz4.c
@@ -0,0 +1,105 @@
+/*
+ * Cryptographic API.
+ *
+ * Copyright (c) 2013 Chanho Min 
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published by
+ * the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc., 51
+ * Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+
+struct lz4_ctx {
+   void *lz4_comp_mem;
+};
+
+static int lz4_init(struct crypto_tfm *tfm)
+{
+   struct lz4_ctx *ctx = crypto_tfm_ctx(tfm);
+
+   ctx->lz4_comp_mem = vmalloc(LZ4_MEM_COMPRESS);
+   if (!ctx->lz4_comp_mem)
+   return -ENOMEM;
+
+   return 0;
+}
+
+static void lz4_exit(struct crypto_tfm *tfm)
+{
+   struct lz4_ctx *ctx = crypto_tfm_ctx(tfm);
+   vfree(ctx->lz4_comp_mem);
+}
+
+static int lz4_compress_crypto(struct crypto_tfm *tfm, const u8 *src,
+   unsigned int slen, u8 *dst, unsigned int *dlen)
+{
+   struct lz4_ctx *ctx = crypto_tfm_ctx(tfm);
+   size_t tmp_len = *dlen;
+   int err;
+
+   err = lz4_compress(src, slen, dst, &tmp_len, ctx->lz4_comp_mem);
+
+   if (err < 0)
+   return -EINVAL;
+
+   *dlen = tmp_len;
+   return 0;
+}
+
+static int lz4_decompress_crypto(struct crypto_tfm *tfm, const u8 *src,
+ unsigned int slen, u8 *dst, unsigned int *dlen)
+{
+   int err;
+   size_t tmp_len = *dlen;
+
+   err = lz4_decompress(src, &slen, dst, tmp_len);
+   if (err < 0)
+   return -EINVAL;
+
+   *dlen = tmp_len;
+   return err;
+}
+
+static struct crypto_alg alg_lz4 = {
+   .cra_name   = "lz4",
+   .cra_flags  = CRYPTO_ALG_TYPE_COMPRESS,
+   .cra_ctxsize= sizeof(struct lz4_ctx),
+   .cra_module = THIS_MODULE,
+   .cra_list   = LIST_HEAD_INIT(alg_lz4.cra_list),
+   .cra_init   = lz4_init,
+   .cra_exit   = lz4_exit,
+   .cra_u  = { .compress = {
+   .coa_compress   = lz4_compress_crypto,
+   .coa_decompress = lz4_decompress_crypto } }
+};
+
+static int __init lz4_mod_init(void)
+{
+   return crypto_register_alg(&alg_lz4);
+}
+
+static void __exit lz4_mod_fini(void)
+{
+   crypto_unregister_alg(&alg_lz4);
+}
+
+module_init(lz4_mod_init);
+module_exit(lz4_mod_fini);
+
+MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("LZ4 Compression Algorithm");
diff --git a/crypto/lz4hc.c b/crypto/lz4hc.c
new file mode 100644
index 000..d3c9625
--- /dev/null
+++ b/crypto/lz4hc.c
@@ -0,0 +1,105 @@
+/*
+ * Cryptographic API.
+ *
+ * Copyright (c) 2013 Chanho Min 

[PATCH 1/2] lib: Add lz4 compressor module

2013-03-14 Thread Chanho Min
This patch adds support for LZ4 compression in the Linux Kernel.
LZ4 Compression APIs for kernel are based on LZ4 implementation
by Yann Collet and changed with kernel coding style.

LZ4 homepage : http://fastcompression.blogspot.com/p/lz4.html
LZ4 source repository : http://code.google.com/p/lz4/
svn revision : r90

Two APIs are added:
lz4_compress() support basic lz4 compression whereas lz4hc_compress() support
high compression or CPU performance get lower but compression ratio get higher.
Also, we require the pre-allocated working memory with the defined size and
destination buffer must be allocated with the size of lz4_compressbound.

Signed-off-by: Chanho Min 
---
 include/linux/lz4.h  |   36 
 lib/Kconfig  |6 +
 lib/Makefile |2 +
 lib/lz4/Makefile |2 +
 lib/lz4/lz4_compress.c   |  443 +
 lib/lz4/lz4defs.h|   66 +-
 lib/lz4/lz4hc_compress.c |  539 ++
 7 files changed, 1092 insertions(+), 2 deletions(-)
 create mode 100644 lib/lz4/lz4_compress.c
 create mode 100644 lib/lz4/lz4hc_compress.c

diff --git a/include/linux/lz4.h b/include/linux/lz4.h
index 7f6c75a..d21c13f 100644
--- a/include/linux/lz4.h
+++ b/include/linux/lz4.h
@@ -9,6 +9,8 @@
  * it under the terms of the GNU General Public License version 2 as
  * published by the Free Software Foundation.
  */
+#define LZ4_MEM_COMPRESS   (4096 * sizeof(unsigned char *))
+#define LZ4HC_MEM_COMPRESS (65538 * sizeof(unsigned char *))

 /*
  * lz4_compressbound()
@@ -21,6 +23,40 @@ static inline size_t lz4_compressbound(size_t isize)
 }

 /*
+ * lz4_compress()
+ * src : source address of the original data
+ * src_len : size of the original data
+ * dst : output buffer address of the compressed data
+ * This requires 'dst' of size LZ4_COMPRESSBOUND.
+ * dst_len : is the output size, which is returned after compress done
+ * workmem : address of the working memory.
+ * This requires 'workmem' of size LZ4_MEM_COMPRESS.
+ * return  : Success if return 0
+ *   Error if return (< 0)
+ * note :  Destination buffer and workmem must be already allocated with
+ * the defined size.
+ */
+int lz4_compress(const unsigned char *src, size_t src_len,
+   unsigned char *dst, size_t *dst_len, void *wrkmem);
+
+ /*
+  * lz4hc_compress()
+  * src : source address of the original data
+  * src_len : size of the original data
+  * dst : output buffer address of the compressed data
+  *This requires 'dst' of size LZ4_COMPRESSBOUND.
+  * dst_len : is the output size, which is returned after compress done
+  * workmem : address of the working memory.
+  *This requires 'workmem' of size LZ4HC_MEM_COMPRESS.
+  * return  : Success if return 0
+  *   Error if return (< 0)
+  * note :  Destination buffer and workmem must be already allocated with
+  * the defined size.
+  */
+int lz4hc_compress(const unsigned char *src, size_t src_len,
+   unsigned char *dst, size_t *dst_len, void *wrkmem);
+
+/*
  * lz4_decompress()
  * src : source address of the compressed data
  * src_len : is the input size, whcih is returned after decompress done
diff --git a/lib/Kconfig b/lib/Kconfig
index d086415..7bfdbbc 100644
--- a/lib/Kconfig
+++ b/lib/Kconfig
@@ -189,6 +189,12 @@ config LZO_COMPRESS
 config LZO_DECOMPRESS
tristate

+config LZ4_COMPRESS
+   tristate
+
+config LZ4HC_COMPRESS
+   tristate
+
 config LZ4_DECOMPRESS
tristate

diff --git a/lib/Makefile b/lib/Makefile
index 0feeb19..378d1c4 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -73,6 +73,8 @@ obj-$(CONFIG_REED_SOLOMON) += reed_solomon/
 obj-$(CONFIG_BCH) += bch.o
 obj-$(CONFIG_LZO_COMPRESS) += lzo/
 obj-$(CONFIG_LZO_DECOMPRESS) += lzo/
+obj-$(CONFIG_LZ4_COMPRESS) += lz4/
+obj-$(CONFIG_LZ4HC_COMPRESS) += lz4/
 obj-$(CONFIG_LZ4_DECOMPRESS) += lz4/
 obj-$(CONFIG_XZ_DEC) += xz/
 obj-$(CONFIG_RAID6_PQ) += raid6/
diff --git a/lib/lz4/Makefile b/lib/lz4/Makefile
index 7f548c6..8085d04 100644
--- a/lib/lz4/Makefile
+++ b/lib/lz4/Makefile
@@ -1 +1,3 @@
+obj-$(CONFIG_LZ4_COMPRESS) += lz4_compress.o
+obj-$(CONFIG_LZ4HC_COMPRESS) += lz4hc_compress.o
 obj-$(CONFIG_LZ4_DECOMPRESS) += lz4_decompress.o
diff --git a/lib/lz4/lz4_compress.c b/lib/lz4/lz4_compress.c
new file mode 100644
index 000..fd94058
--- /dev/null
+++ b/lib/lz4/lz4_compress.c
@@ -0,0 +1,443 @@
+/*
+ * LZ4 - Fast LZ compression algorithm
+ * Copyright (C) 2011-2012, Yann Collet.
+ * BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
+
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retai

[PATCH 0/2] lib,crypto: Add lz4 compressor module and crypto API

2013-03-14 Thread Chanho Min
This patchset is for supporting LZ4 compression and the crypto API using it.
This should be applied after the previous Kyungsik's "LZ4 compressed kernel"
patches - https://lkml.org/lkml/2013/3/5/181.

As shown in bellow result, the size of data is a little bit bigger but
compressing speed is faster under the enabled unaligned memory access.
We can use lz4 de/compression through crypto API as well. Also,
It will be useful for another potential user of lz4 compression.

lz4 Compression Benchmark:
Compiler: ARM gcc 4.6.4
ARMv7, 1 GHz based board
   Kernel: linux 3.4
   Uncompressed data Size: 101 MB
 Compressed Size  compression Speed
   LZO   72.1MB   32.1MB/s, 33.0MB/s(UA)
   LZ4   75.1MB   30.4MB/s, 35.9MB/s(UA)
   LZ4HC 59.8MB2.4MB/s,  2.5MB/s(UA)
- UA: Unaligned memory Access support
- Latest patch set for LZO applied

Chanho Min (2):
  lib: Add lz4 compressor module
  crypto: Add lz4 Cryptographic API

 crypto/Kconfig   |   16 ++
 crypto/Makefile  |2 +
 crypto/lz4.c |  105 +
 crypto/lz4hc.c   |  105 +
 include/linux/lz4.h  |   36 
 lib/Kconfig  |6 +
 lib/Makefile |2 +
 lib/lz4/Makefile |2 +
 lib/lz4/lz4_compress.c   |  443 +
 lib/lz4/lz4defs.h|   66 +-
 lib/lz4/lz4hc_compress.c |  539 ++
 11 files changed, 1320 insertions(+), 2 deletions(-)
 create mode 100644 crypto/lz4.c
 create mode 100644 crypto/lz4hc.c
 create mode 100644 lib/lz4/lz4_compress.c
 create mode 100644 lib/lz4/lz4hc_compress.c

-- 
1.7.9.5
--
To unsubscribe from this list: send the line "unsubscribe linux-crypto" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html