From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:53708) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TqR1e-000444-Hh for qemu-devel@nongnu.org; Wed, 02 Jan 2013 11:18:45 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TqR1W-0006Mx-JL for qemu-devel@nongnu.org; Wed, 02 Jan 2013 11:18:42 -0500 Received: from nodalink.pck.nerim.net ([62.212.105.220]:56274 helo=paradis.irqsave.net) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TqR1W-0006Mi-5H for qemu-devel@nongnu.org; Wed, 02 Jan 2013 11:18:34 -0500 From: =?UTF-8?q?Beno=C3=AEt=20Canet?= Date: Wed, 2 Jan 2013 17:16:28 +0100 Message-Id: <1357143393-29832-26-git-send-email-benoit@irqsave.net> In-Reply-To: <1357143393-29832-1-git-send-email-benoit@irqsave.net> References: <1357143393-29832-1-git-send-email-benoit@irqsave.net> Subject: [Qemu-devel] [RFC V4 25/30] qcow2: Integrate SKEIN hash algorithm in deduplication. List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: kwolf@redhat.com, pbonzini@redhat.com, =?UTF-8?q?Beno=C3=AEt=20Canet?= , stefanha@redhat.com Signed-off-by: Benoit Canet --- block/qcow2-dedup.c | 14 ++++++++++++++ block/qcow2.c | 5 +++++ configure | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 52 insertions(+) diff --git a/block/qcow2-dedup.c b/block/qcow2-dedup.c index 28001c6..bd8397e 100644 --- a/block/qcow2-dedup.c +++ b/block/qcow2-dedup.c @@ -30,6 +30,9 @@ #include "block/block_int.h" #include "qemu-common.h" #include "qcow2.h" +#ifdef CONFIG_SKEIN_DEDUP +#include +#endif static int qcow2_dedup_read_write_hash(BlockDriverState *bs, QCowHash *hash, @@ -202,6 +205,17 @@ static int qcow2_compute_cluster_hash(BlockDriverState *bs, case QCOW_HASH_SHA256: return gnutls_hash_fast(GNUTLS_DIG_SHA256, data, s->cluster_size, hash->data); +#if defined(CONFIG_SKEIN_DEDUP) + case QCOW_HASH_SKEIN: + { + SkeinCtx_t ctx; + skeinCtxPrepare(&ctx, Skein256); + skeinInit(&ctx, Skein256); + skeinUpdate(&ctx, data, s->cluster_size); + skeinFinal(&ctx, hash->data); + } + return 0; +#endif default: error_report("Invalid deduplication hash algorithm %i", s->dedup_hash_algo); diff --git a/block/qcow2.c b/block/qcow2.c index 13f6a5c..0154d50 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -1540,6 +1540,11 @@ static int8_t qcow2_get_dedup_hash_algo(char *value) if (!strcmp(value, "sha256")) { return QCOW_HASH_SHA256; } +#if defined(CONFIG_SKEIN_DEDUP) + if (!strcmp(value, "skein")) { + return QCOW_HASH_SKEIN; + } +#endif error_printf("Unsupported deduplication hash algorithm.\n"); return -EINVAL; diff --git a/configure b/configure index 390326e..97497af 100755 --- a/configure +++ b/configure @@ -223,6 +223,7 @@ libiscsi="" coroutine="" seccomp="" glusterfs="" +skein_dedup="no" # parse CC options first for opt do @@ -882,6 +883,8 @@ for opt do ;; --enable-glusterfs) glusterfs="yes" ;; + --enable-skein-dedup) skein_dedup="yes" + ;; *) echo "ERROR: unknown option $opt"; show_help="yes" ;; esac @@ -1130,6 +1133,7 @@ echo " --with-coroutine=BACKEND coroutine backend. Supported options:" echo " gthread, ucontext, sigaltstack, windows" echo " --enable-glusterfs enable GlusterFS backend" echo " --disable-glusterfs disable GlusterFS backend" +echo " --enable-skein-dedup enable computing dedup hashes with SKEIN" echo "" echo "NOTE: The object files are built at the place where configure is launched" exit 1 @@ -2412,6 +2416,30 @@ EOF fi fi +########################################## +# SKEIN dedup hash function probe +if test "$skein_dedup" != "no" ; then + cat > $TMPC < +int main(void) { + SkeinCtx_t ctx; + skeinCtxPrepare(&ctx, 512); + return 0; +} +EOF + skein_libs="-lskein3fish" + if compile_prog "" "$skein_libs" ; then + skein_dedup=yes + libs_tools="$skein_libs $libs_tools" + libs_softmmu="$skein_libs $libs_softmmu" + else + if test "$skein_dedup" = "yes" ; then + feature_not_found "libskein3fish not found" + fi + skein_dedup=no + fi +fi + # # Check for xxxat() functions when we are building linux-user # emulator. This is done because older glibc versions don't @@ -3296,6 +3324,7 @@ echo "build guest agent $guest_agent" echo "seccomp support $seccomp" echo "coroutine backend $coroutine_backend" echo "GlusterFS support $glusterfs" +echo "SKEIN support $skein_dedup" if test "$sdl_too_old" = "yes"; then echo "-> Your SDL version is too old - please upgrade to have SDL support" @@ -3637,6 +3666,10 @@ if test "$glusterfs" = "yes" ; then echo "CONFIG_GLUSTERFS=y" >> $config_host_mak fi +if test "$skein_dedup" = "yes" ; then + echo "CONFIG_SKEIN_DEDUP=y" >> $config_host_mak +fi + # USB host support case "$usb" in linux) -- 1.7.10.4