我用qemu +ARM A55 + ARM smmu-v3 + pcie网卡 + kernel(4.19) kvm + vfio要实现将网卡设备直通给虚拟机
在虚拟机内核里面使用dma_alloc_coherent申请了一段buffer A,并给这段buffer赋值.
然后使用ds-5工具暂停cpu,通过vfio框架我能得到buffer A在宿主机里面对应的物理地址pa和虚拟地址va
然后在ds-5工具里面使用读va得到的数据和虚拟机里面的赋值能够对应的上,但是用sp:pa的方式读,发现只有部分数据有效,像是虚拟机里面的赋值数据没有完全同步到dram中。
如果我在用ds-5读va的基础上,直接修改对应地址的数据,然后再用sp:pa的方式读,发现修改的数据才被更新到dram中,一次更新64字节,我只修改了4字节,像是一次cacheline的操作
总结一下问题是:虚拟机里面修改内存内容,在宿主机上只能从va看到完整结果,pa只能看到部分结果,导致pcie网卡访问这段pa buffer出错
请专家们提供些意见
我已经在arm官方技术支持平台中提供支持。