From patchwork Wed Jan 16 15:48:08 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Beno=C3=AEt_Canet?= X-Patchwork-Id: 212975 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 785082C0082 for ; Thu, 17 Jan 2013 05:54:57 +1100 (EST) Received: from localhost ([::1]:57655 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TvVHM-0008Hr-Ht for incoming@patchwork.ozlabs.org; Wed, 16 Jan 2013 10:51:52 -0500 Received: from eggs.gnu.org ([208.118.235.92]:59956) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TvVGY-0006vE-4x for qemu-devel@nongnu.org; Wed, 16 Jan 2013 10:51:04 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TvVGT-0005eX-Vc for qemu-devel@nongnu.org; Wed, 16 Jan 2013 10:51:02 -0500 Received: from nodalink.pck.nerim.net ([62.212.105.220]:42936 helo=paradis.irqsave.net) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TvVGT-0005eM-H1 for qemu-devel@nongnu.org; Wed, 16 Jan 2013 10:50:57 -0500 Received: by paradis.irqsave.net (Postfix, from userid 1002) id 67667874325; Wed, 16 Jan 2013 17:22:33 +0100 (CET) Received: from localhost.localdomain (unknown [192.168.77.1]) by paradis.irqsave.net (Postfix) with ESMTP id 39CA9874336; Wed, 16 Jan 2013 17:19:48 +0100 (CET) From: =?UTF-8?q?Beno=C3=AEt=20Canet?= To: qemu-devel@nongnu.org Date: Wed, 16 Jan 2013 16:48:08 +0100 Message-Id: <1358351321-4891-30-git-send-email-benoit@irqsave.net> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1358351321-4891-1-git-send-email-benoit@irqsave.net> References: <1358351321-4891-1-git-send-email-benoit@irqsave.net> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 62.212.105.220 Cc: kwolf@redhat.com, pbonzini@redhat.com, =?UTF-8?q?Beno=C3=AEt=20Canet?= , stefanha@redhat.com Subject: [Qemu-devel] [RFC V5 29/62] qcow2: Integrate SKEIN hash algorithm in deduplication. X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org 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 cc99e27..50ffa54 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, @@ -208,6 +211,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 4f8cf68..e742e02 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -1550,6 +1550,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)