]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
crypto: s390/aes-gcm - use the new scatterwalk functions
authorEric Biggers <ebiggers@google.com>
Wed, 19 Feb 2025 18:23:33 +0000 (10:23 -0800)
committerHerbert Xu <herbert@gondor.apana.org.au>
Sun, 2 Mar 2025 07:19:44 +0000 (15:19 +0800)
Use scatterwalk_next() which consolidates scatterwalk_clamp() and
scatterwalk_map().  Use scatterwalk_done_src() and
scatterwalk_done_dst() which consolidate scatterwalk_unmap(),
scatterwalk_advance(), and scatterwalk_done().

Besides the new functions being a bit easier to use, this is necessary
because scatterwalk_done() is planned to be removed.

Reviewed-by: Harald Freudenberger <freude@linux.ibm.com>
Tested-by: Harald Freudenberger <freude@linux.ibm.com>
Cc: Holger Dengler <dengler@linux.ibm.com>
Cc: linux-s390@vger.kernel.org
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
arch/s390/crypto/aes_s390.c

index 9c46b1b630b1ad3dc308fd137ec59fcfed6ba4f2..7fd303df05abda32862caa541d9bdd4ad9c86ba6 100644 (file)
@@ -787,28 +787,21 @@ static void gcm_walk_start(struct gcm_sg_walk *gw, struct scatterlist *sg,
 
 static inline unsigned int _gcm_sg_clamp_and_map(struct gcm_sg_walk *gw)
 {
-       struct scatterlist *nextsg;
-
-       gw->walk_bytes = scatterwalk_clamp(&gw->walk, gw->walk_bytes_remain);
-       while (!gw->walk_bytes) {
-               nextsg = sg_next(gw->walk.sg);
-               if (!nextsg)
-                       return 0;
-               scatterwalk_start(&gw->walk, nextsg);
-               gw->walk_bytes = scatterwalk_clamp(&gw->walk,
-                                                  gw->walk_bytes_remain);
-       }
-       gw->walk_ptr = scatterwalk_map(&gw->walk);
+       if (gw->walk_bytes_remain == 0)
+               return 0;
+       gw->walk_ptr = scatterwalk_next(&gw->walk, gw->walk_bytes_remain,
+                                       &gw->walk_bytes);
        return gw->walk_bytes;
 }
 
 static inline void _gcm_sg_unmap_and_advance(struct gcm_sg_walk *gw,
-                                            unsigned int nbytes)
+                                            unsigned int nbytes, bool out)
 {
        gw->walk_bytes_remain -= nbytes;
-       scatterwalk_unmap(gw->walk_ptr);
-       scatterwalk_advance(&gw->walk, nbytes);
-       scatterwalk_done(&gw->walk, 0, gw->walk_bytes_remain);
+       if (out)
+               scatterwalk_done_dst(&gw->walk, gw->walk_ptr, nbytes);
+       else
+               scatterwalk_done_src(&gw->walk, gw->walk_ptr, nbytes);
        gw->walk_ptr = NULL;
 }
 
@@ -844,7 +837,7 @@ static int gcm_in_walk_go(struct gcm_sg_walk *gw, unsigned int minbytesneeded)
                n = min(gw->walk_bytes, AES_BLOCK_SIZE - gw->buf_bytes);
                memcpy(gw->buf + gw->buf_bytes, gw->walk_ptr, n);
                gw->buf_bytes += n;
-               _gcm_sg_unmap_and_advance(gw, n);
+               _gcm_sg_unmap_and_advance(gw, n, false);
                if (gw->buf_bytes >= minbytesneeded) {
                        gw->ptr = gw->buf;
                        gw->nbytes = gw->buf_bytes;
@@ -904,7 +897,7 @@ static int gcm_in_walk_done(struct gcm_sg_walk *gw, unsigned int bytesdone)
                } else
                        gw->buf_bytes = 0;
        } else
-               _gcm_sg_unmap_and_advance(gw, bytesdone);
+               _gcm_sg_unmap_and_advance(gw, bytesdone, false);
 
        return bytesdone;
 }
@@ -922,10 +915,10 @@ static int gcm_out_walk_done(struct gcm_sg_walk *gw, unsigned int bytesdone)
                                return i;
                        n = min(gw->walk_bytes, bytesdone - i);
                        memcpy(gw->walk_ptr, gw->buf + i, n);
-                       _gcm_sg_unmap_and_advance(gw, n);
+                       _gcm_sg_unmap_and_advance(gw, n, true);
                }
        } else
-               _gcm_sg_unmap_and_advance(gw, bytesdone);
+               _gcm_sg_unmap_and_advance(gw, bytesdone, true);
 
        return bytesdone;
 }