On 20/04/2015 20:41, Jan Kiszka wrote:
> If the guest pushes data for DMA into RAM, it may assume that it lands
> there directly, without the need for explicit flushes, because it has
> caching disabled - no?
Yes, but Intel IOMMUs can have snooping control and in this case you can
just set memory to WB.
On Intel, KVM trusts the guest's PAT if the IOMMU is in use, and you do
not have an Intel IOMMU with snooping control. In this case
kvm_arch_has_noncoherent_dma(vcpu->kvm) returns true.
The same should work for AMD, so you can set the gPAT:
- to the guest's value if kvm_arch_has_noncoherent_dma(vcpu->kvm), and
then you return cachemode2protval(kvm_get_guest_memory_type(...)) from
svm_get_mt_mask to layer the guest MTRRs on top of the guest PAT.
- otherwise, to all WB (0x0606060606060606), and then you can return
either 0 or _PAGE_NOCACHE from svm_get_mt_mask to achieve either UC (for
MMIO regions) or WB (for everything else).
To sum up you have:
IOMMU? no IOMMU?
guest PAT obeyed ignored (all WB)
guest MTRR obeyed (svm_get_mt_mask) ignored (UC if MMIO, else WB)
host PAT always ignored always ignored
host MTRR always obeyed always obeyed
I think that kvm_arch_has_noncoherent_dma() can be resampled, and gPAT
updated, in wbinvd_interception.
Paolo
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html