在通过vfio框架透传设备到vm中,并且在vm中运行dpdk的驱动。
我们发现,dpdk偶尔的一次pread 2字节,却触发了两次tlp。
原因在于:
do_io_rw
{
else if (fillable >= 2 && !(off % 2)) {//caq:如果偏移是2的倍数
u16 val;
if (iswrite) {
if (copy_from_user(&val, buf, 2))
return -EFAULT;
vfio_iowrite16(val, io + off);
} else {
val = vfio_ioread16(io + off);
if (copy_to_user(buf, &val, 2))
return -EFAULT;
}
filled = 2;
}
所以如果需要通过vfio接口读取两个字节,而且偏移是一字节对齐的时候,则会触发两次tlp 读。
这种场景对于dpdk中的接口设计,是有隐性的要求,如果一个字段是2字节,则最好2字节对齐发送,否则后端板卡可能会实现为两次tlp的读写。