From: "Huang, Honglei" <honghuan@amd.com>
To: Akihiko Odaki <odaki@rsg.ci.i.u-tokyo.ac.jp>,
dmitry.osipenko@collabora.com, airlied@redhat.com,
kraxel@redhat.com
Cc: gurchetansingh@chromium.org, olvaffe@gmail.com,
Ray.Huang@amd.com, dri-devel@lists.freedesktop.org,
virtualization@lists.linux.dev, linux-kernel@vger.kernel.org,
Felix Kuehling <Felix.Kuehling@amd.com>,
amd-gfx@lists.freedesktop.org
Subject: Re: [RFC PATCH v9 3/4] drm/virtio: implement userptr resource support
Date: Tue, 29 Sep 2026 10:22:41 +0800 [thread overview]
Message-ID: <ae305517-e678-4ac3-93d3-f250bd37b2be@amd.com> (raw)
In-Reply-To: <47d7114c-f035-4628-a911-c7ab30d55a75@rsg.ci.i.u-tokyo.ac.jp>
On 9/29/2026 1:25 AM, Akihiko Odaki wrote:
> On 2026/09/29 1:22, Huang, Honglei wrote:
>>
>>
>> On 9/26/2026 7:33 PM, Akihiko Odaki wrote:
>>> On 2026/09/24 18:55, Honglei Huang wrote:
>>>> Add userptr blob objects so the guest kernel can pin an existing
>>>> userspace mapping and advertise it as CREATE_BLOB backing entries.
>>>>
>>>> - New virtio_gpu_object_userptr type for userptr resources
>>>> - Pin pages with pin_user_pages_fast() and FOLL_LONGTERM
>>>> - Omit FOLL_WRITE when VIRTGPU_BLOB_FLAG_USE_READONLY is set
>>>> - Charge FOLL_LONGTERM pins against RLIMIT_MEMLOCK
>>>> - DMA-map the scatterlist only when virtio_gpu_use_dma_api() is
>>>> required; use DMA_TO_DEVICE for USE_READONLY blobs
>>>> - Mark writable pages dirty when unpinning
>>>> - Keep pages pinned until RESOURCE_UNREF is queued; drop them from
>>>> cleanup_object() on the unref response or on create failure
>>>> - Clear userptr->pages on pin failure to avoid double-free on cleanup
>>>> - Reject unaligned or overflowing userptr ranges at create time
>>>> - Disallow PRIME export of userptr objects
>>>> - Save CREATE_BLOB params and restore userptr resources after
>>>> hibernation without using the shmem restore path
>>>>
>>>> The hibernation restore path maps with the same attrs and direction
>>>> used at create time, as documented next to the call. Like shmem
>>>> blobs, the DMA API can still bounce through a buffer there. This
>>>> design only avoids a second guest side shmem allocation and memcpy,
>>>> nothing more.
>>>
>>> I don't see the restore path is documented though this says
>>> "documented next to the call".
>>
>> Will fix in next version
>>
>>>
>>>>
>> ...
>>>> + goto err_cleanup;
>>>> + }
>>>> +
>>>> + userptr->sgt = sgt;
>>>> +
>>>> + if (virtio_gpu_use_dma_api(vgdev->vdev)) {
>>>> + enum dma_data_direction dir =
>>>> + (userptr->flags & VIRTGPU_BLOB_FLAG_USE_READONLY) ?
>>>> + DMA_TO_DEVICE : DMA_BIDIRECTIONAL;
>>>> +
>>>> + ret = dma_map_sgtable(drm_dev_dma_dev(vgdev->ddev), sgt,
>>>> + dir, 0);
>>>
>>> I checked the ROCm code and documentation, and I do not see how this
>>> mapping satisfies the HIP coherence contract when bounce buffers or
>>> explicit DMA cache maintenance are required.
>>>
>>> HIP distinguishes two coherence models:
>>>
>>> > Coarse-grained coherence: The memory is considered up-to-date only
>>> > after synchronization performed using hipDeviceSynchronize(),
>>> > hipStreamSynchronize(), or any blocking operation that acts on the
>>> > null stream such as hipMemcpy(). To avoid the cache from being
>>> > accessed by a part of the system while simultaneously being
>>> written by
>>> > another, the memory is made visible only after the caches have been
>>> > flushed.
>>> >
>>> > Fine-grained coherence: The memory is coherent even while being
>>> > modified by a part of the system. Fine-grained coherence ensures that
>>> > up-to-date data is visible to others regardless of kernel boundaries.
>>> > This can be useful if both host and device operate on the same data.
>>>
>>> https://rocm.docs.amd.com/projects/HIP/en/docs-10.0.0/how-to/
>>> hip_runtime_api/memory_management/coherence_control.html
>>>
>>> Fine-grained access requires coherence throughout execution; copying
>>> between the original pages and a bounce buffer only at kernel boundaries
>>> would not suffice. Coarse-grained access could support such copies, but
>>> they must occur at the required synchronization points. I found no code
>>> that synchronizes this DMA mapping at those points.
>>>
>>
>> Whether dma_map_sgtable() bounces is decided by the platform's IOMMU/
>> SWIOTLB behind the device, not by we request. attrs=0 here just
>> matches the existing shmem blob path, and is exactly what native (non-
>> virtualized) ROCm's own userptr support does too:
>>
>> // drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c,
>> kfd_mem_dmamap_userptr()
>> ret = dma_map_sgtable(adev->dev, ttm->sg, direction, 0);
>>
>> And HIP's coarse-grained/fine-grained coherence isn't a DMA layer
>> property, it is a GPU VM/cache thing. In upstream KFD it's implemented
>> as GPU MMU page table attributes (MTYPE_CC/MTYPE_RW, the SNOOPED bit),
>> set by whichever driver programs the real GPU's page tables for this
>> memory:
>>
>> // drivers/gpu/drm/amd/amdkfd/kfd_svm.c, svm_range_get_pte_flags()
>> mapping_flags |= coherent ? AMDGPU_VM_MTYPE_CC : AMDGPU_VM_MTYPE_RW;
>> pte_flags |= snoop ? AMDGPU_PTE_SNOOPED : 0;
>>
>> I really want to disable the bounce buffers in DMA, but it is a
>> platform behaviour, can not disable it in this layer. And in XEN, the
>> dmapping for it is another form of iovector/simple sgtable. And if use
>> the virtio-iommu or somthing else, the efficiency and the complexity
>> of driver integration are both lower than using iovector/sgtable
>> directly.
>> And for how to handle the DMA thing for userptr, since we have so many
>> concern about it, maybe we can drop this part in next version. But we
>> may have the AI review warn/error.
>
> Documentation/core-api/dma-attributes.rst says:
>
> > DMA_ATTR_REQUIRE_COHERENT
> > -------------------------
> >
> > DMA mapping requests with the DMA_ATTR_REQUIRE_COHERENT fail on any
> > system where SWIOTLB or cache management is required. This should only
> > be used to support uAPI designs that require continuous HW DMA
> > coherence with userspace processes, for example RDMA and DRM. At a
> > minimum the memory being mapped must be userspace memory from
> > pin_user_pages() or similar.
> >
> > Drivers should consider using dma_mmap_pages() instead of this
> > interface when building their uAPIs, when possible.
> >
> > It must never be used in an in-kernel driver that only works with
> > kernel memory.
>
> This is exactly our use case. Although the platform decides whether a
> mapping requires bouncing or cache maintenance,
> DMA_ATTR_REQUIRE_COHERENT lets the driver reject mappings that cannot
> meet this requirement.
>
> The shmem path serves a different use case, but amdkfd is a relevant
> comparison. HIP's coherence guarantees depend on both the GPU VM/cache
> configuration and the DMA mapping established by the kernel driver. GPU
> page table attributes alone cannot make a bounce buffer coherent with
> the original userspace pages.
>
> The amdkfd mapping you cited therefore warrants discussion with its
> developers as well. I have CCed the maintainer.
Will add DMA_ATTR_REQUIRE_COHERENT in virtio GPU userptr in next version.
And are there some places else need to be modified?
Regards,
Honglei
>
> Regards,
> Akihiko Odaki
>
>>
>> Regards,
>> Honglei
>>
>>> Regards,
>>> Akihiko Odaki
>>>
>>>> + if (ret)
>>>> + goto err_cleanup;
>>>> +
>>>> + userptr->dma_dir = dir;
>>>> + userptr->dma_mapped = true;
>>>> + }
>>>> +
>>>> + ret = virtio_gpu_userptr_get_entries(vgdev, userptr, &ents,
>>>> &nents);
>>>> + if (ret)
>>>> + goto err_cleanup;
>>>> +
>>>> + virtio_gpu_cmd_resource_create_blob(vgdev, &userptr->base,
>>>> params, ents,
>>>> + nents);
>>>> +
>>>> + userptr->base.params = *params;
>>>> + virtio_gpu_add_object_to_restore_list(vgdev, &userptr->base);
>>>> +
>>>> + *bo_ptr = &userptr->base;
>>>> + return 0;
>>>> +
>>>> +err_cleanup:
>>>> + virtio_gpu_cleanup_object(&userptr->base);
>>>> + return ret;
>>>> +}
>>>
>>
>
next prev parent reply other threads:[~2026-09-29 2:22 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-24 9:55 [RFC PATCH v9 0/4] virtio-gpu: Add userptr support for compute workloads Honglei Huang
2026-09-24 9:55 ` [RFC PATCH v9 1/4] drm/virtio-gpu: Add VIRTIO_GPU_CAPSET_ROCM capability Honglei Huang
2026-09-24 9:55 ` [RFC PATCH v9 2/4] drm/virtgpu api: add blob userptr resource Honglei Huang
2026-09-24 9:55 ` [RFC PATCH v9 3/4] drm/virtio: implement userptr resource support Honglei Huang
2026-09-26 11:33 ` Akihiko Odaki
2026-09-28 16:22 ` Huang, Honglei
2026-09-28 17:25 ` Akihiko Odaki
2026-09-29 2:22 ` Huang, Honglei [this message]
2026-09-24 9:55 ` [RFC PATCH v9 4/4] drm/virtio: wire blob ioctl creation to userptr objects Honglei Huang
2026-09-27 1:04 ` Akihiko Odaki
2026-09-28 16:23 ` Huang, Honglei
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ae305517-e678-4ac3-93d3-f250bd37b2be@amd.com \
--to=honghuan@amd.com \
--cc=Felix.Kuehling@amd.com \
--cc=Ray.Huang@amd.com \
--cc=airlied@redhat.com \
--cc=amd-gfx@lists.freedesktop.org \
--cc=dmitry.osipenko@collabora.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=gurchetansingh@chromium.org \
--cc=kraxel@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=odaki@rsg.ci.i.u-tokyo.ac.jp \
--cc=olvaffe@gmail.com \
--cc=virtualization@lists.linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®