Benjamin Herrenschmidt
2015-Nov-10 02:04 UTC
[PATCH v4 0/6] virtio core DMA API conversion
On Mon, 2015-11-09 at 16:46 -0800, Andy Lutomirski wrote:> The problem here is that in some of the problematic cases the virtio > driver may not even be loaded.? If someone runs an L1 guest with an > IOMMU-bypassing virtio device and assigns it to L2 using vfio, then > *boom* L1 crashes.? (Same if, say, DPDK gets used, I think.) > > > > > The only way out of this while keeping the "platform" stuff would be to > > also bump some kind of version in the virtio config (or PCI header). I > > have no other way to differenciate between "this is an old qemu that > > doesn't do the 'bypass property' yet" from "this is a virtio device > > that doesn't bypass". > > > > Any better idea ? > > I'd suggest that, in the absence of the new DT binding, we assume that > any PCI device with the virtio vendor ID is passthrough on powerpc.? I > can do this in the virtio driver, but if it's in the platform code > then vfio gets it right too (i.e. fails to load).The problem is there isn't *a* virtio vendor ID. It's the RedHat vendor ID which will be used by more than just virtio, so we need to specifically list the devices. Additionally, that still means that once we have a virtio device that actually uses the iommu, powerpc will not work since the "workaround" above will kick in. The "in absence of the new DT binding" doesn't make that much sense. Those platforms use device-trees defined since the dawn of ages by actual open firmware implementations, they either have no iommu representation in there (Macs, the platform code hooks it all up) or have various properties related to the iommu but no concept of "bypass" in there. We can *add* a new property under some circumstances that indicates a bypass on a per-device basis, however that doesn't completely solve it: ? - As I said above, what does the absence of that property mean ? An old qemu that does bypass on all virtio or a new qemu trying to tell you that the virtio device actually does use the iommu (or some other environment that isn't qemu) ? ? - On things like macs, the device-tree is generated by openbios, it would have to have some added logic to try to figure that out, which means it needs to know *via different means* that some or all virtio devices bypass the iommu. I thus go back to my original statement, it's a LOT easier to handle if the device itself is self describing, indicating whether it is set to bypass a host iommu or not. For L1->L2, well, that wouldn't be the first time qemu/VFIO plays tricks with the passed through device configuration space... Note that the above can be solved via some kind of compromise: The device self describes the ability to honor the iommu, along with the property (or ACPI table entry) that indicates whether or not it does. IE. We could use the revision or ProgIf field of the config space for example. Or something in virtio config. If it's an "old" device, we know it always bypass. If it's a new device, we know it only bypasses if the corresponding property is in. I still would have to sort out the openbios case for mac among others but it's at least a workable direction. BTW. Don't you have a similar problem on x86 that today qemu claims that everything honors the iommu in ACPI ? Unless somebody can come up with a better idea... Cheers, Ben.
On Mon, Nov 9, 2015 at 6:04 PM, Benjamin Herrenschmidt <benh at kernel.crashing.org> wrote:> On Mon, 2015-11-09 at 16:46 -0800, Andy Lutomirski wrote: >> The problem here is that in some of the problematic cases the virtio >> driver may not even be loaded. If someone runs an L1 guest with an >> IOMMU-bypassing virtio device and assigns it to L2 using vfio, then >> *boom* L1 crashes. (Same if, say, DPDK gets used, I think.) >> >> > >> > The only way out of this while keeping the "platform" stuff would be to >> > also bump some kind of version in the virtio config (or PCI header). I >> > have no other way to differenciate between "this is an old qemu that >> > doesn't do the 'bypass property' yet" from "this is a virtio device >> > that doesn't bypass". >> > >> > Any better idea ? >> >> I'd suggest that, in the absence of the new DT binding, we assume that >> any PCI device with the virtio vendor ID is passthrough on powerpc. I >> can do this in the virtio driver, but if it's in the platform code >> then vfio gets it right too (i.e. fails to load). > > The problem is there isn't *a* virtio vendor ID. It's the RedHat vendor > ID which will be used by more than just virtio, so we need to > specifically list the devices.Really? /* Qumranet donated their vendor ID for devices 0x1000 thru 0x10FF. */ static const struct pci_device_id virtio_pci_id_table[] = { { PCI_DEVICE(0x1af4, PCI_ANY_ID) }, { 0 } }; Can we match on that range?> > Additionally, that still means that once we have a virtio device that > actually uses the iommu, powerpc will not work since the "workaround" > above will kick in.I don't know how to solve that problem, though, especially since the vendor of such a device (especially if it's real hardware) might not set any new bit.> > The "in absence of the new DT binding" doesn't make that much sense. > > Those platforms use device-trees defined since the dawn of ages by > actual open firmware implementations, they either have no iommu > representation in there (Macs, the platform code hooks it all up) or > have various properties related to the iommu but no concept of "bypass" > in there. > > We can *add* a new property under some circumstances that indicates a > bypass on a per-device basis, however that doesn't completely solve it: > > - As I said above, what does the absence of that property mean ? An > old qemu that does bypass on all virtio or a new qemu trying to tell > you that the virtio device actually does use the iommu (or some other > environment that isn't qemu) ? > > - On things like macs, the device-tree is generated by openbios, it > would have to have some added logic to try to figure that out, which > means it needs to know *via different means* that some or all virtio > devices bypass the iommu. > > I thus go back to my original statement, it's a LOT easier to handle if > the device itself is self describing, indicating whether it is set to > bypass a host iommu or not. For L1->L2, well, that wouldn't be the > first time qemu/VFIO plays tricks with the passed through device > configuration space...Which leaves the special case of Xen, where even preexisting devices don't bypass the IOMMU. Can we keep this specific to powerpc and sparc? On x86, this problem is basically nonexistent, since the IOMMU is properly self-describing. IOW, I think that on x86 we should assume that all virtio devices honor the IOMMU.> > Note that the above can be solved via some kind of compromise: The > device self describes the ability to honor the iommu, along with the > property (or ACPI table entry) that indicates whether or not it does. > > IE. We could use the revision or ProgIf field of the config space for > example. Or something in virtio config. If it's an "old" device, we > know it always bypass. If it's a new device, we know it only bypasses > if the corresponding property is in. I still would have to sort out the > openbios case for mac among others but it's at least a workable > direction. > > BTW. Don't you have a similar problem on x86 that today qemu claims > that everything honors the iommu in ACPI ?Only on a single experimental configuration, and that can apparently just be fixed going forward without any real problems being caused. --Andy
Benjamin Herrenschmidt
2015-Nov-10 05:26 UTC
[PATCH v4 0/6] virtio core DMA API conversion
On Mon, 2015-11-09 at 18:18 -0800, Andy Lutomirski wrote:> > Which leaves the special case of Xen, where even preexisting devices > don't bypass the IOMMU.? Can we keep this specific to powerpc and > sparc?? On x86, this problem is basically nonexistent, since the IOMMU > is properly self-describing. > > IOW, I think that on x86 we should assume that all virtio devices > honor the IOMMU.You don't like performances ? :-) Cheers, Ben.
Benjamin Herrenschmidt
2015-Nov-10 05:28 UTC
[PATCH v4 0/6] virtio core DMA API conversion
On Mon, 2015-11-09 at 18:18 -0800, Andy Lutomirski wrote:> > /* Qumranet donated their vendor ID for devices 0x1000 thru 0x10FF. > */ > static const struct pci_device_id virtio_pci_id_table[] = { > ??????? { PCI_DEVICE(0x1af4, PCI_ANY_ID) }, > ??????? { 0 } > }; > > Can we match on that range?We can, but the problem remains, how do we differenciate an existing device that does bypass vs. a newer one that needs the IOMMU and thus doesn't have the new "bypass" property in the device-tree. Cheers, Ben.
On 2015-11-10 03:18, Andy Lutomirski wrote:> On Mon, Nov 9, 2015 at 6:04 PM, Benjamin Herrenschmidt >> I thus go back to my original statement, it's a LOT easier to handle if >> the device itself is self describing, indicating whether it is set to >> bypass a host iommu or not. For L1->L2, well, that wouldn't be the >> first time qemu/VFIO plays tricks with the passed through device >> configuration space... > > Which leaves the special case of Xen, where even preexisting devices > don't bypass the IOMMU. Can we keep this specific to powerpc and > sparc? On x86, this problem is basically nonexistent, since the IOMMU > is properly self-describing. > > IOW, I think that on x86 we should assume that all virtio devices > honor the IOMMU.>From the guest driver POV, that is OK because either there is no IOMMUto program (the current situation with qemu), there can be one that doesn't need it (the current situation with qemu and iommu=on) or there is (Xen) or will be (future qemu) one that requires it.> >> >> Note that the above can be solved via some kind of compromise: The >> device self describes the ability to honor the iommu, along with the >> property (or ACPI table entry) that indicates whether or not it does. >> >> IE. We could use the revision or ProgIf field of the config space for >> example. Or something in virtio config. If it's an "old" device, we >> know it always bypass. If it's a new device, we know it only bypasses >> if the corresponding property is in. I still would have to sort out the >> openbios case for mac among others but it's at least a workable >> direction. >> >> BTW. Don't you have a similar problem on x86 that today qemu claims >> that everything honors the iommu in ACPI ? > > Only on a single experimental configuration, and that can apparently > just be fixed going forward without any real problems being caused.BTW, I once tried to describe the current situation on QEMU x86 with IOMMU enabled via ACPI. While you can easily add IOMMU device exceptions to the static tables, the fun starts when considering device hotplug for virtio. Unless I missed some trick, ACPI doesn't seem like being designed for that level of flexibility. You would have to reserve a complete PCI bus, declare that one as not being IOMMU-governed, and then only add new virtio devices to that bus. Possible, but a lot of restrictions that existing management software would have to be aware of as well. Jan -- Siemens AG, Corporate Technology, CT RTC ITP SES-DE Corporate Competence Center Embedded Linux
On Tue, 2015-11-10 at 13:04 +1100, Benjamin Herrenschmidt wrote:> On Mon, 2015-11-09 at 16:46 -0800, Andy Lutomirski wrote: > > The problem here is that in some of the problematic cases the > > virtio > > driver may not even be loaded. If someone runs an L1 guest with an > > IOMMU-bypassing virtio device and assigns it to L2 using vfio, then > > *boom* L1 crashes. (Same if, say, DPDK gets used, I think.) > > > > > > > > The only way out of this while keeping the "platform" stuff would > > > be to > > > also bump some kind of version in the virtio config (or PCI > > > header). I > > > have no other way to differenciate between "this is an old qemu > > > that > > > doesn't do the 'bypass property' yet" from "this is a virtio > > > device > > > that doesn't bypass". > > > > > > Any better idea ? > > > > I'd suggest that, in the absence of the new DT binding, we assume > > that > > any PCI device with the virtio vendor ID is passthrough on powerpc. > > I > > can do this in the virtio driver, but if it's in the platform code > > then vfio gets it right too (i.e. fails to load). > > The problem is there isn't *a* virtio vendor ID. It's the RedHat > vendor > ID which will be used by more than just virtio, so we need to > specifically list the devices. > > Additionally, that still means that once we have a virtio device that > actually uses the iommu, powerpc will not work since the "workaround" > above will kick in. > > The "in absence of the new DT binding" doesn't make that much sense. > > Those platforms use device-trees defined since the dawn of ages by > actual open firmware implementations, they either have no iommu > representation in there (Macs, the platform code hooks it all up) or > have various properties related to the iommu but no concept of > "bypass" > in there. > > We can *add* a new property under some circumstances that indicates a > bypass on a per-device basis, however that doesn't completely solve > it: > > - As I said above, what does the absence of that property mean ? An > old qemu that does bypass on all virtio or a new qemu trying to tell > you that the virtio device actually does use the iommu (or some other > environment that isn't qemu) ? > > - On things like macs, the device-tree is generated by openbios, it > would have to have some added logic to try to figure that out, which > means it needs to know *via different means* that some or all virtio > devices bypass the iommu. > > I thus go back to my original statement, it's a LOT easier to handle > if > the device itself is self describing, indicating whether it is set to > bypass a host iommu or not. For L1->L2, well, that wouldn't be the > first time qemu/VFIO plays tricks with the passed through device > configuration space... > > Note that the above can be solved via some kind of compromise: The > device self describes the ability to honor the iommu, along with the > property (or ACPI table entry) that indicates whether or not it does. > > IE. We could use the revision or ProgIf field of the config space for > example. Or something in virtio config. If it's an "old" device, we > know it always bypass. If it's a new device, we know it only bypasses > if the corresponding property is in. I still would have to sort out > the > openbios case for mac among others but it's at least a workable > direction. > > BTW. Don't you have a similar problem on x86 that today qemu claims > that everything honors the iommu in ACPI ? > > Unless somebody can come up with a better idea...Can something be done by means of PCIe capabilities? ATS (Address Translation Support) seems like a natural choice? Knut> Cheers, > Ben. > > -- > To unsubscribe from this list: send the line "unsubscribe sparclinux" > in > the body of a message to majordomo at vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html
Benjamin Herrenschmidt
2015-Nov-10 10:26 UTC
[PATCH v4 0/6] virtio core DMA API conversion
On Tue, 2015-11-10 at 10:45 +0100, Knut Omang wrote:> Can something be done by means of PCIe capabilities? > ATS (Address Translation Support) seems like a natural choice?Euh no... ATS is something else completely.... Cheers, Ben.
On Tue, Nov 10, 2015 at 01:04:36PM +1100, Benjamin Herrenschmidt wrote:> The "in absence of the new DT binding" doesn't make that much sense. > > Those platforms use device-trees defined since the dawn of ages by > actual open firmware implementations, they either have no iommu > representation in there (Macs, the platform code hooks it all up) or > have various properties related to the iommu but no concept of "bypass" > in there. > > We can *add* a new property under some circumstances that indicates a > bypass on a per-device basis, however that doesn't completely solve it: > > ? - As I said above, what does the absence of that property mean ? An > old qemu that does bypass on all virtio or a new qemu trying to tell > you that the virtio device actually does use the iommu (or some other > environment that isn't qemu) ?You have the same problem when real PCIe devices appear that speak virtio. I think the only real (still not very nice) solution is to add a quirk to powerpc platform code that sets noop dma-ops for the existing virtio vendor/device-ids and add a DT property to opt-out of that quirk. New vendor/device-ids (as for real devices) would just not be covered by the quirk and existing emulated devices continue to work. The absence of the property just means that the quirk is in place and the system assumes no translation for virtio devices. Joerg
Benjamin Herrenschmidt
2015-Nov-10 19:36 UTC
[PATCH v4 0/6] virtio core DMA API conversion
On Tue, 2015-11-10 at 11:27 +0100, Joerg Roedel wrote:> > You have the same problem when real PCIe devices appear that speak > virtio. I think the only real (still not very nice) solution is to add a > quirk to powerpc platform code that sets noop dma-ops for the existing > virtio vendor/device-ids and add a DT property to opt-out of that quirk. > > New vendor/device-ids (as for real devices) would just not be covered by > the quirk and existing emulated devices continue to work.Why woud real devices use new vendor/device IDs ? Also there are other cases such as using virtio between 2 partitions, which we could do under PowerVM ... that would require proper iommu usage with existing IDs.> The absence of the property just means that the quirk is in place and > the system assumes no translation for virtio devices.The only way that works forward for me (and possibly sparc & others, what about ARM ?) is if we *change* something in virtio qemu at the same time as we add some kind of property. For example the ProgIf field or revision ID field. That way I can key on that change. It's still tricky because I would have to somewhat tell my various firmwares (SLOF, OpenBIOS, OPAL, ...) so they can create the appropriate property, it's still hacky, but it would be workable. Ben.