UNH-IOL Reservation 一致性测试用例【6】- 抢占 Reservation

12 篇文章 1 订阅

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。

测试步骤
  1. 检查 Identify controller data structure(CNS 01) ONCS 字段确定 controller 是否支持 reservation;检查DUT当前是否为多个ports
  2. NVMe Host 1 向 Controller 1 发出 Set Features Host Identifier, 以便为该 Controller 注册一个 Host Identifier
  3. NVMe Host 2 向 Controller 2 发出 Set Features Host Identifier, 为该 Controller 注册一个不同于 Host 1 的 Host Identifier
  4. 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。
  5. 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。
  6. 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
  7. 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
  8. Host 2 发一个 Reservation Report 命令
  9. 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
  10. 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。
  11. 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
  12. 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
  13. Host 2 发一个 Reservation Report 命令
  14. 对所有 Reservation Controllers 执行 Reservation Release 命令,将 RRELA 字段设为 1(Clear)
预期结果
  1. 在每个命令完成后,控制器向相关的 Completion Queue 发布一个 completion queue entry,表明该命令的状态
  2. 在第一个 Reservation Report 完成后,检查 Reservation Status data structure,Host 1 不再持有 reservation 并且 host 1 成功从 namespace 取消注册,Host 2 没有从 namespace 取消注册,host 2 获取了 Reservation Acquire 命令指定 reservation type 的 reservation
  3. 在第一个 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 的值,具体如下:

  1. 如果给 PRKEY 提供的 reservation key 是当前 reservation holder 的 reservation key,那么下面的视为原子操作:
    1. 取消注册 reservation holder
    2. 释放 reservation
    3. 将创建一个新的 reservation,其类型由命令中的 Reservation Type (RTYPE) 字段指定,host 为 reservation key holder。
  2. 如果 PRKEY 不匹配当前 reservation holder 且不为 0,那么 reservation key 能匹配上 PRKEY 的 registrant 会被取消注册。
  3. 如果 PRKEY 不匹配当前 reservation holder 且为 0,那么命令会被中止,返回状态 Invalid Field in Command
测试步骤
  1. 检查 Identify controller data structure(CNS 01) ONCS 字段确定 controller 是否支持 reservation;检查DUT当前是否为多个ports
  2. NVMe Host 1 向 Controller 1 发出 Set Features Host Identifier, 以便为该 Controller 注册一个 Host Identifier
  3. NVMe Host 2 向 Controller 2 发出 Set Features Host Identifier, 为该 Controller 注册一个不同于 Host 1 的 Host Identifier
  4. 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。
  5. 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。
  6. 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
  7. 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。
  8. Host 2 发一个 Reservation Report 命令
  9. Host 2 发送 Reservation Release 命令,将 Reservation Release Action (RRELA) 字段设为 000b (i.e. Release),Reservation Type (RTYPE) 设为要释放的 reservation 类型,向 Current Reservation Key (CRKEY) 字段提供当前 Host 2 的 reservation key
  10. 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。
  11. 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
  12. 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。
  13. Host 2 发一个 Reservation Report 命令
  14. 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
  15. Host 2 发出 Reservation Acquire 命令,将 Reservation Acquire Action (RACQA) 字段设为 001b (Preempt),向 Current Reservation Key (CRKEY) 字段提供当前 Host 2 的 reservation key,将 Preempt Reservation Key (PRKEY) 字段设为0。
  16. Host 2 发一个 Reservation Report 命令
  17. 对所有 Reservation Controllers 执行 Reservation Release 命令,将 RRELA 字段设为 1(Clear)
预期结果
  1. 在每个命令完成后,控制器向相关的 Completion Queue 发布一个 completion queue entry,表明该命令的状态
  2. 在第一个 Reservation Report 完成后,检查 Reservation Status data structure,Host 1 不再持有 reservation 并且 host 1 成功从 namespace 取消注册,Host 2 没有从 namespace 取消注册,host 2 获取了 Reservation Acquire 命令指定 Preempt 的 reservation
  3. 在第二个 Reservation Report 完成后,检查 Reservation Status data structure,Host 1 和 Host 2 都是 registrant,Host 1 依然持有该 namespace 的 Reservation。
  4. 第三个Preempt Reservation Acquire 命令失败,返回状态 Invalid Field in Command
  5. 在第三个 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 抢占自己的位置时,会发生以下原子操作:

  1. 保留 Host 的注册、
  2. 释放 Reservation,以及
  3. 为 Host 创建一个新的 Reservation,类型由 RTYPE 字段指定。
