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 <[email protected]> --- 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; + } + } else { ret = drm_gem_shmem_object_vmap(obj, map); + } if (ret) return ret; if (!map->vaddr) -- 2.55.0
