From: Jean-Luc Cooke <jlcooke@certainkey.com>
To: Christophe Saout <christophe@saout.de>
Cc: Andrew Morton <akpm@osdl.org>,
jmorris@intercode.com.au, linux-kernel@vger.kernel.org
Subject: Re: cryptoapi highmem bug
Date: Wed, 25 Feb 2004 10:44:53 -0500 [thread overview]
Message-ID: <20040225154453.GB4218@certainkey.com> (raw)
In-Reply-To: <20040225155121.GA7148@leto.cs.pocnet.net>
Not to be annoying...
Could you make this change against my patch at:
http://jlcooke.ca/lkml/crypto_28feb2004.patch
I moved all the scatterwalk stuff into a scatterwalk.c file.
JLC
On Wed, Feb 25, 2004 at 04:51:22PM +0100, Christophe Saout wrote:
> On Wed, Feb 25, 2004 at 04:31:26PM +0100, Christophe Saout wrote:
>
> > It's just a proof of concept though, it would be less complicated if we
> > would just pass the other walk struct to the functions that take one
> > and let them do the checking (no need to disable preemption and use
> > per cpu variables). Hmm.
>
> Ok, this also works. It makes copy_chunks and crypt responsible for
> tracking the walk struct which might contain a page to reuse:
>
>
> --- linux-2.6.3/crypto/cipher.c 2004-02-25 13:49:53.000000000 +0100
> +++ linux-2.6.3.test/crypto/cipher.c 2004-02-25 16:46:58.430294600 +0100
> @@ -29,6 +29,7 @@
> struct scatter_walk {
> struct scatterlist *sg;
> struct page *page;
> + int out;
> void *data;
> unsigned int len_this_page;
> unsigned int len_this_segment;
> @@ -64,7 +65,7 @@
> return sg + 1;
> }
>
> -void *which_buf(struct scatter_walk *walk, unsigned int nbytes, void *scratch)
> +static void *which_buf(struct scatter_walk *walk, unsigned int nbytes, void *scratch)
> {
> if (nbytes <= walk->len_this_page &&
> (((unsigned long)walk->data) & (PAGE_CACHE_SIZE - 1)) + nbytes <=
> @@ -96,9 +97,23 @@
> walk->offset = sg->offset;
> }
>
> -static void scatterwalk_map(struct scatter_walk *walk, int out)
> +static void scatterwalk_map(struct scatter_walk *walk,
> + struct scatter_walk *other, int out)
> {
> - walk->data = crypto_kmap(walk->page, out) + walk->offset;
> + if (other && other->page == walk->page) {
> + walk->data = (other->data - other->offset) + walk->offset;
> + walk->out = other->out;
> + } else {
> + walk->data = crypto_kmap(walk->page, out) + walk->offset;
> + walk->out = out;
> + }
> +}
> +
> +static void scatterwalk_unmap(struct scatter_walk *walk,
> + struct scatter_walk *other, int out)
> +{
> + if (!other || other->page != walk->page)
> + crypto_kunmap(walk->data, walk->out);
> }
>
> static void scatter_page_done(struct scatter_walk *walk, int out,
> @@ -125,9 +140,10 @@
> }
> }
>
> -static void scatter_done(struct scatter_walk *walk, int out, int more)
> +static void scatter_done(struct scatter_walk *walk,
> + struct scatter_walk *other, int out, int more)
> {
> - crypto_kunmap(walk->data, out);
> + scatterwalk_unmap(walk, other, out);
> if (walk->len_this_page == 0 || !more)
> scatter_page_done(walk, out, more);
> }
> @@ -137,7 +153,7 @@
> * has been verified as multiple of the block size.
> */
> static int copy_chunks(void *buf, struct scatter_walk *walk,
> - size_t nbytes, int out)
> + struct scatter_walk *other, size_t nbytes, int out)
> {
> if (buf != walk->data) {
> while (nbytes > walk->len_this_page) {
> @@ -145,9 +161,9 @@
> buf += walk->len_this_page;
> nbytes -= walk->len_this_page;
>
> - crypto_kunmap(walk->data, out);
> + scatterwalk_unmap(walk, other, out);
> scatter_page_done(walk, out, 1);
> - scatterwalk_map(walk, out);
> + scatterwalk_map(walk, other, out);
> }
>
> memcpy_dir(buf, walk->data, nbytes, out);
> @@ -189,21 +205,21 @@
> for(;;) {
> u8 *src_p, *dst_p;
>
> - scatterwalk_map(&walk_in, 0);
> - scatterwalk_map(&walk_out, 1);
> + scatterwalk_map(&walk_in, NULL, 0);
> + scatterwalk_map(&walk_out, &walk_in, 1);
> src_p = which_buf(&walk_in, bsize, tmp_src);
> dst_p = which_buf(&walk_out, bsize, tmp_dst);
>
> nbytes -= bsize;
>
> - copy_chunks(src_p, &walk_in, bsize, 0);
> + copy_chunks(src_p, &walk_in, &walk_out, bsize, 0);
>
> prfn(tfm, dst_p, src_p, crfn, enc, info);
>
> - scatter_done(&walk_in, 0, nbytes);
> + scatter_done(&walk_in, &walk_out, 0, nbytes);
>
> - copy_chunks(dst_p, &walk_out, bsize, 1);
> - scatter_done(&walk_out, 1, nbytes);
> + copy_chunks(dst_p, &walk_out, NULL, bsize, 1);
> + scatter_done(&walk_out, NULL, 1, nbytes);
>
> if (!nbytes)
> return 0;
--
http://www.certainkey.com
Suite 4560 CTTC
1125 Colonel By Dr.
Ottawa ON, K1S 5B6
next prev parent reply other threads:[~2004-02-25 15:55 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-02-24 20:49 cryptoapi highmem bug Christophe Saout
2004-02-24 22:34 ` Jean-Luc Cooke
2004-02-24 23:01 ` Christophe Saout
2004-02-25 4:32 ` Jean-Luc Cooke
2004-02-25 6:00 ` Andrew Morton
2004-02-25 13:27 ` James Morris
2004-02-25 15:17 ` Jean-Luc Cooke
2004-02-25 19:50 ` Andrew Morton
2004-02-25 21:27 ` Christophe Saout
2004-02-25 21:41 ` Jean-Luc Cooke
2004-02-25 22:55 ` [PATCH 1/2] move scatterwalk functions to own file Christophe Saout
2004-02-25 22:55 ` [PATCH 2/2] fix in-place de/encryption bug with highmem Christophe Saout
2004-02-26 4:13 ` James Morris
2004-02-26 11:03 ` Christophe Saout
2004-02-25 15:31 ` cryptoapi highmem bug Christophe Saout
2004-02-25 15:51 ` Christophe Saout
2004-02-25 15:44 ` Jean-Luc Cooke [this message]
2004-02-25 16:13 ` Christophe Saout
2004-02-25 16:09 ` Jean-Luc Cooke
2004-02-25 18:11 ` cryptoapi OMAC (was: cryptoapi highmem bug) Christophe Saout
2004-02-25 20:59 ` Jean-Luc Cooke
2004-02-25 21:44 ` Christophe Saout
2004-02-25 18:15 ` cryptoapi highmem bug Christophe Saout
2004-02-25 20:12 ` Jean-Luc Cooke
2004-02-25 20:39 ` Christophe Saout
2004-02-25 20:46 ` Jean-Luc Cooke
2004-02-25 21:36 ` Christophe Saout
2004-02-25 21:52 ` Jean-Luc Cooke
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20040225154453.GB4218@certainkey.com \
--to=jlcooke@certainkey.com \
--cc=akpm@osdl.org \
--cc=christophe@saout.de \
--cc=jmorris@intercode.com.au \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.