crypto: scatterwalk - Add memcpy_sglist

Add memcpy_sglist which copies one SG list to another.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
Herbert Xu 2025-03-08 20:45:23 +08:00
parent 65775cf313
commit 131bdceca1
2 changed files with 30 additions and 0 deletions

View File

@ -86,6 +86,33 @@ void memcpy_to_sglist(struct scatterlist *sg, unsigned int start,
}
EXPORT_SYMBOL_GPL(memcpy_to_sglist);
void memcpy_sglist(struct scatterlist *dst, struct scatterlist *src,
unsigned int nbytes)
{
struct scatter_walk swalk;
struct scatter_walk dwalk;
if (unlikely(nbytes == 0)) /* in case sg == NULL */
return;
scatterwalk_start(&swalk, src);
scatterwalk_start(&dwalk, dst);
do {
unsigned int slen, dlen;
unsigned int len;
slen = scatterwalk_next(&swalk, nbytes);
dlen = scatterwalk_next(&dwalk, nbytes);
len = min(slen, dlen);
memcpy(dwalk.addr, swalk.addr, len);
scatterwalk_done_dst(&dwalk, len);
scatterwalk_done_src(&swalk, len);
nbytes -= len;
} while (nbytes);
}
EXPORT_SYMBOL_GPL(memcpy_sglist);
struct scatterlist *scatterwalk_ffwd(struct scatterlist dst[2],
struct scatterlist *src,
unsigned int len)

View File

@ -210,6 +210,9 @@ void memcpy_from_sglist(void *buf, struct scatterlist *sg,
void memcpy_to_sglist(struct scatterlist *sg, unsigned int start,
const void *buf, unsigned int nbytes);
void memcpy_sglist(struct scatterlist *dst, struct scatterlist *src,
unsigned int nbytes);
/* In new code, please use memcpy_{from,to}_sglist() directly instead. */
static inline void scatterwalk_map_and_copy(void *buf, struct scatterlist *sg,
unsigned int start,