一种SSD固件前端队列注入的异步校验方法与流程

摘要: 本发明涉及固态硬盘固件测试,特别是一种ssd固件前端队列注入的异步校验方法。背景技术:1、随着nvmessd向多提交队列、多完成队列和高队列深度方向发展,固件测...
一种SSD固件前端队列注入的异步校验方法与流程

本发明涉及固态硬盘固件测试,特别是一种ssd固件前端队列注入的异步校验方法。

背景技术:

1、随着nvme ssd向多提交队列、多完成队列和高队列深度方向发展,固件测试平台通常通过主机提交队列、门铃寄存器和完成队列向被测ssd固件注入读写命令或管理命令。测试平台在命令提交前建立测试上下文,记录命令标识、逻辑地址、数据图样、数据版本和队列信息,并在完成队列项返回后依据命令标识取回对应测试上下文,以校验写入数据、读取数据和命令完成状态。

2、对于支持flexible data placement的ssd,写命令可以携带放置标识,固件根据该放置标识关联的reclaim unit handle确定数据对应的放置状态。现有测试流程通常在写命令提交时读取放置标识对应的ruh状态,将该状态与逻辑地址、数据图样和命令标识共同保存;在写命令完成后,再结合完成状态、读取数据、ruh状态快照或fdp事件判断该写命令是否落入预期放置状态。部分测试流程还会在ruh更新前后分别读取状态,或者在ruh更新期间暂停同一放置标识的后续写命令,以降低状态切换对校验结果的影响。

3、但是,在多个提交队列并行且队列深度较高时,主机侧写入命令并触发提交的时刻,与固件前端路径抓取命令、解析放置标识并读取ruh关联状态的时刻之间存在间隔。ruhupdate、隐式ruh切换或控制器状态重建发生在该间隔内时,同一放置标识在命令提交阶段和固件实际放置决策阶段可能对应不同ruh关联状态。若测试平台以提交阶段读取的ruh状态作为该命令的校验依据,固件在切换后的ruh状态下处理该命令时容易产生误判;若测试平台仅依据最终ruh快照、写入数据或逻辑地址进行校验,固件因缓存、跨核消息传递或状态同步延迟而继续采用切换前ruh关联状态的情形又难以被识别。

4、此外,完成队列项可能乱序返回,命令标识在复位、超时处理或队列资源回收后还可能再次使用。仅依靠命令标识以及ruh更新前后的两个状态快照,难以确认某一具体命令实际消费的是切换前还是切换后的放置状态。迟到完成项或陈旧放置状态记录还可能被关联到复用后的命令上下文,造成错误上下文绑定。若测试结束时仅统计已完成命令数量,而未确认历史放置状态已无在途命令引用,则仍可能残留未归属的放置事件和未闭合的校验上下文。因此亟需一种ssd固件前端队列注入的异步校验方法来解决此类问题。

技术实现思路

1、本发明实施例提供了一种ssd固件前端队列注入的异步校验方法,解决fdp并发切换下命令放置代次难追溯导致异步校验失真的问题。

2、本发明实施例提供了一种ssd固件前端队列注入的异步校验方法,用于对支持fdp的ssd固件进行软件测试,包括:

3、将写测试请求转换为关联提交队列标识并携带命令标识、逻辑地址和放置标识的写主机命令;

4、提交前为该写主机命令分配命令代次,建立包含数据期望状态和未绑定放置代次字段的命令上下文,并建立以提交队列标识和命令标识索引的命令代次关联表;

5、通过前端队列通知使该写主机命令进入真实前端处理路径;

6、当该写主机命令读取放置标识对应的ruh关联状态并形成数据放置状态时,状态所有者基于同一局部放置快照生成放置状态记录供测试侧经只读观察接口读取,按命令代次关联表取得命令代次,并将放置代次和放置状态标识一次性写入命令上下文;

