AER命令的发送和回收 - pynvme/pynvme GitHub Wiki
AER是NVMe规范里面一个比较特殊的命令。这类命令发出后不会立刻返回,而是一直埋伏着。当出现什么风吹草动,才返回状态给host,以通知host做某些处理。pynvme自带的nvme初始化过程会发出第一条AER命令。当AER命令被触发返回时,pynvme会抛出一条warning给脚本。一条AER被触发后,pynvme会自动补发一条AER命令。脚本可以控制AER命令发送的数量和时间,并定义回调函数。
def test_aer_with_multiple_sanitize(nvme0, nvme0n1, buf):
if nvme0.id_data(331, 328) == 0: #2
pytest.skip("sanitize operation is not supported")
logging.info("supported sanitize operation: %d" % nvme0.id_data(331, 328))
for i in range(3): #L7
nvme0.sanitize().waitdone() #L8
# check sanitize status in log page
with pytest.warns(UserWarning, match="AER notification is triggered"): #L11
nvme0.getlogpage(0x81, buf, 20).waitdone()
while buf.data(3, 2) & 0x7 != 1: #L13
time.sleep(1)
nvme0.getlogpage(0x81, buf, 20).waitdone()
progress = buf.data(1, 0)*100//0xffff
logging.info("%d%%" % progress)
- L2. 检查测试盘是否支持sanitize操作。如果不支持,跳过这个测试。
- L7. 重复测试sanitize操作3次,看每次是否都有AER被触发。
- L8. 发出一条sanitize命令并等待结束。
- L11. 在下面检测sanitize操作状态的时候,期望AER被触发。
- L13. 每秒检查一次sanitize操作的状态。
pynvme默认在NVMe初始化过程中发送第一条AER命令,是为了能让脚本捕获预期之外的AER返回。如果脚本预期有更多AER产生,那需要脚本来发送并回收足够的AER命令。 pynvme在捕获AER命令的CQE后,会自动补发一条AER命令。AER命令的CQE不会占用waitdone参数中指定的回收命令条数。下面的测试log能够看到上面脚本保持了足够的AER命令发送,让每次sanitize结束都可以触发AER命令。
cwd: /home/cranechu/pynvme/
cmd: sudo python3 -B -m pytest --color=yes --pciaddr=3d:00.0 'scripts/cookbook.py::test_aer_with_multiple_sanitize' -s
================================ test session starts =================================
platform linux -- Python 3.8.2, pytest-5.4.1, py-1.8.1, pluggy-0.13.1
rootdir: /home/cranechu/pynvme, inifile: pytest.ini
plugins: cov-2.8.1
collected 1 item
scripts/cookbook.py::test_aer_with_multiple_sanitize
----------------------------------- live log setup -----------------------------------
[2020-05-23 00:03:41.498] INFO script(65): setup random seed: 0xc5df8acc
----------------------------------- live log call ------------------------------------
[2020-05-23 00:03:41.519] INFO test_aer_with_multiple_sanitize(440): supported sanitize operation: 2
[2020-05-23 00:03:42.538] INFO test_aer_with_multiple_sanitize(452): 1%
[2020-05-23 00:03:43.539] INFO test_aer_with_multiple_sanitize(452): 3%
[2020-05-23 00:03:44.541] INFO test_aer_with_multiple_sanitize(452): 5%
[2020-05-23 00:03:45.542] INFO test_aer_with_multiple_sanitize(452): 7%
[2020-05-23 00:03:46.543] INFO test_aer_with_multiple_sanitize(452): 9%
[2020-05-23 00:03:47.544] WARNING test_aer_with_multiple_sanitize(450): AER triggered, dword0: 0x810106, status1: 0x1
[2020-05-23 00:03:47.545] INFO test_aer_with_multiple_sanitize(452): 100%
[2020-05-23 00:03:48.571] INFO test_aer_with_multiple_sanitize(452): 1%
[2020-05-23 00:03:49.572] INFO test_aer_with_multiple_sanitize(452): 3%
[2020-05-23 00:03:50.574] INFO test_aer_with_multiple_sanitize(452): 5%
[2020-05-23 00:03:51.576] INFO test_aer_with_multiple_sanitize(452): 7%
[2020-05-23 00:03:52.578] INFO test_aer_with_multiple_sanitize(452): 9%
[2020-05-23 00:03:53.580] WARNING test_aer_with_multiple_sanitize(450): AER triggered, dword0: 0x810106, status1: 0x1
[2020-05-23 00:03:53.580] INFO test_aer_with_multiple_sanitize(452): 100%
[2020-05-23 00:03:54.604] INFO test_aer_with_multiple_sanitize(452): 1%
[2020-05-23 00:03:55.606] INFO test_aer_with_multiple_sanitize(452): 3%
[2020-05-23 00:03:56.607] INFO test_aer_with_multiple_sanitize(452): 5%
[2020-05-23 00:03:57.609] INFO test_aer_with_multiple_sanitize(452): 7%
[2020-05-23 00:03:58.611] INFO test_aer_with_multiple_sanitize(452): 9%
[2020-05-23 00:03:59.613] WARNING test_aer_with_multiple_sanitize(450): AER triggered, dword0: 0x810106, status1: 0x1
[2020-05-23 00:03:59.613] INFO test_aer_with_multiple_sanitize(452): 100%
PASSED
--------------------------------- live log teardown ----------------------------------
[2020-05-23 00:03:59.615] INFO script(67): test duration: 18.117 sec
================================= 1 passed in 18.23s =================================