UNH-IOL Reservation 一致性测试用例【4】- Reservation Acquire 验证

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

Test 7.4 – Acquiring a Reservation (M, OF-FYI)

Host 必须是 namespace 的 registrant,才能获得 namespace 的 reservation。registrant 通过执行 Reservation Acquire 命令,将 Reservation Acquire Action (RACQA) 字段设置为000b (Acquire),并向Current Reservation Key (CRKEY) 字段提供与 Host 相关的当前 reservation key,来获取 reservation。

Reservation Acquire 命令使用 CDW 10 和内存中的 Reservation Acquire data structure。如果命令使用 PRPs 传输数据,PRP Entry 1 和 PRP Entry 2 字段应被使用。如果命令使用 SGLs 传输数据,那么 SGL Entry 1 字段应被使用。其他特定字段是 reserved。

Case 1: Basic Operation (M, OF-FYI)

测试步骤

  1. 检查 Identify controller data structure(CNS 01) ONCS 字段确定 controller 是否支持 reservation
  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. NVMe Host 发送一个 Identify CNS 00h 命令,获取该namespace 的 Identify Namespace data structure
      3. 根据 Identify Namespace data structure 的 RESCAP 字段来确定 namespace 支持的每种 reservation 类型,对于这些 reservation 类型:
        1. Host 发出 Reservation Acquire 命令,将 Reservation Acquire Action (RACQA) 字段设为 000b (Acquire),向 Current Reservation Key (CRKEY) 字段提供当前的 reservation key,并将 Reservation Type (RTYPE) 字段设为 指定的 reservation type,以便 host 在 namespace 获取该 reservation 类型的 reservation
        2. Host 发一个 Reservation Report 命令
        3. Host 发送一个 Reservation Release 命令,将 Reservation Release Action (RRELA) 设置为 000b (即 Release),Reservation Type (RTYPE) 设置为要释放的 reservation 类型,Current Reservation Key (CRKEY) 填上当前的 reservation key,以便释放 Host 持有的 reservation。
  3. 对所有 Reservation Controllers 执行 Reservation Release 命令,将 RRELA 字段设为 1(Clear)

预期结果

  1. 在每个命令完成后,控制器向相关的 Completion Queue 发布一个 completion queue entry,表明该命令的状态
  2. 在 Reservation Report 完成后,检查 Reservation Status data structure, host 已经成功获取到该 reservation 类型的 reservation

注意事项

在支持NVMe 2.0 或以上的版本的 driver 中,当要设置 Host Identifier 时,如果它在测试开始时是非零值,set feature 将被 abort,Status Code 为 Command Sequence Error

Case 2: Error Conditions (M, OF-FYI)

如果 CRKEY 值与 registrant 在 namespace 注册时使用的 CRKEY 值不匹配,或者 Host 不是 registrant,则应中止命令, 返回 Registration Conflict 状态。Host 可通过将命令中的 Ignore Existing Key (IEKEY) 位设置为 "1",在不考虑其当前 reservation key 值的情况下获取 reservation。

如果 reservation holder 试图在其已是 reservation holder 的 namespace 上获取不同类型的 reservation,则应中止命令, 返回 Registration Conflict 状态。

如果 reservation holder 如果试图在其已是 reservation holder 的 namespace 中获取相同类型的 reservation,则不会出错。

