From: "Huang, Honglei" <honghuan@amd.com>
To: Akihiko Odaki <odaki@rsg.ci.i.u-tokyo.ac.jp>
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, dmitry.osipenko@collabora.com,
airlied@redhat.com, kraxel@redhat.com
Subject: Re: [RFC PATCH v9 3/4] drm/virtio: implement userptr resource support
Date: Wed, 30 Sep 2026 21:32:31 +0800 [thread overview]
Message-ID: <7d317175-d1f8-428b-a5fa-51c53e2d51c8@amd.com> (raw)
In-Reply-To: <dce3d9ed-87a7-43fe-b7d8-c7281514f7d1@rsg.ci.i.u-tokyo.ac.jp>
On 9/30/2026 12:56 PM, Akihiko Odaki wrote:
> On 2026/09/29 11:22, Huang, Honglei wrote:
>>
>>
>> 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?
>
> I don't have anything else to add right now. As a QEMU developer, I've
> only reviewed the more obvious aspects of this patch, so others may have
> deeper kernel-specific feedback.
Thanks for your detailed review.
>
> At this stage, my main priority is seeing how the current feedback is
> resolved. Before we dig deeper into the low-level details, I’d also like
> to review the virtio specification changes alongside the QEMU/
> virglrenderer implementation so I can better evaluate the overall design.
Will give the implementation for other components later.
Regards,
Honglei
>
> Regards,
> Akihiko Odaki
next prev parent reply other threads:[~2026-09-30 13:32 UTC|newest]
Thread overview: 13+ 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
2026-09-30 4:56 ` Akihiko Odaki
2026-09-30 13:32 ` 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=7d317175-d1f8-428b-a5fa-51c53e2d51c8@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®