mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-09-18 22:14:16 +00:00
crypto: skcipher - Eliminate duplicate virt.addr field
Reuse the addr field from struct scatter_walk for skcipher_walk. Keep the existing virt.addr fields but make them const for the user to access the mapped address. Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
parent
131bdceca1
commit
db873be6f0
3 changed files with 36 additions and 24 deletions
|
@ -43,14 +43,12 @@ static inline void skcipher_map_src(struct skcipher_walk *walk)
|
|||
{
|
||||
/* XXX */
|
||||
walk->in.__addr = scatterwalk_map(&walk->in);
|
||||
walk->src.virt.addr = walk->in.addr;
|
||||
}
|
||||
|
||||
static inline void skcipher_map_dst(struct skcipher_walk *walk)
|
||||
{
|
||||
/* XXX */
|
||||
walk->out.__addr = scatterwalk_map(&walk->out);
|
||||
walk->dst.virt.addr = walk->out.addr;
|
||||
}
|
||||
|
||||
static inline gfp_t skcipher_walk_gfp(struct skcipher_walk *walk)
|
||||
|
@ -100,8 +98,7 @@ int skcipher_walk_done(struct skcipher_walk *walk, int res)
|
|||
SKCIPHER_WALK_DIFF)))) {
|
||||
scatterwalk_advance(&walk->in, n);
|
||||
} else if (walk->flags & SKCIPHER_WALK_DIFF) {
|
||||
scatterwalk_unmap(walk->src.virt.addr);
|
||||
scatterwalk_advance(&walk->in, n);
|
||||
scatterwalk_done_src(&walk->in, n);
|
||||
} else if (walk->flags & SKCIPHER_WALK_COPY) {
|
||||
scatterwalk_advance(&walk->in, n);
|
||||
skcipher_map_dst(walk);
|
||||
|
@ -116,11 +113,8 @@ int skcipher_walk_done(struct skcipher_walk *walk, int res)
|
|||
*/
|
||||
res = -EINVAL;
|
||||
total = 0;
|
||||
} else {
|
||||
u8 *buf = PTR_ALIGN(walk->buffer, walk->alignmask + 1);
|
||||
|
||||
memcpy_to_scatterwalk(&walk->out, buf, n);
|
||||
}
|
||||
} else
|
||||
memcpy_to_scatterwalk(&walk->out, walk->out.addr, n);
|
||||
goto dst_done;
|
||||
}
|
||||
|
||||
|
@ -162,7 +156,7 @@ static int skcipher_next_slow(struct skcipher_walk *walk, unsigned int bsize)
|
|||
{
|
||||
unsigned alignmask = walk->alignmask;
|
||||
unsigned n;
|
||||
u8 *buffer;
|
||||
void *buffer;
|
||||
|
||||
if (!walk->buffer)
|
||||
walk->buffer = walk->page;
|
||||
|
@ -176,10 +170,11 @@ static int skcipher_next_slow(struct skcipher_walk *walk, unsigned int bsize)
|
|||
return skcipher_walk_done(walk, -ENOMEM);
|
||||
walk->buffer = buffer;
|
||||
}
|
||||
walk->dst.virt.addr = PTR_ALIGN(buffer, alignmask + 1);
|
||||
walk->src.virt.addr = walk->dst.virt.addr;
|
||||
|
||||
memcpy_from_scatterwalk(walk->src.virt.addr, &walk->in, bsize);
|
||||
buffer = PTR_ALIGN(buffer, alignmask + 1);
|
||||
memcpy_from_scatterwalk(buffer, &walk->in, bsize);
|
||||
walk->out.__addr = buffer;
|
||||
walk->in.__addr = walk->out.addr;
|
||||
|
||||
walk->nbytes = bsize;
|
||||
walk->flags |= SKCIPHER_WALK_SLOW;
|
||||
|
@ -189,7 +184,7 @@ static int skcipher_next_slow(struct skcipher_walk *walk, unsigned int bsize)
|
|||
|
||||
static int skcipher_next_copy(struct skcipher_walk *walk)
|
||||
{
|
||||
u8 *tmp = walk->page;
|
||||
void *tmp = walk->page;
|
||||
|
||||
skcipher_map_src(walk);
|
||||
memcpy(tmp, walk->src.virt.addr, walk->nbytes);
|
||||
|
@ -199,8 +194,8 @@ static int skcipher_next_copy(struct skcipher_walk *walk)
|
|||
* processed (which might be less than walk->nbytes) is known.
|
||||
*/
|
||||
|
||||
walk->src.virt.addr = tmp;
|
||||
walk->dst.virt.addr = tmp;
|
||||
walk->in.__addr = tmp;
|
||||
walk->out.__addr = tmp;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -214,7 +209,7 @@ static int skcipher_next_fast(struct skcipher_walk *walk)
|
|||
(u8 *)(sg_page(walk->out.sg) + (walk->out.offset >> PAGE_SHIFT));
|
||||
|
||||
skcipher_map_dst(walk);
|
||||
walk->src.virt.addr = walk->dst.virt.addr;
|
||||
walk->in.__addr = walk->dst.virt.addr;
|
||||
|
||||
if (diff) {
|
||||
walk->flags |= SKCIPHER_WALK_DIFF;
|
||||
|
|
|
@ -107,14 +107,15 @@ struct crypto_queue {
|
|||
};
|
||||
|
||||
struct scatter_walk {
|
||||
struct scatterlist *sg;
|
||||
unsigned int offset;
|
||||
/* Must be the first member, see struct skcipher_walk. */
|
||||
union {
|
||||
void *const addr;
|
||||
|
||||
/* Private API field, do not touch. */
|
||||
union crypto_no_such_thing *__addr;
|
||||
};
|
||||
struct scatterlist *sg;
|
||||
unsigned int offset;
|
||||
};
|
||||
|
||||
struct crypto_attr_alg {
|
||||
|
|
|
@ -56,15 +56,31 @@ struct crypto_lskcipher_spawn {
|
|||
|
||||
struct skcipher_walk {
|
||||
union {
|
||||
/* Virtual address of the source. */
|
||||
struct {
|
||||
void *addr;
|
||||
} virt;
|
||||
} src, dst;
|
||||
struct {
|
||||
void *const addr;
|
||||
} virt;
|
||||
} src;
|
||||
|
||||
/* Private field for the API, do not use. */
|
||||
struct scatter_walk in;
|
||||
};
|
||||
|
||||
struct scatter_walk in;
|
||||
unsigned int nbytes;
|
||||
|
||||
struct scatter_walk out;
|
||||
union {
|
||||
/* Virtual address of the destination. */
|
||||
struct {
|
||||
struct {
|
||||
void *const addr;
|
||||
} virt;
|
||||
} dst;
|
||||
|
||||
/* Private field for the API, do not use. */
|
||||
struct scatter_walk out;
|
||||
};
|
||||
|
||||
unsigned int total;
|
||||
|
||||
u8 *page;
|
||||
|
|
Loading…
Add table
Reference in a new issue