Here is the latest update of my series of patches adding infrastructure to allow the emulation of guest visible IOMMUs. I think this is conceptually ready to go, but I'm sending it as an RFC for now because it needs a bit more testing and review, particularly of the invalidation paths. I believe the first two preliminary patches are already on their way invia the USB tree.
The big change since the last version is improved handling of IOMMU invalidations versus dma_memory_map(): It's no longer necessary to have a "cancel" callback which must synchronously cancel any current usage of a dma_memory_map() buffer. Instead, we delay the completion of invalidate operations until outstanding maps are gone. Later patches do add a cancel callback to accelerate that freeing up, but it no longer has the potentially tricky to accomplish synchronous requirements. I'm really hoping I can get some extra review of this code path. I believe it's correct, but it's not straightforward to test, since it will not be exercise by correct guest software. There are also some more minor updates based on the previous round of feedback.