7、当状态所有者确认该放置标识对应的ruh关联状态变化时生成新的放置代次;

8、接收异步完成信息后,以其中的提交队列标识和命令标识查询命令代次关联表定位命令上下文,校验数据结果和数据放置状态;

9、被引用的历史放置代次在引用解除前保持有效,在命令上下文及历史放置代次完成回收后生成测试结果。

10、在一些实施例中,将写测试请求转换为写主机命令包括:按照被测ssd固件的数据处理边界对写测试请求的逻辑地址范围进行规范化;

11、当一个写测试请求跨越两个以上逻辑处理单元时,将所述写测试请求拆分为多个子命令;为各子命令分别记录提交队列标识、命令标识、逻辑处理单元地址、单元内有效数据范围和数据版本,并将每一子命令作为独立异步校验对象建立命令上下文。

12、在一些实施例中,所述数据期望状态包括待写版本、已生效版本、逻辑地址信息和有效数据范围信息;针对部分覆盖逻辑处理单元的写命令,在写命令完成成功后,将被所述有效数据范围覆盖的数据单元的待写版本提交为已生效版本,并保持未被覆盖的数据单元的已生效版本;

13、当写命令完成失败、超时或者取消时,待写版本不提交为已生效版本;在包括读命令的测试中,读命令不执行放置代次绑定,并在异步完成后对有效数据范围内的数据单元进行已生效版本校验和逻辑地址校验。

14、在一些实施例中,所述命令上下文具有待写入、已发布、已提交、完成处理中和已释放状态;在所述待写入状态下写入提交队列标识、命令标识、命令代次、逻辑地址、数据期望状态、放置标识及未绑定放置代次字段;

15、在字段写入完成后转换为已发布状态;在完成前端队列通知后转换为已提交状态;在异步完成处理开始后转换为完成处理中状态;在完成数据结果和数据放置状态校验后转换为已释放状态。

16、在一些实施例中,异步完成处理仅读取与提交队列标识、命令标识和命令代次共同对应且处于已提交状态或完成处理中状态的命令上下文;

17、当异步完成信息对应的命令上下文处于待写入状态、已发布状态、已释放状态或者不存在对应命令代次时,将所述异步完成信息写入异常状态,并记录对应的状态原因;所述异常状态中的异步完成信息不参与正常校验结论生成。

18、在一些实施例中,所述一次性写入包括:仅在所述命令上下文的放置代次字段处于未绑定状态时,接受来自状态所有者的放置快照绑定请求;

19、将放置状态标识和放置代次作为命令级放置快照写入命令上下文,并以绑定有效标志作为完成发布点;

20、完成处理侧仅在所述绑定有效标志处于生效状态时读取所述命令级放置快照;当同一命令上下文再次发生放置快照绑定请求、接收到与当前命令代次不一致的放置快照绑定请求或者在已释放状态下接收到放置快照绑定请求时,保持已写入的命令级放置快照,并写入异常状态且记录对应的状态原因。

21、在一些实施例中,所述状态所有者为被测ssd固件执行环境中维护放置标识与ruh关联状态的fdp状态管理对象;所述只读观察接口暴露观察环形缓冲区的读取视图,并且不设置ruh映射表写入口、ruh关联状态修改入口和放置代次分配入口;

22、所述放置状态记录包括观察序号、提交队列标识、命令标识、命令代次、放置标识、放置代次、放置状态标识、状态时间戳和提交标志;所述观察序号由状态所有者串行或原子递增分配;状态所有者在写完放置状态记录字段后发布提交标志,测试侧在确认提交标志生效、观察序号一致且符合下一待消费观察序号时消费槽位内容,并更新下一待消费观察序号。

23、在一些实施例中,生成新的放置代次包括:状态所有者为每一个放置标识维护当前ruh关联状态描述项和历史ruh关联状态描述项,所述描述项包括放置标识、ruh关联状态内容、放置代次、状态生效标记和引用计数;