测试步骤
  1. 检查 Identify controller data structure(CNS 01) ONCS 字段确定 controller 是否支持 reservation,检查DUT当前是否为多个ports
  2. 针对 NVMe Subsystem 里的每个 NVMe Controller:
    1. NVMe Host 向 Controller 发出 Set Features Host Identifier, 以便为该 Controller 注册一个 Host Identifier
    2. 对于 atttach 到该 Controller 的每个 active namespace:
      1. Host 发 Reservation Register 命令,Register Action (RREGA) 字段设为 000b (即. Register Reservation Key),在 New Reservation Key (NRKEY) 字段中向 namesapce 的 NVMe Controller 提供 reservation key,以使 host 成为该 namespace 的 registrant。
      2. 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
      3. Host 发出 Reservation Acquire 命令,将 Reservation Acquire Action (RACQA) 字段设为 001b (Preempt),向 Current Reservation Key (CRKEY) 字段提供当前 Host 的 reservation key,将 Preempt Reservation Key (PRKEY) 字段设为0。
      4. Host 发一个 Reservation Report 命令
  3. 对所有 Reservation Controllers 执行 Reservation Release 命令,将 RRELA 字段设为 1(Clear)
预期结果
  1. 在每个命令完成后,控制器向相关的 Completion Queue 发布一个 completion queue entry,表明该命令的状态
  2. 在 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 的控制器。

测试步骤
  1. 检查 Identify controller data structure(CNS 01) ONCS 字段确定 controller 是否支持 reservation;检查DUT当前是否为多个ports
  2. NVMe Host 1 向 Controller 1 发出 Set Features Host Identifier, 以便为该 Controller 注册一个 Host Identifier
  3. NVMe Host 2 向 Controller 2 发出 Set Features Host Identifier, 为该 Controller 注册一个不同于 Host 1 的 Host Identifier
  4. 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。
  5. 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。
  6. 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
  7. Host 1 发 10 笔 NVMe Read
  8. 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。
  9. Host 发一个 Reservation Report 命令
  10. 对所有 Reservation Controllers 执行 Reservation Release 命令,将 RRELA 字段设为 1(Clear)
预期结果
  1. 在每个命令完成后,控制器向相关的 Completion Queue 发布一个 completion queue entry,表明该命令的状态
  2. 确定 Host 1 发出的每条 NVMe 命令的状态。
  3. 在 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

测试步骤
  1. 检查 Identify controller data structure(CNS 01) ONCS 字段确定 controller 是否支持 reservation;检查DUT当前是否为多个ports
  2. NVMe Host 1 向 Controller 1 发出 Set Features Host Identifier, 以便为该 Controller 注册一个 Host Identifier
  3. NVMe Host 2 向 Controller 2 发出 Set Features Host Identifier, 为该 Controller 注册一个不同于 Host 1 的 Host Identifier
  4. 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。
  5. 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。
  6. 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
  7. Host 2 发出 Reservation Acquire 命令,将 Reservation Acquire Action (RACQA) 字段设为 001b (Preempt),向 Current Reservation Key (CRKEY) 字段提供当前 Host 2 的 reservation key,将 Preempt Reservation Key (PRKEY) 字段设为0。
  8. Host 2 发一个 Reservation Report 命令
  9. 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
  10. 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。
  11. 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
  12. 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。
  13. Host 2 发一个 Reservation Report 命令
  14. 对所有 Reservation Controllers 执行 Reservation Release 命令,将 RRELA 字段设为 1(Clear)
预期结果

step 12 的 Reservation Acquire 失败,返回状态 Reservation Conflict。

注意事项

目前尚未确定进行此项检测的可靠方法。因此,这项测试不应纳入任何行业批准的一致性认定中。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值