Message ID | 20250427111236.25668-1-clabbe.montjoie@gmail.com |
---|---|
State | New |
Headers | show |
Series | [RESEND] crypto: sun8i-ss: do not use sg_dma_len before calling DMA functions | expand |
Hi, On 4/27/25 2:12 PM, Corentin Labbe wrote: > When testing sun8i-ss with multi_v7_defconfig, all CBC algorithm fail crypto > selftests. > This is strange since on sunxi_defconfig, everything was ok. > The problem was in the IV setup loop which never run because sg_dma_len > was 0. > > Fixes: 359e893e8af4 ("crypto: sun8i-ss - rework handling of IV") > Signed-off-by: Corentin Labbe <clabbe.montjoie@gmail.com> > --- > > If someone know why sunxi_defconfig have sg_dma_len() which always works > even with any DMA call not done. > It seems that sunxi_defconfig has CONFIG_NEED_SG_DMA_LENGTH disabled, so sg_dma_len() defaults to sg->length.
On Sun, Apr 27, 2025 at 09:23:40PM +0300, Ovidiu Panait wrote: > > On the other hand, multi_v7_defconfig has CONFIG_NEED_SG_DMA_LENGTH > enabled, so sg_dma_len(sg) defaults to sg->dma_length and it would need > to be used after calling dma_map_sg() (as indicated in the comment from > include/linux/scatterlist.h). In general, only use sg_dma_len if you are mapping an entire SG list with dma_map_sg. If you're using dma_map_single, do not use sg_dma_len. This is because dma_map_sg will try to merge entries together, thus creating an sg_dma_len that is bigger than the original (and reducing the SG list length accordingly). OTOH dma_map_single can't possibly do that. Cheers,
On Sun, Apr 27, 2025 at 01:12:36PM +0200, Corentin Labbe wrote: > When testing sun8i-ss with multi_v7_defconfig, all CBC algorithm fail crypto > selftests. > This is strange since on sunxi_defconfig, everything was ok. > The problem was in the IV setup loop which never run because sg_dma_len > was 0. > > Fixes: 359e893e8af4 ("crypto: sun8i-ss - rework handling of IV") > Signed-off-by: Corentin Labbe <clabbe.montjoie@gmail.com> > --- > > If someone know why sunxi_defconfig have sg_dma_len() which always works > even with any DMA call not done. > > drivers/crypto/allwinner/sun8i-ss/sun8i-ss-cipher.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) Patch applied. Thanks.
diff --git a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-cipher.c b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-cipher.c index 4caf17310e90..ddec1b08d4f6 100644 --- a/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-cipher.c +++ b/drivers/crypto/allwinner/sun8i-ss/sun8i-ss-cipher.c @@ -141,7 +141,7 @@ static int sun8i_ss_setup_ivs(struct skcipher_request *areq) /* we need to copy all IVs from source in case DMA is bi-directionnal */ while (sg && len) { - if (sg_dma_len(sg) == 0) { + if (sg->length == 0) { sg = sg_next(sg); continue; }
When testing sun8i-ss with multi_v7_defconfig, all CBC algorithm fail crypto selftests. This is strange since on sunxi_defconfig, everything was ok. The problem was in the IV setup loop which never run because sg_dma_len was 0. Fixes: 359e893e8af4 ("crypto: sun8i-ss - rework handling of IV") Signed-off-by: Corentin Labbe <clabbe.montjoie@gmail.com> --- If someone know why sunxi_defconfig have sg_dma_len() which always works even with any DMA call not done. drivers/crypto/allwinner/sun8i-ss/sun8i-ss-cipher.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)