From patchwork Mon Jul 19 12:27:46 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Milan Broz X-Patchwork-Id: 112657 Received: from mx02.colomx.prod.int.phx2.redhat.com (mx4-phx2.redhat.com [209.132.183.25]) by demeter.kernel.org (8.14.4/8.14.3) with ESMTP id o6JCUR1j032472 for ; Mon, 19 Jul 2010 12:31:03 GMT Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by mx02.colomx.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id o6JCRwXl000648; Mon, 19 Jul 2010 08:27:59 -0400 Received: from int-mx04.intmail.prod.int.phx2.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.17]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id o6JCRrbR012120 for ; Mon, 19 Jul 2010 08:27:53 -0400 Received: from [10.34.26.15] (mazybook.brq.redhat.com [10.34.26.15]) by int-mx04.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id o6JCRkeu020122; Mon, 19 Jul 2010 08:27:47 -0400 Message-ID: <4C4444C2.6040607@redhat.com> Date: Mon, 19 Jul 2010 14:27:46 +0200 From: Milan Broz User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.4) Gecko/20100608 Lightning/1.0b2 Thunderbird/3.1 MIME-Version: 1.0 To: device-mapper development , Andi Kleen References: <20100601075259.GA13333@basil.fritz.box> In-Reply-To: <20100601075259.GA13333@basil.fritz.box> X-Enigmail-Version: 1.1.1 X-Scanned-By: MIMEDefang 2.67 on 10.5.11.17 X-loop: dm-devel@redhat.com Cc: eric.dumazet@gmail.com, linux-kernel@vger.kernel.org, agk@redhat.com Subject: Re: [dm-devel] [PATCH] DM-CRYPT: Scale to multiple CPUs v2 X-BeenThere: dm-devel@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk Reply-To: device-mapper development List-Id: device-mapper development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: dm-devel-bounces@redhat.com Errors-To: dm-devel-bounces@redhat.com X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.3 (demeter.kernel.org [140.211.167.41]); Mon, 19 Jul 2010 12:31:03 +0000 (UTC) diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c index 13b1675..f7b2cf6 100644 --- a/drivers/md/dm-crypt.c +++ b/drivers/md/dm-crypt.c @@ -82,11 +82,6 @@ struct iv_essiv_private { u8 *salt; }; -/* Duplicated per CPU state for cipher */ -struct iv_essiv_private_cpu { - struct crypto_cipher *tfm; -}; - struct iv_benbi_private { int shift; }; @@ -101,7 +96,9 @@ enum flags { DM_CRYPT_SUSPENDED, DM_CRYPT_KEY_VALID }; struct crypt_cpu { struct ablkcipher_request *req; struct crypto_ablkcipher *tfm; - struct iv_essiv_private_cpu ie; + + /* ESSIV: struct crypto_cipher *essiv_tfm */ + void *iv_private; }; /* @@ -235,6 +232,8 @@ static int crypt_iv_essiv_init(struct crypt_config *cc) struct iv_essiv_private *essiv = &cc->iv_gen_private.essiv; struct hash_desc desc; struct scatterlist sg; + struct crypt_cpu *cs; + struct crypto_cipher *essiv_tfm; int err, n, cpu; sg_init_one(&sg, cc->key, cc->key_size); @@ -246,9 +245,10 @@ static int crypt_iv_essiv_init(struct crypt_config *cc) return err; for_each_possible_cpu (cpu) { - struct crypt_cpu *cs = per_cpu_ptr(cc->cpu, cpu); + cs = per_cpu_ptr(cc->cpu, cpu); + essiv_tfm = cs->iv_private, - n = crypto_cipher_setkey(cs->ie.tfm, essiv->salt, + n = crypto_cipher_setkey(essiv_tfm, essiv->salt, crypto_hash_digestsize(essiv->hash_tfm)); if (n) { err = n; @@ -264,14 +264,17 @@ static int crypt_iv_essiv_wipe(struct crypt_config *cc) { struct iv_essiv_private *essiv = &cc->iv_gen_private.essiv; unsigned salt_size = crypto_hash_digestsize(essiv->hash_tfm); + struct crypt_cpu *cs; + struct crypto_cipher *essiv_tfm; int cpu, err, n; memset(essiv->salt, 0, salt_size); err = 0; for_each_possible_cpu (cpu) { - struct crypt_cpu *cs = per_cpu_ptr(cc->cpu, cpu); - n = crypto_cipher_setkey(cs->ie.tfm, essiv->salt, salt_size); + cs = per_cpu_ptr(cc->cpu, cpu); + essiv_tfm = cs->iv_private; + n = crypto_cipher_setkey(essiv_tfm, essiv->salt, salt_size); if (n) err = n; } @@ -314,6 +317,8 @@ static struct crypto_cipher *setup_essiv_cpu(struct crypt_config *cc, static void crypt_iv_essiv_dtr(struct crypt_config *cc) { int cpu; + struct crypt_cpu *cs; + struct crypto_cipher *essiv_tfm; struct iv_essiv_private *essiv = &cc->iv_gen_private.essiv; crypto_free_hash(essiv->hash_tfm); @@ -323,11 +328,11 @@ static void crypt_iv_essiv_dtr(struct crypt_config *cc) essiv->salt = NULL; for_each_possible_cpu (cpu) { - struct crypt_cpu *cs = per_cpu_ptr(cc->cpu, cpu); - if (cs->ie.tfm) { - crypto_free_cipher(cs->ie.tfm); - cs->ie.tfm = NULL; - } + cs = per_cpu_ptr(cc->cpu, cpu); + essiv_tfm = cs->iv_private; + if (essiv_tfm) + crypto_free_cipher(essiv_tfm); + cs->iv_private = NULL; } } @@ -371,7 +376,7 @@ static int crypt_iv_essiv_ctr(struct crypt_config *cc, struct dm_target *ti, crypt_iv_essiv_dtr(cc); return PTR_ERR(essiv_tfm); } - per_cpu_ptr(cc->cpu, cpu)->ie.tfm = essiv_tfm; + per_cpu_ptr(cc->cpu, cpu)->iv_private = essiv_tfm; } return 0; @@ -384,9 +389,11 @@ bad: static int crypt_iv_essiv_gen(struct crypt_config *cc, u8 *iv, sector_t sector) { + struct crypto_cipher *essiv_tfm = crypt_me(cc)->iv_private; + memset(iv, 0, cc->iv_size); *(u64 *)iv = cpu_to_le64(sector); - crypto_cipher_encrypt_one(crypt_me(cc)->ie.tfm, iv, iv); + crypto_cipher_encrypt_one(essiv_tfm, iv, iv); return 0; }