On 8/13/26 09:46, Taimuraz Kaitmazov wrote:
amdxdna_gem_obj_vmap() takes whatever dma_buf_vmap() returns and only rejects a NULL vaddr. iosys_map is discriminated by is_iomem, so an exporter answering with an I/O mapping leaves a void __iomem pointer in abo->mem.kva, which amdxdna_cmd_set_error() memsets and memcpys through.
amdxdna_drm_va_tbl takes a dmabuf_fd, so such a BO can be any exporter's buffer. amdgpu cannot reach this: its .pin forces GTT for a non peer to peer attachment like ours. An exporter on drm_gem_prime_dmabuf_ops has no .pin, and drm_gem_ttm_vmap() answers iomem for a VRAM resident object, so an NPU paired with nouveau or radeon does.
Refuse the mapping. vmw_gem_vmap() does the same; unlike that one this path is reachable from an unprivileged ioctl, so it does not warn.
Signed-off-by: Taimuraz Kaitmazov taimuraz@kaitmazov.com
drivers/accel/amdxdna/amdxdna_gem.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/drivers/accel/amdxdna/amdxdna_gem.c b/drivers/accel/amdxdna/amdxdna_gem.c index 1f190b319bb..b66ec9e4828 100644 --- a/drivers/accel/amdxdna/amdxdna_gem.c +++ b/drivers/accel/amdxdna/amdxdna_gem.c @@ -683,10 +683,16 @@ static int amdxdna_gem_obj_vmap(struct drm_gem_object *obj, struct iosys_map *ma dma_resv_assert_held(obj->resv);
- if (is_import_bo(abo))
- if (is_import_bo(abo)) { ret = dma_buf_vmap(abo->dma_buf, map);
- else
/* Callers use mem.kva as an ordinary kernel address. */if (!ret && map->is_iomem) {dma_buf_vunmap(abo->dma_buf, map);return -EOPNOTSUPP;}
Thanks for the fix. The 'is_iomem' check should be moved to amdxdna_gem_vmap() to cover all the cases.
Lizhi
- } else { ret = drm_gem_shmem_object_vmap(obj, map);
- } if (ret) return ret; if (!map->vaddr)
linaro-mm-sig@lists.linaro.org