]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
crypto: scatterwalk - Add memcpy_sglist
authorHerbert Xu <herbert@gondor.apana.org.au>
Sat, 8 Mar 2025 12:45:23 +0000 (20:45 +0800)
committerHerbert Xu <herbert@gondor.apana.org.au>
Sat, 15 Mar 2025 08:21:22 +0000 (16:21 +0800)
Add memcpy_sglist which copies one SG list to another.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
crypto/scatterwalk.c
include/crypto/scatterwalk.h

index 20a28c6d94da2a206844933827f74a9761793fdc..8225801488d5c163ccb9a777b59d23de876334d7 100644 (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)
index 8523c7591d95c7e28ce9704984748dc583c01418..c62f47d04eb107a152ce38e4f6424b61b5a3723c 100644 (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,