On Thu, Feb 20, 2020 at 05:13:09PM +0100, Christoph Hellwig wrote:
On Thu, Feb 20, 2020 at 05:06:06PM +0100, Halil Pasic wrote:So, this patch definitely isn't right as it stands, but I'm struggling
diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.cHell no. This is a detail of the platform DMA direct implementation.
index 867c7ebd3f10..fafc8f924955 100644
@@ -243,6 +243,9 @@ static bool vring_use_dma_api(struct virtio_device *vdev)
+ if (force_dma_unencrypted(&vdev->dev))
+ return true;
Drivers have no business looking at this flag, and virtio finally needs
to be fixed to use the DMA API properly for everything but legacy devices.
to understand what it is you're saying is the right way.
By "legacy devices" I assume you mean pre-virtio-1.0 devices, that
lack the F_VERSION_1 feature flag. Is that right? Because I don't
see how being a legacy device or not relates to use of the DMA API.
I *think* what you are suggesting here is that virtio devices that
have !F_IOMMU_PLATFORM should have their dma_ops set up so that the
DMA API treats IOVA==PA, which will satisfy what the device expects.
Then the virtio driver can use the DMA API the same way for both
F_IOMMU_PLATFORM and !F_IOMMU_PLATFORM devices.
But if that works for !F_IOMMU_PLATFORM_DEVICES+F_VERSION_1 devices,
then AFAICT it will work equally well for legacy devices.
Using the DMA API for *everything* in virtio, legacy or not, seems
like a reasonable approach to me. But, AFAICT, that does require the
DMA layer to have some kind of explicit call to turn on this
behaviour, which the virtio driver would call during initializsation.
I don't think we can do it 100% within the DMA layer, because only the
driver can reasonably know when a device has this weird non-standard