diff options
| author | Lizhi Hou <lizhi.hou@amd.com> | 2026-04-13 11:02:38 -0700 |
|---|---|---|
| committer | Lizhi Hou <lizhi.hou@amd.com> | 2026-04-14 09:10:47 -0700 |
| commit | 1bcfa4c4e88a554d1b6f98f4e3f886288581cbb4 (patch) | |
| tree | fee63212257732fb286dbe9848be87b31687f525 | |
| parent | f604819d9cc9532f88bb4cbd76e7227532ce5abb (diff) | |
| download | linux-stable-1bcfa4c4e88a554d1b6f98f4e3f886288581cbb4.tar.gz linux-stable-1bcfa4c4e88a554d1b6f98f4e3f886288581cbb4.zip | |
accel/amdxdna: Fix iommu_map_sgtable() return value handling
iommu_map_sgtable() returns negative error codes on failure, but the
result is stored in an unsigned variable. This prevents proper error
detection.
Change the variable type to ssize_t so negative error values can be
handled correctly.
Fixes: ece3e8980907 ("accel/amdxdna: Allow forcing IOVA-based DMA via module parameter")
Reported-by: Dan Carpenter <error27@gmail.com>
Closes: https://lore.kernel.org/all/adk7kOUBwIyYnX1M@stanley.mountain/
Reviewed-by: Mario Limonciello (AMD) <superm1@kernel.org>
Signed-off-by: Wendy Liang <wendy.liang@amd.com>
Signed-off-by: Lizhi Hou <lizhi.hou@amd.com>
Link: https://patch.msgid.link/20260413180238.668441-1-lizhi.hou@amd.com
| -rw-r--r-- | drivers/accel/amdxdna/amdxdna_iommu.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/drivers/accel/amdxdna/amdxdna_iommu.c b/drivers/accel/amdxdna/amdxdna_iommu.c index 4626434d4180..2676cfcfabee 100644 --- a/drivers/accel/amdxdna/amdxdna_iommu.c +++ b/drivers/accel/amdxdna/amdxdna_iommu.c @@ -40,7 +40,7 @@ int amdxdna_iommu_map_bo(struct amdxdna_dev *xdna, struct amdxdna_gem_obj *abo) struct sg_table *sgt; dma_addr_t dma_addr; struct iova *iova; - size_t size; + ssize_t size; if (abo->type != AMDXDNA_BO_DEV_HEAP && abo->type != AMDXDNA_BO_SHMEM) return 0; @@ -65,7 +65,14 @@ int amdxdna_iommu_map_bo(struct amdxdna_dev *xdna, struct amdxdna_gem_obj *abo) size = iommu_map_sgtable(xdna->domain, dma_addr, sgt, IOMMU_READ | IOMMU_WRITE); + if (size < 0) { + XDNA_ERR(xdna, "iommu_map_sgtable failed: %zd", size); + __free_iova(&xdna->iovad, iova); + return size; + } + if (size < abo->mem.size) { + iommu_unmap(xdna->domain, dma_addr, size); __free_iova(&xdna->iovad, iova); return -ENXIO; } |
