Reservation 系列导航
UNH-IOL Reservation 一致性测试用例【1】- Reservation Report 命令验证
UNH-IOL Reservation 一致性测试用例【2】- Reservation注册
UNH-IOL Reservation 一致性测试用例【3】- 取消注册
UNH-IOL Reservation 一致性测试用例【4】- Reservation Acquire 验证
UNH-IOL Reservation 一致性测试用例【5】- Reservation Release
UNH-IOL Reservation 一致性测试用例【6】- 抢占 Reservation
UNH-IOL Reservation 一致性测试用例【7】- 清除Reservation
UNH-IOL Reservation 一致性测试用例【8】- 在不同 Reservation Types 下的命令行为
UNH-IOL Reservation 一致性测试用例【9】- Reservation Notification Log Page(LID 0x80)
Test 7.6 – Preempting a Reservation (FYI, OF-FYI)
作为 registrant 的 host 可以通过执行 Reservation Acquire 命令,将 Reservation Acquire (RACQA) 字段设置为 001b (Preempt),并在 Current Reservation Key (CRKEY) 字段中提供与 host 相关的当前 reservation key,来抢占 reservation 和/或 registration。发生的抢占操作取决于 namespace 上的 reservation 类型(如果有)和命令中的 Preempt Reservation Key (PKEY) 字段的值。
如果 CRKEY 值不匹配,则命令会以 Reservation Conflict 状态中止。
没有 reservation 时的抢占情况将在取消注册测试中说明。
Case 1: Write Exclusive - All Registrants or Exclusive Access - All Registrants (FYI, OF-FYI) Dual Port Devices Only
如过存在的 reservation 类型是 Write Exclusive - All Registrants 或 Exclusive Access - All Registrants,则命令执行的操作取决于 PRKEY 字段的值,具体如下:
1. 如果 PRKEY 字段为 0,如下视为一个原子操作
1. 所有除了发命令的 host 以外的 registrants 都被取消注册
2. reservation 被 release
3. 为 host 创建一个新 reservation,类型由命令中的 Reservation Type (RTYPE) 字段指定。
2. 如果 PRKEY 非0,那么只有 reservation key 匹配上 PRKEY 的 registrant 会被取消注册
本测试要求 NVM subsystem 中至少有两个具有 shared namespace 的 Controller。
测试步骤
- 检查 Identify controller data structure(CNS 01) ONCS 字段确定 controller 是否支持 reservation;检查DUT当前是否为多个ports
- NVMe Host 1 向 Controller 1 发出 Set Features Host Identifier, 以便为该 Controller 注册一个 Host Identifier
- NVMe Host 2 向 Controller 2 发出 Set Features Host Identifier, 为该 Controller 注册一个不同于 Host 1 的 Host Identifier
- Host 1 发 Reservation Register 命令,Register Action (RREGA) 字段设为 000b (即. Register Reservation Key),在 New Reservation Key (NRKEY) 字段中向 namesapce 的 NVMe Controller 1 提供 reservation key,以使 host 成为该 shared namespace 的 registrant。
- Host 2 发 Reservation Register 命令,Register Action (RREGA) 字段设为 000b (即. Register Reservation Key),在 New Reservation Key (NRKEY) 字段中向 namesapce 的 NVMe Controller 2 提供 reservation key,以使 host 成为该 shared namespace 的 registrant。
- Host 1 发出 Reservation Acquire 命令,将 Reservation Acquire Action (RACQA) 字段设为 000b (Acquire),向 Current Reservation Key (CRKEY) 字段提供当前 Host 1 的 reservation key,并将 Reservation Type (RTYPE) 字段设为 Write Exclusive - All Registrants 或者 Exclusive Access - All Registrants,以便 host 1 在 namespace 获取该 reservation 类型的 reservation
- Host 2 发出 Reservation Acquire 命令,将 Reservation Acquire Action (RACQA) 字段设为 001b (Preempt),向 Current Reservation Key (CRKEY) 字段提供当前 Host 2 的 reservation key,并将 Preempt Reservation Key (PRKEY) 字段设为 0,以便 Controller 2 抢占 Host 1 的 reservation
- Host 2 发一个 Reservation Report 命令
- Host 2 发送一个 Reservation Release 命令,Reservation Release Action (RRELA) 字段设为 000b (i.e. Release),Reservation Type (RTYPE) 字段设为要释放的 reservation 类型,Current Reservation Key (CRKEY) 字段提供 Host 2 当前的 reservation key,来释放 Host 2 持有的 reservation
- Host 1 发 Reservation Register 命令,Register Action (RREGA) 字段设为 000b (即. Register Reservation Key),在 New Reservation Key (NRKEY) 字段中向 namesapce 的 NVMe Controller 1 提供 reservation key,以使 host 成为该 shared namespace 的 registrant。
- Host 1 发出 Reservation Acquire 命令,将 Reservation Acquire Action (RACQA) 字段设为 000b (Acquire),向 Current Reservation Key (CRKEY) 字段提供当前 Host 1 的 reservation key,并将 Reservation Type (RTYPE) 字段设为 Write Exclusive - All Registrants 或者 Exclusive Access - All Registrants,以便 host 1 在 namespace 获取该 reservation 类型的 reservation
- Host 2 发出 Reservation Acquire 命令,将 Reservation Acquire Action (RACQA) 字段设为 001b (Preempt),向 Current Reservation Key (CRKEY) 字段提供当前 Host 2 的 reservation key,并将 Preempt Reservation Key (PRKEY) 字段设为 Host 1 的 reservation key,以便 Controller 2 抢占 Host 1 的 reservation
- Host 2 发一个 Reservation Report 命令
- 对所有 Reservation Controllers 执行 Reservation Release 命令,将 RRELA 字段设为 1(Clear)
预期结果
- 在每个命令完成后,控制器向相关的 Completion Queue 发布一个 completion queue entry,表明该命令的状态
- 在第一个 Reservation Report 完成后,检查 Reservation Status data structure,Host 1 不再持有 reservation 并且 host 1 成功从 namespace 取消注册,Host 2 没有从 namespace 取消注册,host 2 获取了 Reservation Acquire 命令指定 reservation type 的 reservation
- 在第一个 Reservation Report 完成后,检查 Reservation Status data structure,Host 1 从 namespace 取消注册, Host 2 没有从 namespace 取消注册。
Case 2: Other Registration Types (FYI, OF-FYI) Dual Port Devices Only
如果现有 reservation type 不是 Write Exclusive - All Registrants,也不是 Exclusive Access - All Registrants(即 Write Exclusive, Exclusive Access, Write Exclusive - Registrants Only, or Exclusive Access - Registrants Only),则命令执行的操作取决于 PRKEY 的值,具体如下:
- 如果给 PRKEY 提供的 reservation key 是当前 reservation holder 的 reservation key,那么下面的视为原子操作:
- 取消注册 reservation holder
- 释放 reservation
- 将创建一个新的 reservation,其类型由命令中的 Reservation Type (RTYPE) 字段指定,host 为 reservation key holder。
- 如果 PRKEY 不匹配当前 reservation holder 且不为 0,那么 reservation key 能匹配上 PRKEY 的 registrant 会被取消注册。
- 如果 PRKEY 不匹配当前 reservation holder 且为 0,那么命令会被中止,返回状态 Invalid Field in Command
测试步骤
- 检查 Identify controller data structure(CNS 01) ONCS 字段确定 controller 是否支持 reservation;检查DUT当前是否为多个ports
- NVMe Host 1 向 Controller 1 发出 Set Features Host Identifier, 以便为该 Controller 注册一个 Host Identifier
- NVMe Host 2 向 Controller 2 发出 Set Features Host Identifier, 为该 Controller 注册一个不同于 Host 1 的 Host Identifier
- Host 1 发 Reservation Register 命令,Register Action (RREGA) 字段设为 000b (即. Register Reservation Key),在 New Reservation Key (NRKEY) 字段中向 namesapce 的 NVMe Controller 1 提供 reservation key,以使 host 成为该 shared namespace 的 registrant。
- Host 2 发 Reservation Register 命令,Register Action (RREGA) 字段设为 000b (即. Register Reservation Key),在 New Reservation Key (NRKEY) 字段中向 namesapce 的 NVMe Controller 2 提供 reservation key,以使 host 成为该 shared namespace 的 registrant。
- Host 1 发出 Reservation Acquire 命令,将 Reservation Acquire Action (RACQA) 字段设为 000b (Acquire),向 Current Reservation Key (CRKEY) 字段提供当前 Host 1 的 reservation key,并将 Reservation Type (RTYPE) 字段设为 namespace 支持的 Write Exclusive, Exclusive Access, Write Exclusive - Registrants Only, 或 Exclusive Access - Registrants Only,以便 host 1 在 namespace 获取该 reservation 类型的 reservation
- Host 2 发出 Reservation Acquire 命令,将 Reservation Acquire Action (RACQA) 字段设为 001b (Preempt),向 Current Reservation Key (CRKEY) 字段提供当前 Host 2 的 reservation key,将 Preempt Reservation Key (PRKEY) 字段设为要抢占的 Host 1 的 reservation key。
- Host 2 发一个 Reservation Report 命令
- Host 2 发送 Reservation Release 命令,将 Reservation Release Action (RRELA) 字段设为 000b (i.e. Release),Reservation Type (RTYPE) 设为要释放的 reservation 类型,向 Current Reservation Key (CRKEY) 字段提供当前 Host 2 的 reservation key
- Host 1 发 Reservation Register 命令,Register Action (RREGA) 字段设为 000b (即. Register Reservation Key),在 New Reservation Key (NRKEY) 字段中向 namesapce 的 NVMe Controller 1 提供 reservation key,以使 host 成为该 shared namespace 的 registrant。
- Host 1 发出 Reservation Acquire 命令,将 Reservation Acquire Action (RACQA) 字段设为 000b (Acquire),向 Current Reservation Key (CRKEY) 字段提供当前 Host 1 的 reservation key,并将 Reservation Type (RTYPE) 字段设为 namespace 支持的 Write Exclusive, Exclusive Access, Write Exclusive - Registrants Only, 或 Exclusive Access - Registrants Only,以便 host 1 在 namespace 获取该 reservation 类型的 reservation
- Host 2 发出 Reservation Acquire 命令,将 Reservation Acquire Action (RACQA) 字段设为 001b (Preempt),向 Current Reservation Key (CRKEY) 字段提供当前 Host 2 的 reservation key,将 Preempt Reservation Key (PRKEY) 字段设为既不是 Host 1 也不是 Host 2 的 reservation key。
- Host 2 发一个 Reservation Report 命令
- Host 1 发出 Reservation Acquire 命令,将 Reservation Acquire Action (RACQA) 字段设为 000b (Acquire),向 Current Reservation Key (CRKEY) 字段提供当前 Host 1 的 reservation key,并将 Reservation Type (RTYPE) 字段设为 namespace 支持的 Write Exclusive, Exclusive Access, Write Exclusive - Registrants Only, 或 Exclusive Access - Registrants Only,以便 host 1 在 namespace 获取该 reservation 类型的 reservation
- Host 2 发出 Reservation Acquire 命令,将 Reservation Acquire Action (RACQA) 字段设为 001b (Preempt),向 Current Reservation Key (CRKEY) 字段提供当前 Host 2 的 reservation key,将 Preempt Reservation Key (PRKEY) 字段设为0。
- Host 2 发一个 Reservation Report 命令
- 对所有 Reservation Controllers 执行 Reservation Release 命令,将 RRELA 字段设为 1(Clear)
预期结果
- 在每个命令完成后,控制器向相关的 Completion Queue 发布一个 completion queue entry,表明该命令的状态
- 在第一个 Reservation Report 完成后,检查 Reservation Status data structure,Host 1 不再持有 reservation 并且 host 1 成功从 namespace 取消注册,Host 2 没有从 namespace 取消注册,host 2 获取了 Reservation Acquire 命令指定 Preempt 的 reservation
- 在第二个 Reservation Report 完成后,检查 Reservation Status data structure,Host 1 和 Host 2 都是 registrant,Host 1 依然持有该 namespace 的 Reservation。
- 第三个Preempt Reservation Acquire 命令失败,返回状态 Invalid Field in Command
- 在第三个 Reservation Report 完成后,检查 Reservation Status data structure,Host 1 和 Host 2 都是 registrant,Host 1 依然持有该 namespace 的 Reservation。
Case 3: Self-preemption (FYI, OF-FYI) Dual Port Devices Only
reservation holder 可利用上述机制抢占自己的位置。当 Host 抢占自己的位置时,会发生以下原子操作:
- 保留 Host 的注册、
- 释放 Reservation,以及
- 为 Host 创建一个新的 Reservation,类型由 RTYPE 字段指定。
测试步骤
- 检查 Identify controller data structure(CNS 01) ONCS 字段确定 controller 是否支持 reservation,检查DUT当前是否为多个ports
- 针对 NVMe Subsystem 里的每个 NVMe Controller:
- NVMe Host 向 Controller 发出 Set Features Host Identifier, 以便为该 Controller 注册一个 Host Identifier
- 对于 atttach 到该 Controller 的每个 active namespace:
- Host 发 Reservation Register 命令,Register Action (RREGA) 字段设为 000b (即. Register Reservation Key),在 New Reservation Key (NRKEY) 字段中向 namesapce 的 NVMe Controller 提供 reservation key,以使 host 成为该 namespace 的 registrant。
- Host 发出 Reservation Acquire 命令,将 Reservation Acquire Action (RACQA) 字段设为 000b (Acquire),向 Current Reservation Key (CRKEY) 字段提供当前 Host 的 reservation key,并将 Reservation Type (RTYPE) 字段设为 namespace 支持的 Write Exclusive - All Registrants 或 Exclusive Access - All Registrants,以便 host 在 namespace 获取该 reservation 类型的 reservation
- Host 发出 Reservation Acquire 命令,将 Reservation Acquire Action (RACQA) 字段设为 001b (Preempt),向 Current Reservation Key (CRKEY) 字段提供当前 Host 的 reservation key,将 Preempt Reservation Key (PRKEY) 字段设为0。
- Host 发一个 Reservation Report 命令
- 对所有 Reservation Controllers 执行 Reservation Release 命令,将 RRELA 字段设为 1(Clear)
预期结果
- 在每个命令完成后,控制器向相关的 Completion Queue 发布一个 completion queue entry,表明该命令的状态
- 在 Reservation Report 完成后,检查 Reservation Status data structure,Host 没有从 namespace 取消注册,host 获取了 Reservation Acquire 命令指定 Preempt 的 reservation
Case 4: Preempt and Abort (FYI, OF-FYI) Dual Port Devices Only
Host 可通过执行 Reservation Acquire 命令并将 RACQA 字段设置为 010b(Preempt an Abort)来中止命令,作为抢占 reservation 的副作用。该命令的行为与上述 RACQA 字段设置为 001b(Preempt)时的行为完全相同,但与 Host 相关联的控制器会中止针对特定 namespace 的命令,因为 Host 的 reservation 或 registrant 已被抢占。与中止 Admin 命令一样,Abort 作为抢占 reservation 的副作用是尽力而为;要中止的命令可能已经完成、目前正在执行、或可能正在深入排队。
该测试要求 NVM Subsystem 中至少有两个具有 shared namespace 的控制器。
测试步骤
- 检查 Identify controller data structure(CNS 01) ONCS 字段确定 controller 是否支持 reservation;检查DUT当前是否为多个ports
- NVMe Host 1 向 Controller 1 发出 Set Features Host Identifier, 以便为该 Controller 注册一个 Host Identifier
- NVMe Host 2 向 Controller 2 发出 Set Features Host Identifier, 为该 Controller 注册一个不同于 Host 1 的 Host Identifier
- Host 1 发 Reservation Register 命令,Register Action (RREGA) 字段设为 000b (即. Register Reservation Key),在 New Reservation Key (NRKEY) 字段中向 namesapce 的 NVMe Controller 1 提供 reservation key,以使 host 成为该 shared namespace 的 registrant。
- Host 2 发 Reservation Register 命令,Register Action (RREGA) 字段设为 000b (即. Register Reservation Key),在 New Reservation Key (NRKEY) 字段中向 namesapce 的 NVMe Controller 2 提供 reservation key,以使 host 成为该 shared namespace 的 registrant。
- Host 1 发出 Reservation Acquire 命令,将 Reservation Acquire Action (RACQA) 字段设为 000b (Acquire),向 Current Reservation Key (CRKEY) 字段提供当前 Host 1 的 reservation key,并将 Reservation Type (RTYPE) 字段设为 namespace 支持的 reservation 类型,以便 host 1 在 namespace 获取该 reservation 类型的 reservation
- Host 1 发 10 笔 NVMe Read
- Host 2 发出 Reservation Acquire 命令,将 Reservation Acquire Action (RACQA) 字段设为 010b (Preempt and Abort),向 Current Reservation Key (CRKEY) 字段提供 Host 2 当前的 reservation key,将 Preempt Reservation Key (PRKEY) 字段设 为Host 1 当前的 reservation key,以便 Host 2 抢占 Host 1 的 reservation。
- Host 发一个 Reservation Report 命令
- 对所有 Reservation Controllers 执行 Reservation Release 命令,将 RRELA 字段设为 1(Clear)
预期结果
- 在每个命令完成后,控制器向相关的 Completion Queue 发布一个 completion queue entry,表明该命令的状态
- 确定 Host 1 发出的每条 NVMe 命令的状态。
- 在 Reservation Report 完成后,检查 Reservation Status data structure,根据 Host 1 获取的 reservation 采取适当措施
Case 5: Preempt Attempt when CRKEY does not Match (FYI, OF-FYI) Dual Port Devices Only
测试步骤
- 检查 Identify controller data structure(CNS 01) ONCS 字段确定 controller 是否支持 reservation;检查DUT当前是否为多个ports
- NVMe Host 1 向 Controller 1 发出 Set Features Host Identifier, 以便为该 Controller 注册一个 Host Identifier
- NVMe Host 2 向 Controller 2 发出 Set Features Host Identifier, 为该 Controller 注册一个不同于 Host 1 的 Host Identifier
- Host 1 发 Reservation Register 命令,Register Action (RREGA) 字段设为 000b (即. Register Reservation Key),在 New Reservation Key (NRKEY) 字段中向 namesapce 的 NVMe Controller 1 提供 reservation key,以使 host 成为该 shared namespace 的 registrant。
- Host 2 发 Reservation Register 命令,Register Action (RREGA) 字段设为 000b (即. Register Reservation Key),在 New Reservation Key (NRKEY) 字段中向 namesapce 的 NVMe Controller 2 提供 reservation key,以使 host 成为该 shared namespace 的 registrant。
- Host 1 发出 Reservation Acquire 命令,将 Reservation Acquire Action (RACQA) 字段设为 000b (Acquire),向 Current Reservation Key (CRKEY) 字段提供当前 Host 1 的 reservation key,并将 Reservation Type (RTYPE) 字段设为 namespace 支持的 Write Exclusive - All Registrants 或 Exclusive Access - All Registrants,以便 host 1 在 namespace 获取该 reservation 类型的 reservation
- Host 2 发出 Reservation Acquire 命令,将 Reservation Acquire Action (RACQA) 字段设为 001b (Preempt),向 Current Reservation Key (CRKEY) 字段提供当前 Host 2 的 reservation key,将 Preempt Reservation Key (PRKEY) 字段设为0。
- Host 2 发一个 Reservation Report 命令
- Host 2 发送 Reservation Release 命令,将 Reservation Release Action (RRELA) 字段设为 000b (i.e. Release),Reservation Type (RTYPE) 设为要释放的 reservation 类型,向 Current Reservation Key (CRKEY) 字段提供当前 Host 2 的 reservation key,以便于释放 Host 2 持有的 reservation
- Host 1 发 Reservation Register 命令,Register Action (RREGA) 字段设为 000b (即. Register Reservation Key),在 New Reservation Key (NRKEY) 字段中向 namesapce 的 NVMe Controller 1 提供 reservation key,以使 host 成为该 shared namespace 的 registrant。
- Host 1 发出 Reservation Acquire 命令,将 Reservation Acquire Action (RACQA) 字段设为 000b (Acquire),向 Current Reservation Key (CRKEY) 字段提供当前 Host 1 的 reservation key,并将 Reservation Type (RTYPE) 字段设为 namespace 支持的 Write Exclusive - All Registrants 或 Exclusive Access - All Registrants,以尝试 host 1 在 namespace 获取该 reservation 类型的 reservation
- Host 2 发出 Reservation Acquire 命令,将 Reservation Acquire Action (RACQA) 字段设为 001b (Preempt),向 Current Reservation Key (CRKEY) 字段提供一个不正确的 reservation key,将 Preempt Reservation Key (PRKEY) 字段设为 Host 1 的 reservation key,以尝试 Controller 2 抢占 Host 1 的 reservation。
- Host 2 发一个 Reservation Report 命令
- 对所有 Reservation Controllers 执行 Reservation Release 命令,将 RRELA 字段设为 1(Clear)
预期结果
step 12 的 Reservation Acquire 失败,返回状态 Reservation Conflict。
注意事项
目前尚未确定进行此项检测的可靠方法。因此,这项测试不应纳入任何行业批准的一致性认定中。