NTB调试常见问题指南

简介:

NTB调试常见问题指南



作为实现不同PCI域乃至跨节点数据传输的重要器件,NTB在服务器和存储领域实现双控、内存互访等方面发挥着重要的作用。由于它本身既作为virtual port出现,又可以被互联的结点通过pci scan看到,作为一个link port出现,加之其上实现的地址转换和转发功能,在实际工程项目中,难免会碰到各种问题。本文结合笔者最近的工作,分享了NTB调试过程中常见的问题和解决思路和办法。

从问题的现象来看,具体常见问题包括:

找不到NTB设备;

NTB mailbox无法传送数据;

ReqID 无法探测到;

NTB bar size 不够大;

数据传输出错

根据问题发生所在的PCIE相关的软硬件层次,这些问题又可以归纳为下面的几类:

硬件故障;

固件故障;

PCIE 设置错误;

程序错误。

下面针对上面列举出来的几种现象,逐一进行分析和讨论:

找不到NTB设备

这种情况下,运行应用程序的时候可能会发现用刀的库中会提示找不到设备,程序出错或者退出。此时,可以首先通过lspci看看能否扫描到NTB设备,如果找不到就说明系统没有发现NTB硬件,此时需要检查NTB的EEPROM是否已经使能NTB,以及板卡上是否有disable/enable NTB的跳线,如果有则还需要坚持它是否已经disable。如果设备存在,并且能够被lspci扫描到,但是应用程序就是提示看不到设备,需要检查设备驱动是否加载成功。此时,可以通过重新加载NTB设备驱动程序去解决。

2、NTB mailbox register无法传送数据

根据NTB的使用说明,一般而言,NTB的mailbox和doorbell寄存器用来在多个节点之间传递信息进而实现上层的同步。如果出现doorbell /mailbox寄存器读回来的数是0xffffffff的话,那么需要检查映射doorbell/mailbox寄存器的bar0/1的设置是否正确。方法是通过lspci读出bar0/1的值,检查它是否和BIOS给它分配的物理地址一致。



3、ReqID无法探测到

具体的现象如下面的输出所示意:

Communicating from          : VIRTUAL side

Determine NT connect type   : Standard (NTV <---> NTL)

Get BAR 2 properties       : Ok (Size:2048 KB)

Map BAR 2 to user space    : Ok (VA:0x7f5c1801d000)

Probe for write ReqID      : ERROR: Unable to probe ReqID, auto-add 0,0,0

Add write Req ID to LUT    : ERROR: Unable to add LUT entry

Allocate PCI buffer        : Ok (PCI:3638A000  Size:1000 B)

Map PCI buffer             : Ok (VA:0x7f5c18d01000)



ReqID是用来记录发出PCIE TLP请求的device的B:D:F,如果是由cpu发起的访问,那么它通常用北桥root cmplex的B:D:F来表示,如果是DMA发起来的访问,那么它应该由发起访问的DMA的B:D:F去表示。在应用程序中,可以通过出发一条特殊的TLP,然后根据报文协议,来提取它的B:D:F,进而得到它的ReqID。 一旦出现这种ReqID无法探测的情况,需要检查用到的bar2/bar3或者bar4/bar5的基地址寄存器设置是否正确,检查它的方法也是判断bar的基地址寄存器的值是否和BIOS分配的地址一致。



4、用在地址转换的bar size不够大

受限于BIOS和EEPROM设置,用作地址转换的bar size是固定的,对于实现全系统内存共享或者大地址互相访问的应用而言,这个地址窗口可能太小。为此,就需要把地址调大。

首先,这需要bios给pci设备分配地址空间的时候, 能够支持足够大的空间范围,为此,需要确保BIOS里一些相关的设置已经使能,以笔者手中的bIOS为例,它就需要使能56T以上的PCI地址空间,如下图所示意:

wKioL1d0wg-ChMfVAAQcHZ20Sms370.png



其次,还需要修改用作地址转换的bar的setup寄存器的值,这就需要查找手册,根据寄存中bitmap和mask的设置,来设置足够大的地址空间。需要注意的是,这个地址也不能超过BIOS所能支持的最大地址空间,否则很可能导致在系统pci emulate的时候因为无法分配到足够的地址空间而hang住。如果在某组地址转换寄存器上无法实现窗口扩大的话,可以尝试其他地址窗口。比如笔者手上的bar2/bar3的窗口大小只有1M,但是通过观察/proc/iomem的输出,可以看到bar4/bar5的窗口足足有8G:

380000000000-383fffffffff : PCI Bus 0000:00

383c00000000-383e001fffff : PCI Bus 0000:04

  383c00000000-383e001fffff : PCI Bus 0000:05

    383c00000000-383e001fffff : PCI Bus 0000:06

      383c00000000-383dffffffff : 0000:06:00.0

      383e00000000-383e000fffff : 0000:06:00.0

