@@ -869,12 +869,11 @@ static int gcm_out_walk_go(struct gcm_sg_walk *gw, unsigned int minbytesneeded)
gw->ptr = gw->walk.addr;
gw->nbytes = gw->walk_bytes;
goto out;
}
- /* XXX */
- scatterwalk_unmap(gw->walk.addr);
+ scatterwalk_unmap(&gw->walk);
gw->ptr = gw->buf;
gw->nbytes = sizeof(gw->buf);
out:
@@ -37,22 +37,10 @@ enum {
static const struct crypto_type crypto_skcipher_type;
static int skcipher_walk_next(struct skcipher_walk *walk);
-static inline void skcipher_map_src(struct skcipher_walk *walk)
-{
- /* XXX */
- walk->in.__addr = scatterwalk_map(&walk->in);
-}
-
-static inline void skcipher_map_dst(struct skcipher_walk *walk)
-{
- /* XXX */
- walk->out.__addr = scatterwalk_map(&walk->out);
-}
-
static inline gfp_t skcipher_walk_gfp(struct skcipher_walk *walk)
{
return walk->flags & SKCIPHER_WALK_SLEEP ? GFP_KERNEL : GFP_ATOMIC;
}
@@ -99,12 +87,12 @@ int skcipher_walk_done(struct skcipher_walk *walk, int res)
scatterwalk_advance(&walk->in, n);
} else if (walk->flags & SKCIPHER_WALK_DIFF) {
scatterwalk_done_src(&walk->in, n);
} else if (walk->flags & SKCIPHER_WALK_COPY) {
scatterwalk_advance(&walk->in, n);
- skcipher_map_dst(walk);
- memcpy(walk->dst.virt.addr, walk->page, n);
+ scatterwalk_map(&walk->out);
+ memcpy(walk->out.addr, walk->page, n);
} else { /* SKCIPHER_WALK_SLOW */
if (res > 0) {
/*
* Didn't process all bytes. Either the algorithm is
* broken, or this was the last step and it turned out
@@ -184,13 +172,13 @@ static int skcipher_next_slow(struct skcipher_walk *walk, unsigned int bsize)
static int skcipher_next_copy(struct skcipher_walk *walk)
{
void *tmp = walk->page;
- skcipher_map_src(walk);
- memcpy(tmp, walk->src.virt.addr, walk->nbytes);
- scatterwalk_unmap(walk->src.virt.addr);
+ scatterwalk_map(&walk->in);
+ memcpy(tmp, walk->in.addr, walk->nbytes);
+ scatterwalk_unmap(&walk->in);
/*
* walk->in is advanced later when the number of bytes actually
* processed (which might be less than walk->nbytes) is known.
*/
@@ -206,16 +194,16 @@ static int skcipher_next_fast(struct skcipher_walk *walk)
diff = offset_in_page(walk->in.offset) -
offset_in_page(walk->out.offset);
diff |= (u8 *)(sg_page(walk->in.sg) + (walk->in.offset >> PAGE_SHIFT)) -
(u8 *)(sg_page(walk->out.sg) + (walk->out.offset >> PAGE_SHIFT));
- skcipher_map_dst(walk);
- walk->in.__addr = walk->dst.virt.addr;
+ scatterwalk_map(&walk->out);
+ walk->in.__addr = walk->out.__addr;
if (diff) {
walk->flags |= SKCIPHER_WALK_DIFF;
- skcipher_map_src(walk);
+ scatterwalk_map(&walk->in);
}
return 0;
}
@@ -95,27 +95,32 @@ static inline void scatterwalk_get_sglist(struct scatter_walk *walk,
walk->sg->offset + walk->sg->length - walk->offset,
walk->offset);
scatterwalk_crypto_chain(sg_out, sg_next(walk->sg), 2);
}
-static inline void *scatterwalk_map(struct scatter_walk *walk)
+static inline void scatterwalk_map(struct scatter_walk *walk)
{
struct page *base_page = sg_page(walk->sg);
- if (IS_ENABLED(CONFIG_HIGHMEM))
- return kmap_local_page(base_page + (walk->offset >> PAGE_SHIFT)) +
- offset_in_page(walk->offset);
- /*
- * When !HIGHMEM we allow the walker to return segments that span a page
- * boundary; see scatterwalk_clamp(). To make it clear that in this
- * case we're working in the linear buffer of the whole sg entry in the
- * kernel's direct map rather than within the mapped buffer of a single
- * page, compute the address as an offset from the page_address() of the
- * first page of the sg entry. Either way the result is the address in
- * the direct map, but this makes it clearer what is really going on.
- */
- return page_address(base_page) + walk->offset;
+ if (IS_ENABLED(CONFIG_HIGHMEM)) {
+ walk->__addr = kmap_local_page(base_page +
+ (walk->offset >> PAGE_SHIFT)) +
+ offset_in_page(walk->offset);
+ } else {
+ /*
+ * When !HIGHMEM we allow the walker to return segments that
+ * span a page boundary; see scatterwalk_clamp(). To make it
+ * clear that in this case we're working in the linear buffer of
+ * the whole sg entry in the kernel's direct map rather than
+ * within the mapped buffer of a single page, compute the
+ * address as an offset from the page_address() of the first
+ * page of the sg entry. Either way the result is the address
+ * in the direct map, but this makes it clearer what is really
+ * going on.
+ */
+ walk->__addr = page_address(base_page) + walk->offset;
+ }
}
/**
* scatterwalk_next() - Get the next data buffer in a scatterlist walk
* @walk: the scatter_walk
@@ -130,18 +135,18 @@ static inline void *scatterwalk_map(struct scatter_walk *walk)
static inline unsigned int scatterwalk_next(struct scatter_walk *walk,
unsigned int total)
{
unsigned int nbytes = scatterwalk_clamp(walk, total);
- walk->__addr = scatterwalk_map(walk);
+ scatterwalk_map(walk);
return nbytes;
}
-static inline void scatterwalk_unmap(const void *vaddr)
+static inline void scatterwalk_unmap(struct scatter_walk *walk)
{
if (IS_ENABLED(CONFIG_HIGHMEM))
- kunmap_local(vaddr);
+ kunmap_local(walk->__addr);
}
static inline void scatterwalk_advance(struct scatter_walk *walk,
unsigned int nbytes)
{
@@ -157,11 +162,11 @@ static inline void scatterwalk_advance(struct scatter_walk *walk,
* Use this if the mapped address was not written to, i.e. it is source data.
*/
static inline void scatterwalk_done_src(struct scatter_walk *walk,
unsigned int nbytes)
{
- scatterwalk_unmap(walk->addr);
+ scatterwalk_unmap(walk);
scatterwalk_advance(walk, nbytes);
}
/**
* scatterwalk_done_dst() - Finish one step of a walk of destination scatterlist
@@ -173,11 +178,11 @@ static inline void scatterwalk_done_src(struct scatter_walk *walk,
* destination data.
*/
static inline void scatterwalk_done_dst(struct scatter_walk *walk,
unsigned int nbytes)
{
- scatterwalk_unmap(walk->addr);
+ scatterwalk_unmap(walk);
/*
* Explicitly check ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE instead of just
* relying on flush_dcache_page() being a no-op when not implemented,
* since otherwise the BUG_ON in sg_page() does not get optimized out.
* This also avoids having to consider whether the loop would get