David Woodhouse
2016-Apr-27 19:16 UTC
[PATCH V2 RFC] fixup! virtio: convert to use DMA api
On Wed, 2016-04-27 at 21:17 +0300, Michael S. Tsirkin wrote:> > > Because it's a dirty hack in the *wrong* place. > > No one came up with a better one so far :(Seriously? Take a look at drivers/iommu/intel-iommu.c. It has quirks for all kinds of shitty devices that have to be put in passthrough mode or otherwise excluded. We don't actually *need* it for the Intel IOMMU; all we need is for QEMU to stop lying in its DMAR tables. We *do* want the same kind of quirks in the relevant POWER and ARM IOMMU code in the kernel. Do that (hell, a simple quirk for all virtio devices will suffice, but NOT in the virtio driver) at the same moment you fix the virtio devices to use the DMA API. Job done. Some time *later* we can work on *refining* that quirk, and a way for QEMU to tell the guest (via something generic like fwcfg, maybe) that some devices are and aren't translated. Actually, I'm about to look at moving dma_ops into struct device and cleaning up the way we detect which IOMMU is attached, at device instantiation time. Perhaps I can shove the virtio-exception quirk in there while I'm at it... -- dwmw2 -------------- next part -------------- A non-text attachment was scrubbed... Name: smime.p7s Type: application/x-pkcs7-signature Size: 5691 bytes Desc: not available URL: <http://lists.linuxfoundation.org/pipermail/virtualization/attachments/20160427/aaf4ffac/attachment.bin>
Michael S. Tsirkin
2016-Apr-28 14:34 UTC
[PATCH V2 RFC] fixup! virtio: convert to use DMA api
On Wed, Apr 27, 2016 at 08:16:57PM +0100, David Woodhouse wrote:> On Wed, 2016-04-27 at 21:17 +0300, Michael S. Tsirkin wrote: > > > > > Because it's a dirty hack in the *wrong* place. > > > > No one came up with a better one so far :( > > Seriously? > > Take a look at drivers/iommu/intel-iommu.c. It has quirks for all kinds > of shitty devices that have to be put in passthrough mode or otherwise > excluded.I see work-arounds for broken IOMMUs but not for individual devices. Could you point me to a more specific example?> We don't actually *need* it for the Intel IOMMU; all we need is for > QEMU to stop lying in its DMAR tables.We need it for legacy QEMU anyway, and it's not easy for QEMU to stop lying about virtio, so we'll need it for a while. I think it's easy for QEMU to stop lying about assigned devices, so we don't need it for non-virtio devices.> We *do* want the same kind of quirks in the relevant POWER and ARM > IOMMU code in the kernel. Do that (hell, a simple quirk for all virtio > devices will suffice, but NOT in the virtio driverSure - that works. It does not have to be in the driver.>) at the same moment > you fix the virtio devices to use the DMA API. Job done. > > Some time *later* we can work on *refining* that quirk, and a way for > QEMU to tell the guest (via something generic like fwcfg, maybe) that > some devices are and aren't translated.I don't see why how fwcfg can work here. It's a static thing, devices can come and go with hotplug.> Actually, I'm about to look at moving dma_ops into struct device and > cleaning up the way we detect which IOMMU is attached, at device > instantiation time. Perhaps I can shove the virtio-exception quirk in > there while I'm at it...Sounds good.> -- > dwmw2 >
David Woodhouse
2016-Apr-28 15:11 UTC
[PATCH V2 RFC] fixup! virtio: convert to use DMA api
On Thu, 2016-04-28 at 17:34 +0300, Michael S. Tsirkin wrote:> I see work-arounds for broken IOMMUs but not for > individual devices. Could you point me to a more specific > example?I think the closest example is probably quirk_ioat_snb_local_iommu(). If we see this particular device, we *know* what the topology actually looks like. We check the hardware setup, and if we're *not* being told the truth, then we stick it in bypass mode because we know it *isn't* actually being translated. Actually, that's almost *identical* to what we want, isn't it? Except instead of checking undocumented chipset registers, it wants to be checking "am I on a version of qemu known to lie about virtio being translated?"> > We don't actually *need* it for the Intel IOMMU; all we need is for > > QEMU to stop lying in its DMAR tables. > We need it for legacy QEMU anyway, and it's not easy for QEMU to stop > lying about virtio, so we'll need it for a while. > I think it's easy for QEMU to stop lying about assigned devices, > so we don't need it for non-virtio devices.Why is it easier for QEMU to tell the truth about assigned devices, than it is for virtio? Assuming they both remain actually untranslated for now, why's it easier to fix the DMAR table for one and not the other? (Implementing translation of assigned devices is on my list, but it's a long way off).> I don't see why how fwcfg can work here. It's a static thing, > devices can come and go with hotplug.This touches on something you said elsewhere, that it's painful/impossible to hot-unplug a translated device and hot-plug an untranslated device in the same slot (and vice versa). So let's assume for now that a given slot is indeed static, and either translated or untranslated. Like the DMAR table, the fwcfg can just give a list of slot which are (or aren't) translated. And then you can *only* add a translated device to a translated slot, or an untranslated device to an untranslated slot. All the internally-emulated devices *can* be either translated or untranslated. That's just a matter of software. Surely, you currently *can't* have translated assigned devices (until someone implements the whole VT-d page table shadowing or whatever), so you'll be barred from assigning a device to a slot which *previously* had an untranslated device. But so what? Put it in a different slot instead. -- dwmw2 -------------- next part -------------- A non-text attachment was scrubbed... Name: smime.p7s Type: application/x-pkcs7-signature Size: 5760 bytes Desc: not available URL: <http://lists.linuxfoundation.org/pipermail/virtualization/attachments/20160428/59b3b152/attachment.bin>
Reasonably Related Threads
- [PATCH V2 RFC] fixup! virtio: convert to use DMA api
- [PATCH V2 RFC] fixup! virtio: convert to use DMA api
- [PATCH V2 RFC] fixup! virtio: convert to use DMA api
- [PATCH V2 RFC] fixup! virtio: convert to use DMA api
- [PATCH V2 RFC] fixup! virtio: convert to use DMA api