加载对应的NTB驱动后,果然也能看到这个大窗口:

[86764.073933] LPC6500_NT:    Resource 01

[86764.073935] LPC6500_NT:      Type     : Memory

[86764.074004] LPC6500_NT:      PCI BAR 2: 383E0000000C

[86764.074006] LPC6500_NT:      Phys Addr: 383E00000000

[86764.074008] LPC6500_NT:      Size     :   200000 (2048 KB)

[86764.074010] LPC6500_NT:      Property : Prefetchable 64-bit

[86764.074206] LPC6500_NT:      Kernel VA: ffffc90017700000

[86764.074208] LPC6500_NT:    Resource 02

[86764.074209] LPC6500_NT:      Type     : Memory

[86764.074279] LPC6500_NT:      PCI BAR 4: 383C0000000C

[86764.074281] LPC6500_NT:      Phys Addr: 383C00000000

[86764.074283] LPC6500_NT:      Size     : 200000000 (8388608 KB)

[86764.074285] LPC6500_NT:      Property : Prefetchable 64-bit

[86764.487186] LPC6500_NT:      Kernel VA: ffffc90017e81000

[86764.487189] LPC6500_NT: Using PCI BAR 0 (VA=ffffc90016c80000) ==> PLX regs



根据上面的分析可以看到,NTB调试过程中,可能会碰到各种奇怪的问题,但万变不离其宗,只要把握住了NTB地址转换和数据传输的原理,总不难逐层分析出问题的根源,找到对应的解决办法。




















本文转自存储之厨51CTO博客,原文链接: http://blog.51cto.com/xiamachao/1794555,如需转载请自行联系原作者


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
|
存储 缓存 虚拟化
PCIe地址转换服务(ATS)详解
PCIe地址转换服务(ATS)详解
4027 1
PCIe地址转换服务(ATS)详解
|
文字识别 异构计算 Python
关于Github中开源OCR项目的实验过程与思考
新手尝试Git clone Python OCR项目,遇到各种报错。测试了Paddle OCR、Tesseract OCR和EasyOCR。Paddle OCR因平台限制未能在Notebook部署,Tesseract OCR在Colab成功但无法复现。EasyOCR最终在阿里云天池和Colab部署成功,但天池GPU资源不足。建议使用魔搭社区的实例,阿里云提供免费OCR服务。寻求简单OCR项目推荐。附EasyOCR安装和使用代码。
689 2
|
程序员 编译器 C语言
【c语言】c语言转义字符详解
【c语言】c语言转义字符详解
1609 1
|
6月前
|
人工智能 监控 前端开发
年终汇报新思路:领导真正关心的四个关键层面
年终汇报不是罗列工作,而是证明价值。领导关注的不是你多忙,而是你创造了什么、思考如何进化、是否与团队同频、未来能担多大责任。用结果替代过程,用逻辑替代数据堆砌,讲清你解决的关键问题、带来的业务影响及未来潜力,才能从“执行者”蜕变为“价值创造者”。
|
9月前
|
人工智能 搜索推荐 大数据
AI赋能销售管理:珍客CRM引领销售效能革新,解锁高效增长
在数字化浪潮下,以AI技术为核心,珍客CRM融合智能获客、跟进、客户管理与数据复盘,赋能企业实现销售全流程智能化升级,助力突破增长瓶颈,引领AI时代销售新变革。
|
机器学习/深度学习 算法 PyTorch
Pytorch-SGD算法解析
SGD(随机梯度下降)是机器学习中常用的优化算法,特别适用于大数据集和在线学习。与批量梯度下降不同,SGD每次仅使用一个样本来更新模型参数,提高了训练效率。本文介绍了SGD的基本步骤、Python实现及PyTorch中的应用示例。
1228 0
|
XML 监控 Java
异步日志:性能优化的金钥匙
本文主要介绍了Log4j2框架的核心原理、实践应用以及一些实用的小Tips,力图揭示Log4j2这一强大日志记录工具在现代分布式服务架构运维中的关键作用。
|
监控 Linux 数据处理
lslocks:Linux系统中的锁信息查看利器
`lslocks`是Linux工具,用于查看系统上的文件锁信息,帮助诊断进程同步问题。它显示持有锁的进程、锁类型(如POSIX、flock)和状态。通过简洁的输出,用户能识别死锁和资源争用,优化性能。结合其他命令如`grep`和`awk`可增强分析能力。需适当权限运行,定期监控以预防并发访问问题,处理死锁时要谨慎。
|
Ubuntu NoSQL Linux
Ubuntu 21.10 安装调试符号
Ubuntu 21.10 安装调试符号
1064 0