Commit e7d5d8a8 authored by Eric Biggers's avatar Eric Biggers Committed by Herbert Xu
Browse files

crypto: s390/aes-gcm - use the new scatterwalk functions



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: default avatarHarald Freudenberger <freude@linux.ibm.com>
Tested-by: default avatarHarald Freudenberger <freude@linux.ibm.com>
Cc: Holger Dengler <dengler@linux.ibm.com>
Cc: linux-s390@vger.kernel.org
Signed-off-by: default avatarEric Biggers <ebiggers@google.com>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent 422bf8fc
Loading
Loading
Loading
Loading
+13 −20
Original line number Diff line number Diff line
@@ -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)
	if (gw->walk_bytes_remain == 0)
		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);
	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;
}