紫金存储调试中,测试发现host侧插盘动作有3秒延迟的问题,对此问题进行定位。
这里简单介绍一下插盘动作的过程,即从SOC发起插盘命令开始,host加载其对应的PF,virtio_blk驱动会主动去读后端磁盘的分区表,即会发起读IO操作,IO会经过SOC传输,待到IO返回正常,更新对应的寄存器,即为插盘成功。
不过SOC从开始发起插盘到SOC检测到插盘成功,这个过程耗时有3秒左右,是不正常的现象,因为一般加盘耗时是毫秒级。
这里也简单介绍一下IO在FPGA内部的传输。Host发出一个IO,即为TX通道,FPGA通过各种握手将其传送到SOC,即为SOC的RX通道。待到SOC处理完,会从SOC的TX通道返回给FPGA,最后FPGA将返回的IO,通过host的RX通道,送还给host。
现在在FPGA内部加一些时间统计来定位分析。
fpga内部做时间统计分析如下:
Host-->SOC 这个方向的时间统计:
- Host侧TX方向FPGA第一次接收driver ok时间统计;
- Host侧TX方向FPGA内部第一次notify时间统计;
- SOC侧RX方向FPGA第一次PCIE TLP 写used index时间统计;
SOC-->Host 这个方向的时间统计:
- SOC侧TX方向FPGA内部第一次收到SOC发送的notify时间统计;
- Host侧RX方向第一次收到SOC返回的数据时间统计;
- Host侧RX方向第一次更新used index的时间统计;
FPGA内部抓信号的现象如下:
从host tx通道对FPGA发起driver ok开始计数每4ns加1,fpga抓信号可以看到,host --> soc 方向 ,从driver ok 到soc 的PCIE TLP第一次 写usedindex总共耗时0x57f47*4ns=1,441,052ns,也就是差不多1.4ms,这个时间的延迟还是比较正常的。
硬件抓信号截图1如下:
图 1 host到soc方向时间统计
同样从host driver ok开始计数,每4ns加1,到soc软件第一个从tx方向下发第一个notify信号,时间统计为0x2ad03f38 * 4ns = 2,873,162,976ns,也就是差不多2.8秒的延迟,这个延迟是非常大的了。硬件抓信号截图2如下:
图 2 host到soc,再soc返回到host时间统计
从以上抓信号基本可以看出来,存储插盘动作出现的延迟3秒左右现象,时间大部分消耗在SOC 这一侧。
进一步结合软件打印分析,SOC软件侧打印显示, 等到SOC轮循检测到FPGA第一次写used index的时候,这已经到2.8s了。当然为了证明FPGA第一次向SOC对应内存空间写used index值是否也存在较大延迟,专门在SOC侧加了一个打印,检测SOC内存中index值是否发生改变,现象是从FPGA第一次通过DMA向SOC写used index值,到打印出内存值变化,这个时间间隔很短,不到毫秒。
结论:
FPGA向SOC第一次写used index值,到SOC轮询机制,真正检测到第一次used index值变化,这其中有2.8秒的延迟。问题应该为SOC软件检测机制出现异常,排除FPGA内部传输数据延迟较大的可能。后续是在soc软件插盘流程上做定位分析。