def test_zns_transition_next_zone(nvme0, nvme0n1, qpair, buf, zone_size, num_of_zones, repeat): zone_index = int(random.randrange(num_of_zones)) if zone_index == num_of_zones - 1: next_index = zone_index zone_index = zone_index - 1 else: next_index = (zone_index + 1) % num_of_zones slba = zone_size * zone_index next_slba = next_index*zone_size logging.info("Fill Zone 0x%x, zslba: 0x%x" % (zone_index, slba)) logging.info("Next Zone 0x%x, zslba: 0x%x" % (next_index, next_slba)) zone = Zone(qpair, nvme0n1, slba) zone.reset() next_zone = Zone(qpair, nvme0n1, next_slba) next_zone.reset() if (zone.capacity < zone_size): nvme0n1.ioworker(io_size=8, lba_random=False, read_percentage=0, \ region_start=slba, region_end=slba+zone.capacity).start().close() nvme0n1.ioworker(io_size=8, lba_random=False, read_percentage=0, \ region_start=next_slba, region_end=next_slba+128).start().close() else: nvme0n1.ioworker(io_size=8, lba_random=False, read_percentage=0, \ region_start=slba, region_end=slba+zone.capacity+128).start().close() assert zone.state == 'Full' assert next_zone.state == 'Implicitly Opened' test_zns_management_receive(nvme0, nvme0n1, qpair, buf, zone_size, num_of_zones)
def test_reset_all_zones(nvme0, nvme0n1, qpair, buf, zone_size, num_of_zones, zns_size): for slba in range(0, zns_size, zone_size): logging.info("Reset zone @zslba: 0x%x" % slba) zone = Zone(qpair, nvme0n1, slba) zone.reset() test_zns_management_receive(nvme0, nvme0n1, qpair, buf, zone_size, num_of_zones)
def test_zns_write_full_zone(nvme0, nvme0n1, qpair, slba=0): buf = Buffer(96*1024) z0 = Zone(qpair, nvme0n1, slba) #with pytest.warns(UserWarning, match="ERROR status: 01/"): z0.write(qpair, buf, 0, 16).waitdone() z0.reset() z0.finish() assert z0.state == 'Full'
def zone(nvme0, nvme0n1, qpair, buf, num_of_zones, zone_size): slba = zone_size*int(random.randrange(num_of_zones)) logging.debug("slba:0x%x" % slba ) ret = Zone(qpair, nvme0n1, slba) ret.reset() ret.open() assert ret.state == 'Explicitly Opened' assert ret.wpointer == ret.slba return ret
def test_zns_ioworker(nvme0, nvme0n1, qpair, buf, zone_size, num_of_zones): slba = zone_size*int(random.randrange(num_of_zones)) logging.info("Test zslba: 0x%x" % slba) zone = Zone(qpair, nvme0n1, slba) zone.reset() nvme0n1.ioworker(io_size=8, lba_random=False, read_percentage=0, \ region_start=slba, region_end=slba+zone.capacity).start().close() assert zone.state == 'Full' test_zns_management_receive(nvme0, nvme0n1, qpair, buf, zone_size, num_of_zones)
def test_zns_write_a_closed_zone(nvme0, nvme0n1, qpair, zone, buf, zone_size, num_of_zones): slba = zone_size*int(random.randrange(num_of_zones)) logging.info("Test zslba: 0x%x" % slba) zone = Zone(qpair, nvme0n1, slba) zone.reset() zone.write(qpair, buf, 0, 16).waitdone() zone.close() with pytest.warns(UserWarning, match="ERROR status: 01/bc"): zone.write(qpair, buf, 0x0, 8).waitdone() test_zns_management_receive(nvme0, nvme0n1, qpair, buf, zone_size, num_of_zones)
def test_zns_fill_a_zone(nvme0, nvme0n1, qpair, buf, zone_size, num_of_zones): slba = zone_size*int(random.randrange(num_of_zones)) logging.info("Test zslba: 0x%x" % slba) zone = Zone(qpair, nvme0n1, slba) zone.reset() #for lba in range(slba, slba+zone_size, 8): # nvme0n1.write(qpair, buf, lba, 8).waitdone() for lba in range(0, zone.capacity, 16): zone.write(qpair, buf, lba, 16).waitdone() assert zone.state == 'Full' test_zns_management_receive(nvme0, nvme0n1, qpair, buf, zone_size, num_of_zones)
def test_zns_state_machine_all(nvme0, nvme0n1, qpair, buf, zslba_list): for slba in zslba_list: z0 = Zone(qpair, nvme0n1, slba) logging.info("zslba:0x%x" % slba) z0.reset() assert z0.state == 'Empty' z0.open() assert z0.state == 'Explicitly Opened' z0.close() assert z0.state == 'Closed' z0.open() assert z0.state == 'Explicitly Opened' z0.close() assert z0.state == 'Closed' z0.finish() assert z0.state == 'Full' z0.reset() assert z0.state == 'Empty' z0.open() assert z0.state == 'Explicitly Opened' z0.reset() assert z0.state == 'Empty' z0.open() assert z0.state == 'Explicitly Opened' z0.close() assert z0.state == 'Closed' z0.reset() assert z0.state == 'Empty' z0.finish() assert z0.state == 'Full' z0.reset()
def test_max_open_zone(nvme0, nvme0n1, qpair, buf, zone_size, num_of_zones, zslba_list): nvme0.identify(buf, nsid=1, cns=5, csi=2).waitdone() mor = buf.data(11, 8) logging.info("Maximum Open Resources (MAR): 0x%x" % mor) if (mor == 0xffffffff): pytest.skip("No Max open zone limit") else: assert mor < num_of_zones for zone_index, slba in enumerate(zslba_list): z0 = Zone(qpair, nvme0n1, slba) z0.reset() if zone_index <= mor: z0.open() logging.info("open zone: %d" % zone_index) else: logging.info("Try to open extra zone: %d" % zone_index) with pytest.warns(UserWarning, match="ERROR status: 01/be"): z0.open() break test_zns_management_receive(nvme0, nvme0n1, qpair, buf, zone_size, num_of_zones)
def test_zns_write_implicitly_open(nvme0, nvme0n1, qpair, slba, repeat): buf = Buffer(96*1024) z0 = Zone(qpair, nvme0n1, slba) #assert z0.state == 'Full' z0.reset() assert z0.state == 'Empty' assert z0.wpointer == slba z0.write(qpair, buf, 0, 16).waitdone() time.sleep(1) logging.info("Write pointer:0x%x" % z0.wpointer) assert z0.state == 'Implicitly Opened' assert z0.wpointer == slba+16 z0.close() #logging.info(z0) assert z0.state == 'Closed' assert z0.wpointer == slba+0x10 z0.finish() logging.info(z0) assert z0.state == 'Full' assert z0.wpointer == slba+0x10
def test_zns_state_machine(nvme0, nvme0n1, qpair, buf, slba): z0 = Zone(qpair, nvme0n1, slba) z0.reset() assert z0.state == 'Empty' z0.open() assert z0.state == 'Explicitly Opened' z0.close() assert z0.state == 'Closed' z0.open() assert z0.state == 'Explicitly Opened' z0.close() assert z0.state == 'Closed' z0.finish() assert z0.state == 'Full' z0.reset() assert z0.state == 'Empty' z0.open() assert z0.state == 'Explicitly Opened' z0.reset() assert z0.state == 'Empty' z0.open() assert z0.state == 'Explicitly Opened' z0.close() assert z0.state == 'Closed' z0.finish() assert z0.state == 'Full' z0.reset() assert z0.state == 'Empty'