测试步骤

  1. 检查 Identify controller data structure(CNS 01) ONCS 字段确定 controller 是否支持 reservation
  2. 针对 NVMe Subsystem 里的每个 NVMe Controller:
    1. NVMe Host 向 Controller 发出 Set Features Host Identifier, 以便为该 Controller 注册一个 Host Identifier
    2. 对于 atttach 到该 Controller 的每个 active namespace:
      1. RES_ACQ1: Host to 发送一个 Reservation Acquire 命令,Reservation Acquire Action (RACQA) 设为 000b (Acquire),Current Reservation Key (CRKEY) 设为一个随机的 reservation key,Reservation Type (RTYPE) 设为 namespace 支持的 reservation 类型。
      2. RES_REP1: Host 发一个 Reservation Report 命令
      3. Host 发 Reservation Register 命令,Register Action (RREGA) 字段设为 000b (即. Register Reservation Key),在 New Reservation Key (NRKEY) 字段中向 namesapce 的 NVMe Controller 提供 reservation key,以使 host 成为该 namespace 的 registrant。
      4. RES_ACQ2: Host 发送一个 Reservation Acquire, 设定 RACQA,CRKEY 提供不是当前的 reservation key,并将 Reservation Type (RTYPE) 字段设为支持的 reservation type
      5. RES_REP2: Host 发一个 Reservation Report 命令
      6. RES_ACQ3: Host 发送一个 Reservation Acquire, 设定 RACQA,IEKEY 为 1,并将 Reservation Type (RTYPE) 字段设为支持的 reservation type
      7. RES_REP3: Host 发一个 Reservation Report 命令
      8. RES_ACQ4: Host 发送一个 Reservation Acquire, 设定 RACQA,CRKEY 提供当前的 reservation key,并将 Reservation Type (RTYPE) 字段设为支持且不同于前边设定的 reservation type
      9. RES_REP4: Host 发一个 Reservation Report 命令
      10. RES_ACQ5: Host 发送一个 Reservation Acquire, 设定 RACQA,CRKEY 提供当前的 reservation key,并将 Reservation Type (RTYPE) 字段设为支持且与相同前边设定相同的 reservation type
      11. RES_REP5: Host 发一个 Reservation Report 命令
  3. 对所有 Reservation Controllers 执行 Reservation Release 命令,将 RRELA 字段设为 1(Clear)

预期结果

  1. 在每个命令完成后,控制器向相关的 Completion Queue 发布一个 completion queue entry,表明该命令的状态
  2. RES_ACQ1 命令返回状态 Reservation Conflict
  3. RES_REP1 返回的 Reservation Status data structure 表明host 没有持有 任何 reservations.
  4. RES_ACQ2 命令返回状态 Reservation Conflict
  5. RES_REP2 返回的 Reservation Status data structure 表明host 没有持有 任何 reservations.
  6. RES_ACQ3 命令返回 status “Invalid Field in Command”
  7. RES_REP3 返回的 Reservation Status data structure 表明host 没有持有 任何 reservations.
  8. RES_ACQ4 命令返回状态 Reservation Conflict
  9. RES_REP4 返回的 Reservation Status data structure 表明host 持有相同 reservation type 的 reservation
  10. RES_REP5 返回的 Reservation Status data structure 表明host 持有相同 reservation type 的 reservation

注意事项

在支持NVMe 2.0 或以上的版本的 driver 中,当要设置 Host Identifier 时,如果它在测试开始时是非零值,set feature 将被 abort,Status Code 为 Command Sequence Error


Case 3: Multiple Hosts (FYI, OF-FYI) Dual Port Devices Only

一个 namespace 一次只允许有一个 reservation。如果 registrant 试图在已经有 reservation holder 的 namespace 上获取 reservation,则命令被中止, 返回状态 Reservation Conflict。

该测试要求 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) 字段设为 namespace 支持的 reservation type,以便 host 1 在 namespace 获取该 reservation 类型的 reservation
  7. Host 2 发出 Reservation Acquire 命令,将 Reservation Acquire Action (RACQA) 字段设为 000b (Acquire),向 Current Reservation Key (CRKEY) 字段提供当前 Host 2 的 reservation key,并将 Reservation Type (RTYPE) 字段设为 namespace 支持的 reservation type,以便 host 2 在 namespace 获取该 reservation 类型的 reservation
  8. Host 2 发一个 Reservation Report 命令
  9. 对所有 Reservation Controllers 执行 Reservation Release 命令,将 RRELA 字段设为 1(Clear)

预期结果

  1. 在每个命令完成后,控制器向相关的 Completion Queue 发布一个 completion queue entry,表明该命令的状态
  2. Host 2 发出的 Reservation Acquire 命令失败,返回状态 Reservation Conflict
  3. 在 Reservation Report 完成后,检查 Reservation Status data structure, Host 1 持有了该 namespace 的 reservation, Host 2 没有

你可能感兴趣的:(ssd,#,NVMe,汽车,ssd,NVMe)