24、状态所有者将ruh更新命令、ruh隐式切换事件和导致ruh关联状态重新建立的控制器状态重建事件转换为针对同一放置标识的ruh关联状态变更请求,并按到达顺序串行处理;

25、当目标ruh关联状态内容与当前ruh关联状态内容不一致时,为变化后的ruh关联状态建立新的ruh关联状态描述项,并使新的放置代次基于当前仍处于生效状态的放置代次集合、尚未完成回收的历史放置代次集合和代次起始基准值中的最大值递增生成。

26、在一些实施例中,新的放置代次生成后,状态所有者将变化前的ruh关联状态描述项从当前状态转为历史保留状态,并将变化后的ruh关联状态描述项设置为当前状态;

27、命令上下文完成命令级放置快照发布时,状态所有者增加对应放置代次的命令上下文引用计数,命令上下文转为已释放状态时减少所述命令上下文引用计数;

28、放置状态记录发布时增加对应放置代次的放置状态记录引用计数,所述放置状态记录被测试侧消费、写入异常状态或者被后续观察序号对应的记录覆盖时减少所述放置状态记录引用计数;

29、未闭合引用总数由命令上下文引用计数和放置状态记录引用计数合计得到,状态所有者仅在所述未闭合引用总数为零时回收对应的历史ruh关联状态描述项。

30、在一些实施例中,测试侧建立用于保存本次测试异常的粘性失败状态;

31、当发生控制器复位、命令超时、命令取消或前端队列重建时,将变化前使用的命令代次或者队列代次标记为失效代次;

32、测试侧将测试过程中进入异常状态的对象同步写入粘性失败状态;测试脚本停止产生新的测试请求后执行联合排空;

33、在命令上下文均结束当前生命周期、只读观察接口中已发布的放置状态记录均完成消费、历史放置代次均不存在未闭合引用且粘性失败状态未记录异常时生成测试通过结果,否则生成测试失败结果。

34、本发明通过上述技术方案,至少可以实现如下有益效果:

35、本发明命令上下文在主机命令提交前仅保存命令代次和未绑定放置代次字段,主机命令进入真实前端处理路径后,在读取放置标识对应的ruh关联状态并形成数据放置状态时,由状态所有者基于同一局部放置快照写入放置代次和放置状态标识。命令的放置归属以固件实际消费ruh关联状态的时点为准,能够区分提交阶段状态、实际放置决策阶段状态和完成返回阶段状态,减少ruh切换与在途写命令交叠导致的放置状态误判。

36、状态所有者同时向命令上下文写入命令级放置快照,并通过只读观察接口输出同源的放置状态记录。测试侧读取观察记录时,仅比对命令上下文和观察记录副本,不写入ruh映射表,不修改ruh关联状态,不参与放置代次分配。测试侧获得的放置状态证据与固件放置决策来源一致,能够在保留真实固件前端处理路径的同时,确定同一命令实际采用的放置状态。

37、命令上下文采用提交队列标识、命令标识和命令代次共同定位,放置状态记录也携带提交队列标识和命令代次。发生控制器复位、命令超时、命令取消或前端队列重建后,失效代次下的异步完成信息与后续复用相同命令标识的新命令上下文分离处理。乱序完成、迟到完成和命令标识复用条件下,旧命令的完成信息及放置状态记录能够与新命令上下文隔离,降低错误上下文再次绑定的概率。

38、ruh关联状态发生变化时,状态所有者为变化后的ruh关联状态生成新的放置代次,并将变化前的ruh关联状态描述项保留至未闭合引用总数归零。已经写入旧放置代次的在途命令继续归属旧放置状态,尚未写入放置代次的在途命令按照后续实际读取的ruh关联状态确定归属。因此,测试结束阶段能够同时闭合命令上下文、放置状态记录和历史放置代次引用,减少仅统计命令完成数量时残留未归属放置事件的情况。