On Mon, Jul 21, 2025 at 04:05:17PM +0800, Jason Wang wrote: > On Fri, Jul 18, 2025 at 6:09 PM Jason Wang <jasow...@redhat.com> wrote: > > > > On Fri, Jul 18, 2025 at 5:37 PM Michael S. Tsirkin <m...@redhat.com> wrote: > > > > > > On Fri, Jul 18, 2025 at 05:16:14PM +0800, Jason Wang wrote: > > > > Virtio core switches from DMA device to mapping token, let's do that > > > > as well for vDPA. > > > > > > Pls switch to imperative mood. > > > > > > And add explanation about what is going on and why please. > > > > I think this has been explained in patch [PATCH V4 6/9] virtio: > > introduce map ops in virtio core? > > > > """ > > For the device or transport that doesn't do DMA, > > they can implement their own mapping logic without the need to trick > > DMA core. In this case the map_token is opaque to the virtio core that > > will be passed back to the transport or device specific map > > operations. For other devices, DMA API will still be used, so map > > token will still be the dma device to minimize the changeset and > > performance impact. > > """ > > > > > > > > At least, document what are the actual types stored here. > > > > It is opaque to the virtio core and will be used as a token to be > > passed back when the virtio core wants to map/unmap a buffer. So it > > doesn't have a type. > > > > > I checked and it looks like vduse actually returns struct device * here, > > > too? > > > > It's just a token, vduse can return anything that can be used to > > identify an iova domain. For example, it can return a pointer to > > iova_domain which will also work. If you prefer to use iova domain, I > > can change to use that in the next version. > > > > > So why do we need this, why lose all type safety? > > > > If you worry about the case that assumes map_token as dma device in > > virtio core. I can keep both map_token and dma_device and make the > > mutually exclusive, then: > > > > - when transport reports dma device, use DMA API > > - when transport reports map token, use map ops > > > > Does this work for you? > > This seems to result in a lot of unnecessary code. I wonder if the > following would work: > > Just document the requirement in vring_create_virtqueue_map, say > something like when a virtio device doesn't have a map operation, > map_token must be a pointer to struct device. > > Please give me some advice so I can work on a new version.. > > Thanks > > > > > Thanks
How about something like this? typedef union { struct device *dma_dev; struct vduse_iova_domain *iova_domain; void *ptr; } virtio_dma_dev_t; Now, just pass this around. You can also add an enum with the pointer: typedef struct { union { struct device *dma_dev; struct vduse_iova_domain *iova_domain; void *ptr; }; enum { VIRTIO_DMA, VIRTIO_IOVA } type; } virtio_dma_dev_t; (possibly only on debug builds, if you find it's costly?) This allows encapsulation and asserts that the type is right. -- MST