git: 59a9cd98631c - stable/13 - linuxkpi: Fix return value of dma_map_sgtable
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Thu, 02 Feb 2023 11:14:33 UTC
The branch stable/13 has been updated by manu: URL: https://cgit.FreeBSD.org/src/commit/?id=59a9cd98631c026a4666e604752e99b04207d63c commit 59a9cd98631c026a4666e604752e99b04207d63c Author: Austin Shafer <ashafer@badland.io> AuthorDate: 2022-12-06 15:25:53 +0000 Commit: Emmanuel Vadot <manu@FreeBSD.org> CommitDate: 2023-02-02 11:10:36 +0000 linuxkpi: Fix return value of dma_map_sgtable dma_map_sgtable internally uses the dma_map_sg_attrs helper. The problem is that dma_map_sg_attrs returns the number of entries mapped, whereas dma_map_sgtable returns nonzero on failure. This leads to dma_map_sgtable returning non-zero-but-positive values which tricks other areas of the stack into thinking nents is a valid pointer. This checks if nents is valid and returns zero if so, updating the nents field in sgt. This fixes PRIME render offload with nvidia-drm. Fixes: 9202c95f47c2 ("linuxkpi: Add dma_{un,}map_sgtable") (cherry picked from commit 4085bde9fa2ea7ebe861a2e4a07312aac00a26fc) --- sys/compat/linuxkpi/common/include/linux/dma-mapping.h | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/sys/compat/linuxkpi/common/include/linux/dma-mapping.h b/sys/compat/linuxkpi/common/include/linux/dma-mapping.h index ef3570ef7639..25e4acf9e45d 100644 --- a/sys/compat/linuxkpi/common/include/linux/dma-mapping.h +++ b/sys/compat/linuxkpi/common/include/linux/dma-mapping.h @@ -358,7 +358,14 @@ dma_map_sgtable(struct device *dev, struct sg_table *sgt, unsigned long attrs) { - return (dma_map_sg_attrs(dev, sgt->sgl, sgt->nents, dir, attrs)); + int nents = dma_map_sg_attrs(dev, sgt->sgl, sgt->nents, dir, attrs); + + if (nents < 0) { + return nents; + } else { + sgt->nents = nents; + return 0; + } } static inline void