diff options
author | Austin Shafer <ashafer@badland.io> | 2022-12-06 15:25:53 +0000 |
---|---|---|
committer | Emmanuel Vadot <manu@FreeBSD.org> | 2023-02-02 11:10:36 +0000 |
commit | 59a9cd98631c026a4666e604752e99b04207d63c (patch) | |
tree | a6081300c88823c063fa12effd552cbbe1f2e993 | |
parent | 037902038e683877be09b043f49e31be32b47cc3 (diff) | |
download | src-59a9cd98631c026a4666e604752e99b04207d63c.tar.gz src-59a9cd98631c026a4666e604752e99b04207d63c.zip |
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)
-rw-r--r-- | sys/compat/linuxkpi/common/include/linux/dma-mapping.h | 9 |
1 files changed, 8 insertions, 1 deletions
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 |