Messages in this thread | | | Date | Wed, 25 Feb 2004 10:44:53 -0500 | From | Jean-Luc Cooke <> | Subject | Re: cryptoapi highmem bug |
| |
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 - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |