* [PATCH] crypto: scatterwalk - Add memcpy_sglist
@ 2025-03-06 3:03 Herbert Xu
2025-03-06 3:13 ` Eric Biggers
0 siblings, 1 reply; 6+ messages in thread
From: Herbert Xu @ 2025-03-06 3:03 UTC (permalink / raw)
To: Linux Crypto Mailing List
Add memcpy_sglist which copies one SG list to another.
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
---
crypto/scatterwalk.c | 27 +++++++++++++++++++++++++++
include/crypto/scatterwalk.h | 3 +++
2 files changed, 30 insertions(+)
diff --git a/crypto/scatterwalk.c b/crypto/scatterwalk.c
index 20a28c6d94da..e57ce08e0d8d 100644
--- a/crypto/scatterwalk.c
+++ b/crypto/scatterwalk.c
@@ -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_src(&swalk, len);
+ scatterwalk_done_dst(&dwalk, len);
+ nbytes -= len;
+ } while (nbytes);
+}
+EXPORT_SYMBOL_GPL(memcpy_sglist);
+
struct scatterlist *scatterwalk_ffwd(struct scatterlist dst[2],
struct scatterlist *src,
unsigned int len)
diff --git a/include/crypto/scatterwalk.h b/include/crypto/scatterwalk.h
index 40c3c629e27f..1201543295f9 100644
--- a/include/crypto/scatterwalk.h
+++ b/include/crypto/scatterwalk.h
@@ -208,6 +208,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,
--
2.39.5
--
Email: Herbert Xu <herbert@gondor.apana.org.au>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH] crypto: scatterwalk - Add memcpy_sglist
2025-03-06 3:03 [PATCH] crypto: scatterwalk - Add memcpy_sglist Herbert Xu
@ 2025-03-06 3:13 ` Eric Biggers
2025-03-06 3:20 ` [v2 PATCH] " Herbert Xu
0 siblings, 1 reply; 6+ messages in thread
From: Eric Biggers @ 2025-03-06 3:13 UTC (permalink / raw)
To: Herbert Xu; +Cc: Linux Crypto Mailing List
On Thu, Mar 06, 2025 at 11:03:22AM +0800, Herbert Xu wrote:
> +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_src(&swalk, len);
> + scatterwalk_done_dst(&dwalk, len);
> + nbytes -= len;
> + } while (nbytes);
> +}
> +EXPORT_SYMBOL_GPL(memcpy_sglist);
Local kmaps must be released in reverse order of the mapping, so
scatterwalk_done_dst() must be done before scatterwalk_done_src() above.
- Eric
^ permalink raw reply [flat|nested] 6+ messages in thread
* [v2 PATCH] crypto: scatterwalk - Add memcpy_sglist
2025-03-06 3:13 ` Eric Biggers
@ 2025-03-06 3:20 ` Herbert Xu
2025-03-06 3:33 ` [v3 " Herbert Xu
0 siblings, 1 reply; 6+ messages in thread
From: Herbert Xu @ 2025-03-06 3:20 UTC (permalink / raw)
To: Eric Biggers; +Cc: Linux Crypto Mailing List
On Wed, Mar 05, 2025 at 07:13:59PM -0800, Eric Biggers wrote:
>
> Local kmaps must be released in reverse order of the mapping, so
> scatterwalk_done_dst() must be done before scatterwalk_done_src() above.
Good catch. Thanks for the review!
---8<---
Add memcpy_sglist which copies one SG list to another.
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
---
crypto/scatterwalk.c | 27 +++++++++++++++++++++++++++
include/crypto/scatterwalk.h | 3 +++
2 files changed, 30 insertions(+)
diff --git a/crypto/scatterwalk.c b/crypto/scatterwalk.c
index 20a28c6d94da..e57ce08e0d8d 100644
--- a/crypto/scatterwalk.c
+++ b/crypto/scatterwalk.c
@@ -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_src(&swalk, len);
+ scatterwalk_done_dst(&dwalk, len);
+ nbytes -= len;
+ } while (nbytes);
+}
+EXPORT_SYMBOL_GPL(memcpy_sglist);
+
struct scatterlist *scatterwalk_ffwd(struct scatterlist dst[2],
struct scatterlist *src,
unsigned int len)
diff --git a/include/crypto/scatterwalk.h b/include/crypto/scatterwalk.h
index 40c3c629e27f..1201543295f9 100644
--- a/include/crypto/scatterwalk.h
+++ b/include/crypto/scatterwalk.h
@@ -208,6 +208,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,
--
2.39.5
--
Email: Herbert Xu <herbert@gondor.apana.org.au>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [v3 PATCH] crypto: scatterwalk - Add memcpy_sglist
2025-03-06 3:20 ` [v2 PATCH] " Herbert Xu
@ 2025-03-06 3:33 ` Herbert Xu
2025-03-07 4:22 ` kernel test robot
2025-03-07 4:22 ` kernel test robot
0 siblings, 2 replies; 6+ messages in thread
From: Herbert Xu @ 2025-03-06 3:33 UTC (permalink / raw)
To: Eric Biggers; +Cc: Linux Crypto Mailing List
On Thu, Mar 06, 2025 at 11:20:25AM +0800, Herbert Xu wrote:
>
> Good catch. Thanks for the review!
Oops, I didn't actually commit before resending:
---8<---
Add memcpy_sglist which copies one SG list to another.
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
---
crypto/scatterwalk.c | 27 +++++++++++++++++++++++++++
include/crypto/scatterwalk.h | 3 +++
2 files changed, 30 insertions(+)
diff --git a/crypto/scatterwalk.c b/crypto/scatterwalk.c
index 20a28c6d94da..8225801488d5 100644
--- a/crypto/scatterwalk.c
+++ b/crypto/scatterwalk.c
@@ -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)
diff --git a/include/crypto/scatterwalk.h b/include/crypto/scatterwalk.h
index 40c3c629e27f..1201543295f9 100644
--- a/include/crypto/scatterwalk.h
+++ b/include/crypto/scatterwalk.h
@@ -208,6 +208,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,
--
2.39.5
--
Email: Herbert Xu <herbert@gondor.apana.org.au>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [v3 PATCH] crypto: scatterwalk - Add memcpy_sglist
2025-03-06 3:33 ` [v3 " Herbert Xu
@ 2025-03-07 4:22 ` kernel test robot
2025-03-07 4:22 ` kernel test robot
1 sibling, 0 replies; 6+ messages in thread
From: kernel test robot @ 2025-03-07 4:22 UTC (permalink / raw)
To: Herbert Xu, Eric Biggers; +Cc: llvm, oe-kbuild-all, Linux Crypto Mailing List
Hi Herbert,
kernel test robot noticed the following build errors:
[auto build test ERROR on herbert-cryptodev-2.6/master]
[also build test ERROR on next-20250306]
[cannot apply to linus/master v6.14-rc5]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Herbert-Xu/crypto-scatterwalk-Add-memcpy_sglist/20250306-113457
base: https://git.kernel.org/pub/scm/linux/kernel/git/herbert/cryptodev-2.6.git master
patch link: https://lore.kernel.org/r/Z8kXhLb681E_FLzs%40gondor.apana.org.au
patch subject: [v3 PATCH] crypto: scatterwalk - Add memcpy_sglist
config: i386-buildonly-randconfig-002-20250307 (https://download.01.org/0day-ci/archive/20250307/202503071218.9J2sUblV-lkp@intel.com/config)
compiler: clang version 19.1.7 (https://github.com/llvm/llvm-project cd708029e0b2869e80abe31ddb175f7c35361f90)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250307/202503071218.9J2sUblV-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202503071218.9J2sUblV-lkp@intel.com/
All errors (new ones prefixed by >>):
>> crypto/scatterwalk.c:107:41: error: too few arguments to function call, expected 3, have 2
107 | slen = scatterwalk_next(&swalk, nbytes);
| ~~~~~~~~~~~~~~~~ ^
include/crypto/scatterwalk.h:129:21: note: 'scatterwalk_next' declared here
129 | static inline void *scatterwalk_next(struct scatter_walk *walk,
| ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~
130 | unsigned int total,
| ~~~~~~~~~~~~~~~~~~~
131 | unsigned int *nbytes_ret)
| ~~~~~~~~~~~~~~~~~~~~~~~~
crypto/scatterwalk.c:108:41: error: too few arguments to function call, expected 3, have 2
108 | dlen = scatterwalk_next(&dwalk, nbytes);
| ~~~~~~~~~~~~~~~~ ^
include/crypto/scatterwalk.h:129:21: note: 'scatterwalk_next' declared here
129 | static inline void *scatterwalk_next(struct scatter_walk *walk,
| ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~
130 | unsigned int total,
| ~~~~~~~~~~~~~~~~~~~
131 | unsigned int *nbytes_ret)
| ~~~~~~~~~~~~~~~~~~~~~~~~
>> crypto/scatterwalk.c:110:16: error: no member named 'addr' in 'struct scatter_walk'
110 | memcpy(dwalk.addr, swalk.addr, len);
| ~~~~~ ^
arch/x86/include/asm/string_32.h:150:42: note: expanded from macro 'memcpy'
150 | #define memcpy(t, f, n) __builtin_memcpy(t, f, n)
| ^
crypto/scatterwalk.c:110:28: error: no member named 'addr' in 'struct scatter_walk'
110 | memcpy(dwalk.addr, swalk.addr, len);
| ~~~~~ ^
arch/x86/include/asm/string_32.h:150:45: note: expanded from macro 'memcpy'
150 | #define memcpy(t, f, n) __builtin_memcpy(t, f, n)
| ^
crypto/scatterwalk.c:111:35: error: too few arguments to function call, expected 3, have 2
111 | scatterwalk_done_dst(&dwalk, len);
| ~~~~~~~~~~~~~~~~~~~~ ^
include/crypto/scatterwalk.h:174:20: note: 'scatterwalk_done_dst' declared here
174 | static inline void scatterwalk_done_dst(struct scatter_walk *walk,
| ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~
175 | void *vaddr, unsigned int nbytes)
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
crypto/scatterwalk.c:112:35: error: too few arguments to function call, expected 3, have 2
112 | scatterwalk_done_src(&swalk, len);
| ~~~~~~~~~~~~~~~~~~~~ ^
include/crypto/scatterwalk.h:158:20: note: 'scatterwalk_done_src' declared here
158 | static inline void scatterwalk_done_src(struct scatter_walk *walk,
| ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~
159 | const void *vaddr, unsigned int nbytes)
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
6 errors generated.
vim +107 crypto/scatterwalk.c
90
91 void memcpy_sglist(struct scatterlist *dst, struct scatterlist *src,
92 unsigned int nbytes)
93 {
94 struct scatter_walk swalk;
95 struct scatter_walk dwalk;
96
97 if (unlikely(nbytes == 0)) /* in case sg == NULL */
98 return;
99
100 scatterwalk_start(&swalk, src);
101 scatterwalk_start(&dwalk, dst);
102
103 do {
104 unsigned int slen, dlen;
105 unsigned int len;
106
> 107 slen = scatterwalk_next(&swalk, nbytes);
108 dlen = scatterwalk_next(&dwalk, nbytes);
109 len = min(slen, dlen);
> 110 memcpy(dwalk.addr, swalk.addr, len);
111 scatterwalk_done_dst(&dwalk, len);
112 scatterwalk_done_src(&swalk, len);
113 nbytes -= len;
114 } while (nbytes);
115 }
116 EXPORT_SYMBOL_GPL(memcpy_sglist);
117
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [v3 PATCH] crypto: scatterwalk - Add memcpy_sglist
2025-03-06 3:33 ` [v3 " Herbert Xu
2025-03-07 4:22 ` kernel test robot
@ 2025-03-07 4:22 ` kernel test robot
1 sibling, 0 replies; 6+ messages in thread
From: kernel test robot @ 2025-03-07 4:22 UTC (permalink / raw)
To: Herbert Xu, Eric Biggers; +Cc: oe-kbuild-all, Linux Crypto Mailing List
Hi Herbert,
kernel test robot noticed the following build errors:
[auto build test ERROR on herbert-cryptodev-2.6/master]
[also build test ERROR on next-20250306]
[cannot apply to linus/master v6.14-rc5]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Herbert-Xu/crypto-scatterwalk-Add-memcpy_sglist/20250306-113457
base: https://git.kernel.org/pub/scm/linux/kernel/git/herbert/cryptodev-2.6.git master
patch link: https://lore.kernel.org/r/Z8kXhLb681E_FLzs%40gondor.apana.org.au
patch subject: [v3 PATCH] crypto: scatterwalk - Add memcpy_sglist
config: i386-buildonly-randconfig-003-20250307 (https://download.01.org/0day-ci/archive/20250307/202503071259.oCOdlrcI-lkp@intel.com/config)
compiler: gcc-11 (Debian 11.3.0-12) 11.3.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250307/202503071259.oCOdlrcI-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202503071259.oCOdlrcI-lkp@intel.com/
All error/warnings (new ones prefixed by >>):
crypto/scatterwalk.c: In function 'memcpy_sglist':
>> crypto/scatterwalk.c:107:24: error: too few arguments to function 'scatterwalk_next'
107 | slen = scatterwalk_next(&swalk, nbytes);
| ^~~~~~~~~~~~~~~~
In file included from crypto/scatterwalk.c:12:
include/crypto/scatterwalk.h:129:21: note: declared here
129 | static inline void *scatterwalk_next(struct scatter_walk *walk,
| ^~~~~~~~~~~~~~~~
crypto/scatterwalk.c:108:24: error: too few arguments to function 'scatterwalk_next'
108 | dlen = scatterwalk_next(&dwalk, nbytes);
| ^~~~~~~~~~~~~~~~
In file included from crypto/scatterwalk.c:12:
include/crypto/scatterwalk.h:129:21: note: declared here
129 | static inline void *scatterwalk_next(struct scatter_walk *walk,
| ^~~~~~~~~~~~~~~~
In file included from arch/x86/include/asm/string.h:3,
from include/linux/string.h:65,
from arch/x86/include/asm/page_32.h:18,
from arch/x86/include/asm/page.h:14,
from arch/x86/include/asm/thread_info.h:12,
from include/linux/thread_info.h:60,
from include/linux/spinlock.h:60,
from include/linux/swait.h:7,
from include/linux/completion.h:12,
from include/linux/crypto.h:15,
from include/crypto/algapi.h:13,
from include/crypto/scatterwalk.h:14,
from crypto/scatterwalk.c:12:
>> crypto/scatterwalk.c:110:29: error: 'struct scatter_walk' has no member named 'addr'
110 | memcpy(dwalk.addr, swalk.addr, len);
| ^
arch/x86/include/asm/string_32.h:150:42: note: in definition of macro 'memcpy'
150 | #define memcpy(t, f, n) __builtin_memcpy(t, f, n)
| ^
crypto/scatterwalk.c:110:41: error: 'struct scatter_walk' has no member named 'addr'
110 | memcpy(dwalk.addr, swalk.addr, len);
| ^
arch/x86/include/asm/string_32.h:150:45: note: in definition of macro 'memcpy'
150 | #define memcpy(t, f, n) __builtin_memcpy(t, f, n)
| ^
>> crypto/scatterwalk.c:111:46: warning: passing argument 2 of 'scatterwalk_done_dst' makes pointer from integer without a cast [-Wint-conversion]
111 | scatterwalk_done_dst(&dwalk, len);
| ^~~
| |
| unsigned int
In file included from crypto/scatterwalk.c:12:
include/crypto/scatterwalk.h:175:47: note: expected 'void *' but argument is of type 'unsigned int'
175 | void *vaddr, unsigned int nbytes)
| ~~~~~~^~~~~
>> crypto/scatterwalk.c:111:17: error: too few arguments to function 'scatterwalk_done_dst'
111 | scatterwalk_done_dst(&dwalk, len);
| ^~~~~~~~~~~~~~~~~~~~
In file included from crypto/scatterwalk.c:12:
include/crypto/scatterwalk.h:174:20: note: declared here
174 | static inline void scatterwalk_done_dst(struct scatter_walk *walk,
| ^~~~~~~~~~~~~~~~~~~~
>> crypto/scatterwalk.c:112:46: warning: passing argument 2 of 'scatterwalk_done_src' makes pointer from integer without a cast [-Wint-conversion]
112 | scatterwalk_done_src(&swalk, len);
| ^~~
| |
| unsigned int
In file included from crypto/scatterwalk.c:12:
include/crypto/scatterwalk.h:159:53: note: expected 'const void *' but argument is of type 'unsigned int'
159 | const void *vaddr, unsigned int nbytes)
| ~~~~~~~~~~~~^~~~~
>> crypto/scatterwalk.c:112:17: error: too few arguments to function 'scatterwalk_done_src'
112 | scatterwalk_done_src(&swalk, len);
| ^~~~~~~~~~~~~~~~~~~~
In file included from crypto/scatterwalk.c:12:
include/crypto/scatterwalk.h:158:20: note: declared here
158 | static inline void scatterwalk_done_src(struct scatter_walk *walk,
| ^~~~~~~~~~~~~~~~~~~~
vim +/scatterwalk_next +107 crypto/scatterwalk.c
> 12 #include <crypto/scatterwalk.h>
13 #include <linux/kernel.h>
14 #include <linux/mm.h>
15 #include <linux/module.h>
16 #include <linux/scatterlist.h>
17
18 void scatterwalk_skip(struct scatter_walk *walk, unsigned int nbytes)
19 {
20 struct scatterlist *sg = walk->sg;
21
22 nbytes += walk->offset - sg->offset;
23
24 while (nbytes > sg->length) {
25 nbytes -= sg->length;
26 sg = sg_next(sg);
27 }
28 walk->sg = sg;
29 walk->offset = sg->offset + nbytes;
30 }
31 EXPORT_SYMBOL_GPL(scatterwalk_skip);
32
33 inline void memcpy_from_scatterwalk(void *buf, struct scatter_walk *walk,
34 unsigned int nbytes)
35 {
36 do {
37 const void *src_addr;
38 unsigned int to_copy;
39
40 src_addr = scatterwalk_next(walk, nbytes, &to_copy);
41 memcpy(buf, src_addr, to_copy);
42 scatterwalk_done_src(walk, src_addr, to_copy);
43 buf += to_copy;
44 nbytes -= to_copy;
45 } while (nbytes);
46 }
47 EXPORT_SYMBOL_GPL(memcpy_from_scatterwalk);
48
49 inline void memcpy_to_scatterwalk(struct scatter_walk *walk, const void *buf,
50 unsigned int nbytes)
51 {
52 do {
53 void *dst_addr;
54 unsigned int to_copy;
55
56 dst_addr = scatterwalk_next(walk, nbytes, &to_copy);
57 memcpy(dst_addr, buf, to_copy);
58 scatterwalk_done_dst(walk, dst_addr, to_copy);
59 buf += to_copy;
60 nbytes -= to_copy;
61 } while (nbytes);
62 }
63 EXPORT_SYMBOL_GPL(memcpy_to_scatterwalk);
64
65 void memcpy_from_sglist(void *buf, struct scatterlist *sg,
66 unsigned int start, unsigned int nbytes)
67 {
68 struct scatter_walk walk;
69
70 if (unlikely(nbytes == 0)) /* in case sg == NULL */
71 return;
72
73 scatterwalk_start_at_pos(&walk, sg, start);
74 memcpy_from_scatterwalk(buf, &walk, nbytes);
75 }
76 EXPORT_SYMBOL_GPL(memcpy_from_sglist);
77
78 void memcpy_to_sglist(struct scatterlist *sg, unsigned int start,
79 const void *buf, unsigned int nbytes)
80 {
81 struct scatter_walk walk;
82
83 if (unlikely(nbytes == 0)) /* in case sg == NULL */
84 return;
85
86 scatterwalk_start_at_pos(&walk, sg, start);
87 memcpy_to_scatterwalk(&walk, buf, nbytes);
88 }
89 EXPORT_SYMBOL_GPL(memcpy_to_sglist);
90
91 void memcpy_sglist(struct scatterlist *dst, struct scatterlist *src,
92 unsigned int nbytes)
93 {
94 struct scatter_walk swalk;
95 struct scatter_walk dwalk;
96
97 if (unlikely(nbytes == 0)) /* in case sg == NULL */
98 return;
99
100 scatterwalk_start(&swalk, src);
101 scatterwalk_start(&dwalk, dst);
102
103 do {
104 unsigned int slen, dlen;
105 unsigned int len;
106
> 107 slen = scatterwalk_next(&swalk, nbytes);
108 dlen = scatterwalk_next(&dwalk, nbytes);
109 len = min(slen, dlen);
> 110 memcpy(dwalk.addr, swalk.addr, len);
> 111 scatterwalk_done_dst(&dwalk, len);
> 112 scatterwalk_done_src(&swalk, len);
113 nbytes -= len;
114 } while (nbytes);
115 }
116 EXPORT_SYMBOL_GPL(memcpy_sglist);
117
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2025-03-07 4:22 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-03-06 3:03 [PATCH] crypto: scatterwalk - Add memcpy_sglist Herbert Xu
2025-03-06 3:13 ` Eric Biggers
2025-03-06 3:20 ` [v2 PATCH] " Herbert Xu
2025-03-06 3:33 ` [v3 " Herbert Xu
2025-03-07 4:22 ` kernel test robot
2025-03-07 4:22 ` kernel test robot
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox