In preparation to support VIRTIO_F_DMB, define the feature bit. A device that negotiates it holds its virtqueues and the buffers they reference in a Device Memory Buffer, a shared memory region the device owns. The data DMA of such a device is routed through a per-device transparent IOMMU whose bus address space maps 1:1 onto that region, so every address the driver places in a virtqueue is an address in that space and the device can reach nothing the driver has not published there.
Define VIRTIO_F_DMB as 44 and raise VIRTIO_TRANSPORT_F_END to 45, so virtio_dev_probe() preserves the bit into finalize_features() where a transport can act on it. VIRTIO_DEVICE_F_MASK derives from the same bound and moves with it. vdpa reads the bound as VIRTIO_TRANSPORT_F_END + 1 while vring_transport_features() stops below it, so the mask drops bits 43 to 45 from the device_features vdpa reports over netlink, one bit beyond the last bit a transport can act on. Define VIRTIO_DMB_MEM_TYPE_COHERENT too. A device reports the memory type of its region, and this is the one type that says a write by either side becomes visible to the other with no cache maintenance by the driver. Every transport reports the same type, so the name belongs here beside the feature bit and not in the header of one of them. Link: https://lore.kernel.org/virtio-comment/[email protected]/ Assisted-by: Kiro:claude-opus-5 checkpatch sparse Signed-off-by: Alexander Graf <[email protected]> --- - Say bus address space rather than IOVA space --- include/uapi/linux/virtio_config.h | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/include/uapi/linux/virtio_config.h b/include/uapi/linux/virtio_config.h index 2445f365bce7..8cfd9436a09e 100644 --- a/include/uapi/linux/virtio_config.h +++ b/include/uapi/linux/virtio_config.h @@ -52,7 +52,7 @@ * rest are per-device feature bits. */ #define VIRTIO_TRANSPORT_F_START 28 -#define VIRTIO_TRANSPORT_F_END 42 +#define VIRTIO_TRANSPORT_F_END 45 #ifndef VIRTIO_CONFIG_NO_LEGACY /* Do we get callbacks when the ring is completely used, even if we've @@ -120,4 +120,26 @@ */ #define VIRTIO_F_ADMIN_VQ 41 +/* + * This feature indicates that the device offers a Device Memory Buffer: a + * shared memory region, owned by the device, that holds the virtqueues and + * the buffers they reference. When this feature is negotiated, the data DMA + * of the device is routed through a per-device transparent IOMMU whose bus + * address space maps 1:1 onto that region, so every address the driver + * places in a virtqueue is an address in that space and the device can + * reach nothing the driver has not published there. Interrupts are + * unaffected. + */ +#define VIRTIO_F_DMB 44 + +/* + * The memory type of a Device Memory Buffer region, as the device reports it. + * VIRTIO_DMB_MEM_TYPE_COHERENT means a write by either side becomes visible to + * the other with no cache maintenance by the driver. Every other value is + * reserved. A device reports the type from the moment it offers + * VIRTIO_F_DMB, and a driver must not accept the feature unless the type is + * one it supports. + */ +#define VIRTIO_DMB_MEM_TYPE_COHERENT 0 + #endif /* _UAPI_LINUX_VIRTIO_CONFIG_H */

