aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAustin Shafer <ashafer@badland.io>2022-12-06 15:25:53 +0000
committerEmmanuel Vadot <manu@FreeBSD.org>2023-02-02 11:10:36 +0000
commit59a9cd98631c026a4666e604752e99b04207d63c (patch)
treea6081300c88823c063fa12effd552cbbe1f2e993
parent037902038e683877be09b043f49e31be32b47cc3 (diff)
downloadsrc-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.h9
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