Thank you for your contribution! Sashiko AI review found 1 potential issue(s) 
to consider:
- [Medium] drm/amdkfd: dma_map_page() fails on DAX ZONE_DEVICE pages with 
DMA_API_DEBUG
--

commit 0eacef2f328edc8a87aa6b82601cf66a9676e3be
Author: Matthew Krebs <[email protected]>

drm/amdkfd: Only take the VRAM path for KFD device pages in 
svm_range_dma_map_dev

This commit restricts the VRAM mapping branch in svm_range_dma_map_dev() to
device-private and device-coherent pages so that other ZONE_DEVICE pages, such
as fsdax and device-dax mappings, are DMA mapped instead of dereferencing a
potentially NULL prange->svm_bo.

> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_svm.c 
> b/drivers/gpu/drm/amd/amdkfd/kfd_svm.c
> index ed5e3318877be..354184829e1d6 100644
> --- a/drivers/gpu/drm/amd/amdkfd/kfd_svm.c
> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_svm.c
> @@ -180,7 +180,12 @@ svm_range_dma_map_dev(struct amdgpu_device *adev, struct 
> svm_range *prange,
>                       dma_unmap_page(dev, addr[i], PAGE_SIZE, dir);
>  
>               page = hmm_pfn_to_page(hmm_pfns[i]);
> -             if (is_zone_device_page(page)) {
> +             /*
> +              * Only KFD's own VRAM pages (device private or device coherent)
> +              * take the VRAM path. Other ZONE_DEVICE pages, such as fsdax or
> +              * device-dax memory, are system memory and are DMA mapped 
> below.
> +              */
> +             if (is_device_private_page(page) || 
> is_device_coherent_page(page)) {

[Severity: Medium]
When fsdax (MEMORY_DEVICE_FS_DAX) or device-dax (MEMORY_DEVICE_GENERIC) pages 
skip
this branch in drivers/gpu/drm/amd/amdkfd/kfd_svm.c:svm_range_dma_map_dev(), 
they
fall through to dma_map_page():

drivers/gpu/drm/amd/amdkfd/kfd_svm.c:svm_range_dma_map_dev() {
        ...
                if (is_device_private_page(page) || 
is_device_coherent_page(page)) {
                        ...
                        continue;
                }
                addr[i] = dma_map_page(dev, page, 0, PAGE_SIZE, dir);
        ...
}

In kernel/dma/mapping.c:dma_map_page_attrs(), all ZONE_DEVICE pages are rejected
when CONFIG_DMA_API_DEBUG is enabled:

kernel/dma/mapping.c:dma_map_page_attrs() {
        ...
        if (IS_ENABLED(CONFIG_DMA_API_DEBUG) &&
            WARN_ON_ONCE(is_zone_device_page(page)))
                return DMA_MAPPING_ERROR;
        ...
}

Won't mapping a fsdax or device-dax range through the KFD SVM ioctl
(kfd_ioctl_svm() -> svm_ioctl() -> svm_range_set_attr() ->
svm_range_validate_and_map() -> svm_range_dma_map() -> svm_range_dma_map_dev())
trigger this WARN_ON_ONCE() and fail with -ENOMEM when CONFIG_DMA_API_DEBUG is
enabled?

Should svm_range_dma_map_dev() and its unmap path use dma_map_phys() and
dma_unmap_phys() (similar to hmm_dma_map_pfn() in mm/hmm.c) instead of
dma_map_page() and dma_unmap_page() when mapping non-VRAM ZONE_DEVICE pages?

-- 
Sashiko AI review ยท 
https://sashiko.dev/#/patchset/[email protected]?part=1

Reply via email to