Avi Kivity wrote:
Blue Swirl wrote:
 I don't understand.  It's not a device that needs bouncing, it's a
particular transfer. This could be either due to the transfer targeting
mmio, or due to the transfer requiring a transformation.

Should the bouncing be something more much complex, for example
negotiated between the devices? Or maybe the devices set up a
transforming and non-transforming channel (which the other end should
be able to transform some more) and use them as needed?

Yes.  We already have two cases:

- may do partial request: useful for block storage where requests can be huge - need full request: networking, where you can't send or receive half a packet; on the other hand, packets are small (even with tso)

You're adding a third case, always bounce, when the data undergoes a transformation which can't happen in-place.

IMHO, IOMMU translation is distinct from mapping/data transformation. I would think the IOMMU translation API would be different in that it took a physical address and returned a physical address.

The IOMMU DMA API (which could transform data potentially) should return a virtual address and data a physical address. In the normal case (non-transforming IOMMU), it should just fall-through to CPU DMA API (which is just map/unmap).

The PCI DMA API would normally fall through to the IOMMU DMA API.

So we would have:

PCI DMA map(addr):
 if IOMMU:
    return IOMMU DMA map(addr)
 return CPU DMA map(addr)

IOMMU DMA map(addr):
 new_address = IOMMU translate(addr)
 if transform:
   return IOMMU byte-swap map(addr)
 return CPU DMA map(addr)

Regards,

Anthony Liguori

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to