I've just spent a day or so trying to track down why PCI passthrough of a virtio-blk-pci device wasn't working. The problem turns out to be that by default virtio pci devices don't use the IOMMU, even when the machine model has created an IOMMU and arranged for the PCI bus to be underneath it. So when the L2 guest tries to program the virtio device, the virtio device treats the IPAs it writes as if they were PAs and of course the data structures it's looking for aren't there.
Why do we default this to 'off'? It seems pretty unhelpful not to honour the existence of the IOMMU, and the failure mode is pretty opaque (L2 guest just hangs)... thanks -- PMM